Completed
Branch BUG-11108-ticket-reserved-coun... (144d27)
by
unknown
14:21 queued 17s
created
admin_pages/messages/Messages_Admin_Page.core.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -2597,7 +2597,7 @@  discard block
 block discarded – undo
2597 2597
      *
2598 2598
      * @param int $index This helps us know which template field to select from the request array.
2599 2599
      *
2600
-     * @return array
2600
+     * @return string
2601 2601
      */
2602 2602
     protected function _set_message_template_column_values($index)
2603 2603
     {
@@ -3088,7 +3088,7 @@  discard block
 block discarded – undo
3088 3088
      *
3089 3089
      * @param  int  $GRP_ID        The group being deleted
3090 3090
      * @param  bool $include_group whether to delete the Message Template Group as well.
3091
-     * @return bool boolean to indicate the success of the deletes or not.
3091
+     * @return integer boolean to indicate the success of the deletes or not.
3092 3092
      * @throws EE_Error
3093 3093
      * @throws InvalidArgumentException
3094 3094
      * @throws InvalidDataTypeException
Please login to merge, or discard this patch.
Spacing   +117 added lines, -117 removed lines patch added patch discarded remove patch
@@ -94,7 +94,7 @@  discard block
 block discarded – undo
94 94
         $this->_admin_base_url  = EE_MSG_ADMIN_URL;
95 95
         $this->_admin_base_path = EE_MSG_ADMIN;
96 96
         
97
-        $this->_activate_state = isset($this->_req_data['activate_state']) ? (array)$this->_req_data['activate_state'] : array();
97
+        $this->_activate_state = isset($this->_req_data['activate_state']) ? (array) $this->_req_data['activate_state'] : array();
98 98
         
99 99
         $this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
100 100
         $this->_load_message_resource_manager();
@@ -253,7 +253,7 @@  discard block
 block discarded – undo
253 253
             array('none_selected' => esc_html__('Show All Messengers', 'event_espresso')),
254 254
             $messenger_options
255 255
         );
256
-        $input             = new EE_Select_Input(
256
+        $input = new EE_Select_Input(
257 257
             $messenger_options,
258 258
             array(
259 259
                 'html_name'  => 'ee_messenger_filter_by',
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
             array('none_selected' => esc_html__('Show All Message Types', 'event_espresso')),
292 292
             $message_type_options
293 293
         );
294
-        $input                = new EE_Select_Input(
294
+        $input = new EE_Select_Input(
295 295
             $message_type_options,
296 296
             array(
297 297
                 'html_name'  => 'ee_message_type_filter_by',
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
             array('none_selected' => esc_html__('Show all Contexts', 'event_espresso')),
330 330
             $context_options
331 331
         );
332
-        $input           = new EE_Select_Input(
332
+        $input = new EE_Select_Input(
333 333
             $context_options,
334 334
             array(
335 335
                 'html_name'  => 'ee_context_filter_by',
@@ -711,53 +711,53 @@  discard block
 block discarded – undo
711 711
     
712 712
     public function messages_help_tab()
713 713
     {
714
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
714
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_messages_help_tab.template.php');
715 715
     }
716 716
     
717 717
     
718 718
     public function messengers_help_tab()
719 719
     {
720
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
720
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_messenger_help_tab.template.php');
721 721
     }
722 722
     
723 723
     
724 724
     public function message_types_help_tab()
725 725
     {
726
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
726
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_message_type_help_tab.template.php');
727 727
     }
728 728
     
729 729
     
730 730
     public function messages_overview_help_tab()
731 731
     {
732
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
732
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_overview_help_tab.template.php');
733 733
     }
734 734
     
735 735
     
736 736
     public function message_templates_help_tab()
737 737
     {
738
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
738
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_message_templates_help_tab.template.php');
739 739
     }
740 740
     
741 741
     
742 742
     public function edit_message_template_help_tab()
743 743
     {
744
-        $args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="'
744
+        $args['img1'] = '<img src="'.EE_MSG_ASSETS_URL.'images/editor.png'.'" alt="'
745 745
                         . esc_attr__('Editor Title', 'event_espresso')
746 746
                         . '" />';
747
-        $args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="'
747
+        $args['img2'] = '<img src="'.EE_MSG_ASSETS_URL.'images/switch-context.png'.'" alt="'
748 748
                         . esc_attr__('Context Switcher and Preview', 'event_espresso')
749 749
                         . '" />';
750
-        $args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="'
750
+        $args['img3'] = '<img class="left" src="'.EE_MSG_ASSETS_URL.'images/form-fields.png'.'" alt="'
751 751
                         . esc_attr__('Message Template Form Fields', 'event_espresso')
752 752
                         . '" />';
753
-        $args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="'
753
+        $args['img4'] = '<img class="right" src="'.EE_MSG_ASSETS_URL.'images/shortcodes-metabox.png'.'" alt="'
754 754
                         . esc_attr__('Shortcodes Metabox', 'event_espresso')
755 755
                         . '" />';
756
-        $args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="'
756
+        $args['img5'] = '<img class="right" src="'.EE_MSG_ASSETS_URL.'images/publish-meta-box.png'.'" alt="'
757 757
                         . esc_attr__('Publish Metabox', 'event_espresso')
758 758
                         . '" />';
759 759
         EEH_Template::display_template(
760
-            EE_MSG_TEMPLATE_PATH  . 'ee_msg_messages_templates_editor_help_tab.template.php',
760
+            EE_MSG_TEMPLATE_PATH.'ee_msg_messages_templates_editor_help_tab.template.php',
761 761
             $args
762 762
         );
763 763
     }
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
         $this->_set_shortcodes();
769 769
         $args['shortcodes'] = $this->_shortcodes;
770 770
         EEH_Template::display_template(
771
-            EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
771
+            EE_MSG_TEMPLATE_PATH.'ee_msg_messages_shortcodes_help_tab.template.php',
772 772
             $args
773 773
         );
774 774
     }
@@ -776,16 +776,16 @@  discard block
 block discarded – undo
776 776
     
777 777
     public function preview_message_help_tab()
778 778
     {
779
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
779
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_preview_help_tab.template.php');
780 780
     }
781 781
     
782 782
     
783 783
     public function settings_help_tab()
784 784
     {
785
-        $args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png'
786
-                        . '" alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />';
787
-        $args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
788
-                        . '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />';
785
+        $args['img1'] = '<img class="inline-text" src="'.EE_MSG_ASSETS_URL.'images/email-tab-active.png'
786
+                        . '" alt="'.esc_attr__('Active Email Tab', 'event_espresso').'" />';
787
+        $args['img2'] = '<img class="inline-text" src="'.EE_MSG_ASSETS_URL.'images/email-tab-inactive.png'
788
+                        . '" alt="'.esc_attr__('Inactive Email Tab', 'event_espresso').'" />';
789 789
         $args['img3'] = '<div class="switch">'
790 790
                         . '<input class="ee-on-off-toggle ee-toggle-round-flat"'
791 791
                         . ' type="checkbox" checked="checked">'
@@ -796,18 +796,18 @@  discard block
 block discarded – undo
796 796
                         . ' type="checkbox">'
797 797
                         . '<label for="ee-on-off-toggle-on"></label>'
798 798
                         . '</div>';
799
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
799
+        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH.'ee_msg_messages_settings_help_tab.template.php', $args);
800 800
     }
801 801
     
802 802
     
803 803
     public function load_scripts_styles()
804 804
     {
805
-        wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
805
+        wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL.'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
806 806
         wp_enqueue_style('espresso_ee_msg');
807 807
         
808
-        wp_register_script('ee-messages-settings', EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
808
+        wp_register_script('ee-messages-settings', EE_MSG_ASSETS_URL.'ee-messages-settings.js',
809 809
             array('jquery-ui-droppable', 'ee-serialize-full-array'), EVENT_ESPRESSO_VERSION, true);
810
-        wp_register_script('ee-msg-list-table-js', EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
810
+        wp_register_script('ee-msg-list-table-js', EE_MSG_ASSETS_URL.'ee_message_admin_list_table.js',
811 811
             array('ee-dialog'), EVENT_ESPRESSO_VERSION);
812 812
     }
813 813
     
@@ -839,7 +839,7 @@  discard block
 block discarded – undo
839 839
         
840 840
         $this->_set_shortcodes();
841 841
         
842
-        EE_Registry::$i18n_js_strings['confirm_default_reset']        = sprintf(
842
+        EE_Registry::$i18n_js_strings['confirm_default_reset'] = sprintf(
843 843
             esc_html__(
844 844
                 '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.',
845 845
                 'event_espresso'
@@ -858,7 +858,7 @@  discard block
 block discarded – undo
858 858
         
859 859
         wp_register_script(
860 860
             'ee_msgs_edit_js',
861
-            EE_MSG_ASSETS_URL . 'ee_message_editor.js',
861
+            EE_MSG_ASSETS_URL.'ee_message_editor.js',
862 862
             array('jquery'),
863 863
             EVENT_ESPRESSO_VERSION
864 864
         );
@@ -901,7 +901,7 @@  discard block
 block discarded – undo
901 901
     {
902 902
         wp_register_style(
903 903
             'ee-message-settings',
904
-            EE_MSG_ASSETS_URL . 'ee_message_settings.css',
904
+            EE_MSG_ASSETS_URL.'ee_message_settings.css',
905 905
             array(),
906 906
             EVENT_ESPRESSO_VERSION
907 907
         );
@@ -987,7 +987,7 @@  discard block
 block discarded – undo
987 987
             }
988 988
             $status_bulk_actions = $common_bulk_actions;
989 989
             //unset bulk actions not applying to status
990
-            if (! empty($status_bulk_actions)) {
990
+            if ( ! empty($status_bulk_actions)) {
991 991
                 switch ($status) {
992 992
                     case EEM_Message::status_idle:
993 993
                     case EEM_Message::status_resend:
@@ -1012,7 +1012,7 @@  discard block
 block discarded – undo
1012 1012
             }
1013 1013
 
1014 1014
             //skip adding messenger executing status to views because it will be included with the Failed view.
1015
-            if ( $status === EEM_Message::status_messenger_executing ) {
1015
+            if ($status === EEM_Message::status_messenger_executing) {
1016 1016
                 continue;
1017 1017
             }
1018 1018
             
@@ -1064,37 +1064,37 @@  discard block
 block discarded – undo
1064 1064
         /** @type array $status_items status legend setup */
1065 1065
         $status_items = array(
1066 1066
             'sent_status'       => array(
1067
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
1067
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_sent,
1068 1068
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence')
1069 1069
             ),
1070 1070
             'idle_status'       => array(
1071
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
1071
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_idle,
1072 1072
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence')
1073 1073
             ),
1074 1074
             'failed_status'     => array(
1075
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
1075
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_failed,
1076 1076
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence')
1077 1077
             ),
1078 1078
             'messenger_executing_status' => array(
1079
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
1079
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_messenger_executing,
1080 1080
                 'desc' => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence')
1081 1081
             ),
1082 1082
             'resend_status'     => array(
1083
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
1083
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_resend,
1084 1084
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence')
1085 1085
             ),
1086 1086
             'incomplete_status' => array(
1087
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1087
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_incomplete,
1088 1088
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence')
1089 1089
             ),
1090 1090
             'retry_status'      => array(
1091
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1091
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_retry,
1092 1092
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence')
1093 1093
             )
1094 1094
         );
1095 1095
         if (EEM_Message::debug()) {
1096 1096
             $status_items['debug_only_status'] = array(
1097
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1097
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Message::status_debug_only,
1098 1098
                 'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence')
1099 1099
             );
1100 1100
         }
@@ -1106,8 +1106,8 @@  discard block
 block discarded – undo
1106 1106
     protected function _custom_mtps_preview()
1107 1107
     {
1108 1108
         $this->_admin_page_title              = esc_html__('Custom Message Templates (Preview)', 'event_espresso');
1109
-        $this->_template_args['preview_img']  = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png"'
1110
-            . ' alt="' . esc_attr__('Preview Custom Message Templates screenshot', 'event_espresso') . '" />';
1109
+        $this->_template_args['preview_img']  = '<img src="'.EE_MSG_ASSETS_URL.'images/custom_mtps_preview.png"'
1110
+            . ' alt="'.esc_attr__('Preview Custom Message Templates screenshot', 'event_espresso').'" />';
1111 1111
         $this->_template_args['preview_text'] = '<strong>'
1112 1112
             . esc_html__(
1113 1113
                 '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.',
@@ -1389,7 +1389,7 @@  discard block
 block discarded – undo
1389 1389
                             //let's verify if we need this extra field via the shortcodes parameter.
1390 1390
                             $continue = false;
1391 1391
                             if (isset($extra_array['shortcodes_required'])) {
1392
-                                foreach ((array)$extra_array['shortcodes_required'] as $shortcode) {
1392
+                                foreach ((array) $extra_array['shortcodes_required'] as $shortcode) {
1393 1393
                                     if ( ! array_key_exists($shortcode, $this->_shortcodes)) {
1394 1394
                                         $continue = true;
1395 1395
                                     }
@@ -1399,7 +1399,7 @@  discard block
 block discarded – undo
1399 1399
                                 }
1400 1400
                             }
1401 1401
                             
1402
-                            $field_id                                = $reference_field
1402
+                            $field_id = $reference_field
1403 1403
                                                                        . '-'
1404 1404
                                                                        . $extra_field
1405 1405
                                                                        . '-content';
@@ -1407,8 +1407,8 @@  discard block
 block discarded – undo
1407 1407
                             $template_form_fields[$field_id]['name'] = 'MTP_template_fields['
1408 1408
                                                                        . $reference_field
1409 1409
                                                                        . '][content]['
1410
-                                                                       . $extra_field . ']';
1411
-                            $css_class                               = isset($extra_array['css_class'])
1410
+                                                                       . $extra_field.']';
1411
+                            $css_class = isset($extra_array['css_class'])
1412 1412
                                 ? $extra_array['css_class']
1413 1413
                                 : '';
1414 1414
                             
@@ -1419,7 +1419,7 @@  discard block
 block discarded – undo
1419 1419
                                     is_array($validators[$extra_field])
1420 1420
                                     && isset($validators[$extra_field]['msg'])
1421 1421
                                 )
1422
-                                ? 'validate-error ' . $css_class
1422
+                                ? 'validate-error '.$css_class
1423 1423
                                 : $css_class;
1424 1424
                             
1425 1425
                             $template_form_fields[$field_id]['value'] = ! empty($message_templates)
@@ -1450,11 +1450,11 @@  discard block
 block discarded – undo
1450 1450
                                 
1451 1451
                             }/**/
1452 1452
                         }
1453
-                        $templatefield_MTP_id          = $reference_field . '-MTP_ID';
1454
-                        $templatefield_templatename_id = $reference_field . '-name';
1453
+                        $templatefield_MTP_id          = $reference_field.'-MTP_ID';
1454
+                        $templatefield_templatename_id = $reference_field.'-name';
1455 1455
                         
1456 1456
                         $template_form_fields[$templatefield_MTP_id] = array(
1457
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1457
+                            'name'       => 'MTP_template_fields['.$reference_field.'][MTP_ID]',
1458 1458
                             'label'      => null,
1459 1459
                             'input'      => 'hidden',
1460 1460
                             'type'       => 'int',
@@ -1467,7 +1467,7 @@  discard block
 block discarded – undo
1467 1467
                         );
1468 1468
                         
1469 1469
                         $template_form_fields[$templatefield_templatename_id] = array(
1470
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1470
+                            'name'       => 'MTP_template_fields['.$reference_field.'][name]',
1471 1471
                             'label'      => null,
1472 1472
                             'input'      => 'hidden',
1473 1473
                             'type'       => 'string',
@@ -1481,9 +1481,9 @@  discard block
 block discarded – undo
1481 1481
                     }
1482 1482
                     continue; //skip the next stuff, we got the necessary fields here for this dataset.
1483 1483
                 } else {
1484
-                    $field_id                                 = $template_field . '-content';
1484
+                    $field_id                                 = $template_field.'-content';
1485 1485
                     $template_form_fields[$field_id]          = $field_setup_array;
1486
-                    $template_form_fields[$field_id]['name']  = 'MTP_template_fields[' . $template_field . '][content]';
1486
+                    $template_form_fields[$field_id]['name']  = 'MTP_template_fields['.$template_field.'][content]';
1487 1487
                     $message_template                         = isset($message_templates[$context][$template_field])
1488 1488
                         ? $message_templates[$context][$template_field]
1489 1489
                         : null;
@@ -1506,7 +1506,7 @@  discard block
 block discarded – undo
1506 1506
                     $template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1507 1507
                                                                     && in_array($template_field, $v_fields, true)
1508 1508
                                                                     && isset($validators[$template_field]['msg'])
1509
-                        ? 'validate-error ' . $css_class
1509
+                        ? 'validate-error '.$css_class
1510 1510
                         : $css_class;
1511 1511
                     
1512 1512
                     //shortcode selector
@@ -1517,12 +1517,12 @@  discard block
 block discarded – undo
1517 1517
                 
1518 1518
                 //k took care of content field(s) now let's take care of others.
1519 1519
                 
1520
-                $templatefield_MTP_id                = $template_field . '-MTP_ID';
1521
-                $templatefield_field_templatename_id = $template_field . '-name';
1520
+                $templatefield_MTP_id                = $template_field.'-MTP_ID';
1521
+                $templatefield_field_templatename_id = $template_field.'-name';
1522 1522
                 
1523 1523
                 //foreach template field there are actually two form fields created
1524 1524
                 $template_form_fields[$templatefield_MTP_id] = array(
1525
-                    'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1525
+                    'name'       => 'MTP_template_fields['.$template_field.'][MTP_ID]',
1526 1526
                     'label'      => null,
1527 1527
                     'input'      => 'hidden',
1528 1528
                     'type'       => 'int',
@@ -1535,7 +1535,7 @@  discard block
 block discarded – undo
1535 1535
                 );
1536 1536
                 
1537 1537
                 $template_form_fields[$templatefield_field_templatename_id] = array(
1538
-                    'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1538
+                    'name'       => 'MTP_template_fields['.$template_field.'][name]',
1539 1539
                     'label'      => null,
1540 1540
                     'input'      => 'hidden',
1541 1541
                     'type'       => 'string',
@@ -1653,7 +1653,7 @@  discard block
 block discarded – undo
1653 1653
                 'format'     => '%d',
1654 1654
                 'db-col'     => 'MTP_deleted'
1655 1655
             );
1656
-            $sidebar_form_fields['ee-msg-author']  = array(
1656
+            $sidebar_form_fields['ee-msg-author'] = array(
1657 1657
                 'name'       => 'MTP_user_id',
1658 1658
                 'label'      => esc_html__('Author', 'event_espresso'),
1659 1659
                 'input'      => 'hidden',
@@ -1672,17 +1672,17 @@  discard block
 block discarded – undo
1672 1672
                 'value' => $action
1673 1673
             );
1674 1674
             
1675
-            $sidebar_form_fields['ee-msg-id']        = array(
1675
+            $sidebar_form_fields['ee-msg-id'] = array(
1676 1676
                 'name'  => 'id',
1677 1677
                 'input' => 'hidden',
1678 1678
                 'type'  => 'int',
1679 1679
                 'value' => $GRP_ID
1680 1680
             );
1681 1681
             $sidebar_form_fields['ee-msg-evt-nonce'] = array(
1682
-                'name'  => $action . '_nonce',
1682
+                'name'  => $action.'_nonce',
1683 1683
                 'input' => 'hidden',
1684 1684
                 'type'  => 'string',
1685
-                'value' => wp_create_nonce($action . '_nonce')
1685
+                'value' => wp_create_nonce($action.'_nonce')
1686 1686
             );
1687 1687
             
1688 1688
             if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
@@ -1714,7 +1714,7 @@  discard block
 block discarded – undo
1714 1714
         );
1715 1715
         
1716 1716
         //add preview button
1717
-        $preview_url    = parent::add_query_args_and_nonce(
1717
+        $preview_url = parent::add_query_args_and_nonce(
1718 1718
             array(
1719 1719
                 'message_type' => $message_template_group->message_type(),
1720 1720
                 'messenger'    => $message_template_group->messenger(),
@@ -1724,7 +1724,7 @@  discard block
 block discarded – undo
1724 1724
             ),
1725 1725
             $this->_admin_base_url
1726 1726
         );
1727
-        $preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">'
1727
+        $preview_button = '<a href="'.$preview_url.'" class="button-secondary messages-preview-button">'
1728 1728
                           . esc_html__('Preview', 'event_espresso')
1729 1729
                           . '</a>';
1730 1730
         
@@ -1761,7 +1761,7 @@  discard block
 block discarded – undo
1761 1761
         
1762 1762
         $this->_template_path = $this->_template_args['GRP_ID']
1763 1763
             ? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1764
-            : EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1764
+            : EE_MSG_TEMPLATE_PATH.'ee_msg_details_main_add_meta_box.template.php';
1765 1765
         
1766 1766
         //send along EE_Message_Template_Group object for further template use.
1767 1767
         $this->_template_args['MTP'] = $message_template_group;
@@ -1816,7 +1816,7 @@  discard block
 block discarded – undo
1816 1816
     ) {
1817 1817
         $template_args = array(
1818 1818
             'context' => $context,
1819
-            'nonce' => wp_create_nonce('activate_' . $context . '_toggle_nonce'),
1819
+            'nonce' => wp_create_nonce('activate_'.$context.'_toggle_nonce'),
1820 1820
             'is_active' => $message_template_group->is_context_active($context),
1821 1821
             'on_off_action' => $message_template_group->is_context_active($context)
1822 1822
                 ? 'context-off'
@@ -1825,7 +1825,7 @@  discard block
 block discarded – undo
1825 1825
             'message_template_group_id' => $message_template_group->ID()
1826 1826
         );
1827 1827
         return EEH_Template::display_template(
1828
-          EE_MSG_TEMPLATE_PATH . 'ee_msg_editor_active_context_element.template.php',
1828
+          EE_MSG_TEMPLATE_PATH.'ee_msg_editor_active_context_element.template.php',
1829 1829
           $template_args,
1830 1830
           true
1831 1831
         );
@@ -1845,7 +1845,7 @@  discard block
 block discarded – undo
1845 1845
     {
1846 1846
         $success = true;
1847 1847
         //check for required data
1848
-        if (!isset(
1848
+        if ( ! isset(
1849 1849
             $this->_req_data['message_template_group_id'],
1850 1850
             $this->_req_data['context'],
1851 1851
             $this->_req_data['status']
@@ -1862,10 +1862,10 @@  discard block
 block discarded – undo
1862 1862
         $nonce = isset($this->_req_data['toggle_context_nonce'])
1863 1863
             ? sanitize_text_field($this->_req_data['toggle_context_nonce'])
1864 1864
             : '';
1865
-        $nonce_ref = 'activate_' . $this->_req_data['context'] . '_toggle_nonce';
1865
+        $nonce_ref = 'activate_'.$this->_req_data['context'].'_toggle_nonce';
1866 1866
         $this->_verify_nonce($nonce, $nonce_ref);
1867 1867
         $status = $this->_req_data['status'];
1868
-        if ($status !== 'off' && $status !=='on') {
1868
+        if ($status !== 'off' && $status !== 'on') {
1869 1869
             EE_Error::add_error(
1870 1870
                 sprintf(
1871 1871
                     esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
@@ -1880,7 +1880,7 @@  discard block
 block discarded – undo
1880 1880
         $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID(
1881 1881
             $this->_req_data['message_template_group_id']
1882 1882
         );
1883
-        if (! $message_template_group instanceof EE_Message_Template_Group) {
1883
+        if ( ! $message_template_group instanceof EE_Message_Template_Group) {
1884 1884
             EE_Error::add_error(
1885 1885
                 sprintf(
1886 1886
                     esc_html__(
@@ -2125,7 +2125,7 @@  discard block
 block discarded – undo
2125 2125
         }
2126 2126
         
2127 2127
         //let's add a button to go back to the edit view
2128
-        $query_args             = array(
2128
+        $query_args = array(
2129 2129
             'id'      => $this->_req_data['GRP_ID'],
2130 2130
             'context' => $this->_req_data['context'],
2131 2131
             'action'  => 'edit_message_template'
@@ -2151,7 +2151,7 @@  discard block
 block discarded – undo
2151 2151
         );
2152 2152
         //setup display of preview.
2153 2153
         $this->_admin_page_title                    = $preview_title;
2154
-        $this->_template_args['admin_page_content'] = $preview_button . '<br />' . $preview;
2154
+        $this->_template_args['admin_page_content'] = $preview_button.'<br />'.$preview;
2155 2155
         $this->_template_args['data']['force_json'] = true;
2156 2156
         
2157 2157
         return '';
@@ -2257,7 +2257,7 @@  discard block
 block discarded – undo
2257 2257
         }
2258 2258
         
2259 2259
         //setup variation select values for the currently selected template.
2260
-        $variations               = $this->_message_template_group->get_template_pack()->get_variations(
2260
+        $variations = $this->_message_template_group->get_template_pack()->get_variations(
2261 2261
             $this->_message_template_group->messenger(),
2262 2262
             $this->_message_template_group->message_type()
2263 2263
         );
@@ -2271,12 +2271,12 @@  discard block
 block discarded – undo
2271 2271
         
2272 2272
         $template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
2273 2273
         
2274
-        $template_args['template_packs_selector']        = EEH_Form_Fields::select_input(
2274
+        $template_args['template_packs_selector'] = EEH_Form_Fields::select_input(
2275 2275
             'MTP_template_pack',
2276 2276
             $tp_select_values,
2277 2277
             $this->_message_template_group->get_template_pack_name()
2278 2278
         );
2279
-        $template_args['variations_selector']            = EEH_Form_Fields::select_input(
2279
+        $template_args['variations_selector'] = EEH_Form_Fields::select_input(
2280 2280
             'MTP_template_variation',
2281 2281
             $variations_select_values,
2282 2282
             $this->_message_template_group->get_template_pack_variation()
@@ -2286,7 +2286,7 @@  discard block
 block discarded – undo
2286 2286
         $template_args['template_pack_description']      = $template_pack_labels->template_pack_description;
2287 2287
         $template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
2288 2288
         
2289
-        $template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
2289
+        $template = EE_MSG_TEMPLATE_PATH.'template_pack_and_variations_metabox.template.php';
2290 2290
         
2291 2291
         EEH_Template::display_template($template, $template_args);
2292 2292
     }
@@ -2315,14 +2315,14 @@  discard block
 block discarded – undo
2315 2315
         if ( ! empty($fields)) {
2316 2316
             //yup there be fields
2317 2317
             foreach ($fields as $field => $config) {
2318
-                $field_id = $this->_message_template_group->messenger() . '_' . $field;
2318
+                $field_id = $this->_message_template_group->messenger().'_'.$field;
2319 2319
                 $existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2320 2320
                 $default  = isset($config['default']) ? $config['default'] : '';
2321 2321
                 $default  = isset($config['value']) ? $config['value'] : $default;
2322 2322
                 
2323 2323
                 // if type is hidden and the value is empty
2324 2324
                 // something may have gone wrong so let's correct with the defaults
2325
-                $fix              = $config['input'] === 'hidden'
2325
+                $fix = $config['input'] === 'hidden'
2326 2326
                                     && isset($existing[$field])
2327 2327
                                     && empty($existing[$field])
2328 2328
                     ? $default
@@ -2332,7 +2332,7 @@  discard block
 block discarded – undo
2332 2332
                     : $fix;
2333 2333
                 
2334 2334
                 $template_form_fields[$field_id] = array(
2335
-                    'name'       => 'test_settings_fld[' . $field . ']',
2335
+                    'name'       => 'test_settings_fld['.$field.']',
2336 2336
                     'label'      => $config['label'],
2337 2337
                     'input'      => $config['input'],
2338 2338
                     'type'       => $config['type'],
@@ -2400,7 +2400,7 @@  discard block
 block discarded – undo
2400 2400
         );
2401 2401
         
2402 2402
         return EEH_Template::display_template(
2403
-            EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2403
+            EE_MSG_TEMPLATE_PATH.'shortcode_selector_skeleton.template.php',
2404 2404
             $template_args,
2405 2405
             true
2406 2406
         );
@@ -2425,7 +2425,7 @@  discard block
 block discarded – undo
2425 2425
         //$messenger = $this->_message_template_group->messenger_obj();
2426 2426
         //now let's set the content depending on the status of the shortcodes array
2427 2427
         if (empty($shortcodes)) {
2428
-            $content = '<p>' . esc_html__('There are no valid shortcodes available', 'event_espresso') . '</p>';
2428
+            $content = '<p>'.esc_html__('There are no valid shortcodes available', 'event_espresso').'</p>';
2429 2429
             echo $content;
2430 2430
         } else {
2431 2431
             //$alt = 0;
@@ -2562,7 +2562,7 @@  discard block
 block discarded – undo
2562 2562
                     <?php
2563 2563
                 }
2564 2564
                 //setup nonce_url
2565
-                wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2565
+                wp_nonce_field($args['action'].'_nonce', $args['action'].'_nonce', false);
2566 2566
                 ?>
2567 2567
                 <select name="context">
2568 2568
                     <?php
@@ -2663,7 +2663,7 @@  discard block
 block discarded – undo
2663 2663
         $context      = ucwords(str_replace('_', ' ', $context_slug));
2664 2664
         
2665 2665
         $item_desc = $messenger_label && $message_type_label
2666
-            ? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' '
2666
+            ? $messenger_label.' '.$message_type_label.' '.$context.' '
2667 2667
             : '';
2668 2668
         $item_desc .= 'Message Template';
2669 2669
         $query_args  = array();
@@ -2736,9 +2736,9 @@  discard block
 block discarded – undo
2736 2736
                             'MTP_ID' => $this->_req_data['MTP_template_fields'][$template_field]['MTP_ID']
2737 2737
                         );
2738 2738
                         //if they aren't allowed to use all JS, restrict them to just posty-y tags
2739
-                        if (! current_user_can('unfiltered_html')){
2740
-                            if (is_array($set_column_values['MTP_content'])){
2741
-                                 foreach($set_column_values['MTP_content'] as $key => $value) {
2739
+                        if ( ! current_user_can('unfiltered_html')) {
2740
+                            if (is_array($set_column_values['MTP_content'])) {
2741
+                                 foreach ($set_column_values['MTP_content'] as $key => $value) {
2742 2742
                                      //remove slashes so wp_kses works properly (its wp_kses_stripslashes() function
2743 2743
                                      //only removes slashes from double-quotes, so attributes using single quotes always
2744 2744
                                      //appear invalid.) But currently the models expect slashed data, so after wp_kses
@@ -2787,7 +2787,7 @@  discard block
 block discarded – undo
2787 2787
                                 //default setup for it.
2788 2788
                                 //@link https://events.codebasehq.com/projects/event-espresso/tickets/9465
2789 2789
                                 $updated = $MTP->insert($message_template_fields);
2790
-                                if (! $updated || is_wp_error($updated)) {
2790
+                                if ( ! $updated || is_wp_error($updated)) {
2791 2791
                                     EE_Error::add_error(
2792 2792
                                         sprintf(
2793 2793
                                             esc_html__('%s field could not be updated.', 'event_espresso'),
@@ -3148,7 +3148,7 @@  discard block
 block discarded – undo
3148 3148
             : 'email';
3149 3149
         
3150 3150
         //let's setup the messenger tabs
3151
-        $this->_template_args['admin_page_header']         = EEH_Tabbed_Content::tab_text_links(
3151
+        $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
3152 3152
             $this->_m_mt_settings['messenger_tabs'],
3153 3153
             'messenger_links',
3154 3154
             '|',
@@ -3216,10 +3216,10 @@  discard block
 block discarded – undo
3216 3216
                 
3217 3217
                 $this->_m_mt_settings['message_type_tabs'][$messenger->name][$a_or_i][$message_type->name] = array(
3218 3218
                     'label'    => ucwords($message_type->label['singular']),
3219
-                    'class'    => 'message-type-' . $a_or_i,
3220
-                    'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
3221
-                    'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
3222
-                    'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
3219
+                    'class'    => 'message-type-'.$a_or_i,
3220
+                    'slug_id'  => $message_type->name.'-messagetype-'.$messenger->name,
3221
+                    'mt_nonce' => wp_create_nonce($message_type->name.'_nonce'),
3222
+                    'href'     => 'espresso_'.$message_type->name.'_message_type_settings',
3223 3223
                     'title'    => $a_or_i === 'active'
3224 3224
                         ? esc_html__('Drag this message type to the Inactive window to deactivate', 'event_espresso')
3225 3225
                         : esc_html__('Drag this message type to the messenger to activate', 'event_espresso'),
@@ -3255,9 +3255,9 @@  discard block
 block discarded – undo
3255 3255
             $existing_settings = $message_type->get_existing_admin_settings($messenger->name);
3256 3256
             
3257 3257
             foreach ($fields as $fldname => $fldprops) {
3258
-                $field_id                       = $messenger->name . '-' . $message_type->name . '-' . $fldname;
3258
+                $field_id                       = $messenger->name.'-'.$message_type->name.'-'.$fldname;
3259 3259
                 $template_form_field[$field_id] = array(
3260
-                    'name'       => 'message_type_settings[' . $fldname . ']',
3260
+                    'name'       => 'message_type_settings['.$fldname.']',
3261 3261
                     'label'      => $fldprops['label'],
3262 3262
                     'input'      => $fldprops['field_type'],
3263 3263
                     'type'       => $fldprops['value_type'],
@@ -3308,12 +3308,12 @@  discard block
 block discarded – undo
3308 3308
             $settings_template_args['hidden_fields'],
3309 3309
             'array'
3310 3310
         );
3311
-        $settings_template_args['show_form']     = empty($settings_template_args['template_form_fields'])
3311
+        $settings_template_args['show_form'] = empty($settings_template_args['template_form_fields'])
3312 3312
             ? ' hidden'
3313 3313
             : '';
3314 3314
         
3315 3315
         
3316
-        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
3316
+        $template = EE_MSG_TEMPLATE_PATH.'ee_msg_mt_settings_content.template.php';
3317 3317
         $content  = EEH_Template::display_template($template, $settings_template_args, true);
3318 3318
         
3319 3319
         return $content;
@@ -3348,11 +3348,11 @@  discard block
 block discarded – undo
3348 3348
                 )
3349 3349
                     ? $this->_m_mt_settings['message_type_tabs'][$messenger]['active']
3350 3350
                     : '';
3351
-                $m_boxes[$messenger . '_a_box']         = sprintf(
3351
+                $m_boxes[$messenger.'_a_box'] = sprintf(
3352 3352
                     esc_html__('%s Settings', 'event_espresso'),
3353 3353
                     $tab_array['label']
3354 3354
                 );
3355
-                $m_template_args[$messenger . '_a_box'] = array(
3355
+                $m_template_args[$messenger.'_a_box'] = array(
3356 3356
                     'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3357 3357
                     'inactive_message_types' => isset(
3358 3358
                         $this->_m_mt_settings['message_type_tabs'][$messenger]['inactive']
@@ -3368,8 +3368,8 @@  discard block
 block discarded – undo
3368 3368
                 // message type meta boxes
3369 3369
                 // (which is really just the inactive container for each messenger
3370 3370
                 // showing inactive message types for that messenger)
3371
-                $mt_boxes[$messenger . '_i_box']         = esc_html__('Inactive Message Types', 'event_espresso');
3372
-                $mt_template_args[$messenger . '_i_box'] = array(
3371
+                $mt_boxes[$messenger.'_i_box']         = esc_html__('Inactive Message Types', 'event_espresso');
3372
+                $mt_template_args[$messenger.'_i_box'] = array(
3373 3373
                     'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3374 3374
                     'inactive_message_types' => isset(
3375 3375
                         $this->_m_mt_settings['message_type_tabs'][$messenger]['inactive']
@@ -3387,14 +3387,14 @@  discard block
 block discarded – undo
3387 3387
         
3388 3388
         
3389 3389
         //register messenger metaboxes
3390
-        $m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
3390
+        $m_template_path = EE_MSG_TEMPLATE_PATH.'ee_msg_details_messenger_mt_meta_box.template.php';
3391 3391
         foreach ($m_boxes as $box => $label) {
3392 3392
             $callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[$box]);
3393 3393
             $msgr          = str_replace('_a_box', '', $box);
3394 3394
             add_meta_box(
3395
-                'espresso_' . $msgr . '_settings',
3395
+                'espresso_'.$msgr.'_settings',
3396 3396
                 $label,
3397
-                function ($post, $metabox) {
3397
+                function($post, $metabox) {
3398 3398
                     echo EEH_Template::display_template(
3399 3399
                             $metabox["args"]["template_path"],
3400 3400
                             $metabox["args"]["template_args"],
@@ -3409,17 +3409,17 @@  discard block
 block discarded – undo
3409 3409
         }
3410 3410
         
3411 3411
         //register message type metaboxes
3412
-        $mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
3412
+        $mt_template_path = EE_MSG_TEMPLATE_PATH.'ee_msg_details_messenger_meta_box.template.php';
3413 3413
         foreach ($mt_boxes as $box => $label) {
3414 3414
             $callback_args = array(
3415 3415
                 'template_path' => $mt_template_path,
3416 3416
                 'template_args' => $mt_template_args[$box]
3417 3417
             );
3418
-            $mt            = str_replace('_i_box', '', $box);
3418
+            $mt = str_replace('_i_box', '', $box);
3419 3419
             add_meta_box(
3420
-                'espresso_' . $mt . '_inactive_mts',
3420
+                'espresso_'.$mt.'_inactive_mts',
3421 3421
                 $label,
3422
-                function ($post, $metabox) {
3422
+                function($post, $metabox) {
3423 3423
                     echo EEH_Template::display_template(
3424 3424
                             $metabox["args"]["template_path"],
3425 3425
                             $metabox["args"]["template_args"],
@@ -3566,7 +3566,7 @@  discard block
 block discarded – undo
3566 3566
             if ($form->is_valid()) {
3567 3567
                 $valid_data = $form->valid_data();
3568 3568
                 foreach ($valid_data as $property => $value) {
3569
-                    $setter = 'set_' . $property;
3569
+                    $setter = 'set_'.$property;
3570 3570
                     if (method_exists($network_config, $setter)) {
3571 3571
                         $network_config->{$setter}($value);
3572 3572
                     } else if (
@@ -3601,8 +3601,8 @@  discard block
 block discarded – undo
3601 3601
      */
3602 3602
     protected function _get_mt_tabs($tab_array)
3603 3603
     {
3604
-        $tab_array = (array)$tab_array;
3605
-        $template  = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3604
+        $tab_array = (array) $tab_array;
3605
+        $template  = EE_MSG_TEMPLATE_PATH.'ee_msg_details_mt_settings_tab_item.template.php';
3606 3606
         $tabs      = '';
3607 3607
         
3608 3608
         foreach ($tab_array as $tab) {
@@ -3635,9 +3635,9 @@  discard block
 block discarded – undo
3635 3635
             $existing_settings = $messenger->get_existing_admin_settings();
3636 3636
             
3637 3637
             foreach ($fields as $fldname => $fldprops) {
3638
-                $field_id                       = $messenger->name . '-' . $fldname;
3638
+                $field_id                       = $messenger->name.'-'.$fldname;
3639 3639
                 $template_form_field[$field_id] = array(
3640
-                    'name'       => 'messenger_settings[' . $field_id . ']',
3640
+                    'name'       => 'messenger_settings['.$field_id.']',
3641 3641
                     'label'      => $fldprops['label'],
3642 3642
                     'input'      => $fldprops['field_type'],
3643 3643
                     'type'       => $fldprops['value_type'],
@@ -3672,7 +3672,7 @@  discard block
 block discarded – undo
3672 3672
         //make sure any active message types that are existing are included in the hidden fields
3673 3673
         if (isset($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'])) {
3674 3674
             foreach ($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'] as $mt => $values) {
3675
-                $settings_template_args['hidden_fields']['messenger_settings[message_types][' . $mt . ']'] = array(
3675
+                $settings_template_args['hidden_fields']['messenger_settings[message_types]['.$mt.']'] = array(
3676 3676
                     'type'  => 'hidden',
3677 3677
                     'value' => $mt
3678 3678
                 );
@@ -3701,9 +3701,9 @@  discard block
 block discarded – undo
3701 3701
         
3702 3702
         
3703 3703
         $settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3704
-        $settings_template_args['nonce']         = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3704
+        $settings_template_args['nonce']         = wp_create_nonce('activate_'.$messenger->name.'_toggle_nonce');
3705 3705
         $settings_template_args['on_off_status'] = $active ? true : false;
3706
-        $template                                = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3706
+        $template                                = EE_MSG_TEMPLATE_PATH.'ee_msg_m_settings_content.template.php';
3707 3707
         $content                                 = EEH_Template::display_template(
3708 3708
             $template,
3709 3709
             $settings_template_args,
@@ -3743,7 +3743,7 @@  discard block
 block discarded – undo
3743 3743
         $nonce     = isset($this->_req_data['activate_nonce'])
3744 3744
             ? sanitize_text_field($this->_req_data['activate_nonce'])
3745 3745
             : '';
3746
-        $nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3746
+        $nonce_ref = 'activate_'.$this->_req_data['messenger'].'_toggle_nonce';
3747 3747
         
3748 3748
         $this->_verify_nonce($nonce, $nonce_ref);
3749 3749
         
@@ -3859,7 +3859,7 @@  discard block
 block discarded – undo
3859 3859
         
3860 3860
         //do a nonce check here since we're not arriving via a normal route
3861 3861
         $nonce     = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3862
-        $nonce_ref = $this->_req_data['message_type'] . '_nonce';
3862
+        $nonce_ref = $this->_req_data['message_type'].'_nonce';
3863 3863
         
3864 3864
         $this->_verify_nonce($nonce, $nonce_ref);
3865 3865
         
@@ -4220,7 +4220,7 @@  discard block
 block discarded – undo
4220 4220
         $message_type = $message_types[$this->_req_data['message_type']];
4221 4221
         $messenger    = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
4222 4222
         
4223
-        $content                         = $this->_message_type_settings_content(
4223
+        $content = $this->_message_type_settings_content(
4224 4224
             $message_type,
4225 4225
             $messenger,
4226 4226
             true
Please login to merge, or discard this patch.
Indentation   +4081 added lines, -4081 removed lines patch added patch discarded remove patch
@@ -5,7 +5,7 @@  discard block
 block discarded – undo
5 5
 use EventEspresso\core\exceptions\InvalidInterfaceException;
6 6
 
7 7
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
8
-    exit('NO direct script access allowed');
8
+	exit('NO direct script access allowed');
9 9
 }
10 10
 
11 11
 /**
@@ -23,2554 +23,2554 @@  discard block
 block discarded – undo
23 23
 class Messages_Admin_Page extends EE_Admin_Page
24 24
 {
25 25
     
26
-    /**
27
-     * @type EE_Message_Resource_Manager $_message_resource_manager
28
-     */
29
-    protected $_message_resource_manager;
26
+	/**
27
+	 * @type EE_Message_Resource_Manager $_message_resource_manager
28
+	 */
29
+	protected $_message_resource_manager;
30 30
     
31
-    /**
32
-     * @type string $_active_message_type_name
33
-     */
34
-    protected $_active_message_type_name = '';
31
+	/**
32
+	 * @type string $_active_message_type_name
33
+	 */
34
+	protected $_active_message_type_name = '';
35 35
     
36
-    /**
37
-     * @type EE_messenger $_active_messenger
38
-     */
39
-    protected $_active_messenger;
40
-    protected $_activate_state;
41
-    protected $_activate_meta_box_type;
42
-    protected $_current_message_meta_box;
43
-    protected $_current_message_meta_box_object;
44
-    protected $_context_switcher;
45
-    protected $_shortcodes = array();
46
-    protected $_active_messengers = array();
47
-    protected $_active_message_types = array();
36
+	/**
37
+	 * @type EE_messenger $_active_messenger
38
+	 */
39
+	protected $_active_messenger;
40
+	protected $_activate_state;
41
+	protected $_activate_meta_box_type;
42
+	protected $_current_message_meta_box;
43
+	protected $_current_message_meta_box_object;
44
+	protected $_context_switcher;
45
+	protected $_shortcodes = array();
46
+	protected $_active_messengers = array();
47
+	protected $_active_message_types = array();
48 48
     
49
-    /**
50
-     * @var EE_Message_Template_Group $_message_template_group
51
-     */
52
-    protected $_message_template_group;
53
-    protected $_m_mt_settings = array();
49
+	/**
50
+	 * @var EE_Message_Template_Group $_message_template_group
51
+	 */
52
+	protected $_message_template_group;
53
+	protected $_m_mt_settings = array();
54 54
     
55 55
     
56
-    /**
57
-     * This is set via the _set_message_template_group method and holds whatever the template pack for the group is.
58
-     * IF there is no group then it gets automatically set to the Default template pack.
59
-     *
60
-     * @since 4.5.0
61
-     *
62
-     * @var EE_Messages_Template_Pack
63
-     */
64
-    protected $_template_pack;
56
+	/**
57
+	 * This is set via the _set_message_template_group method and holds whatever the template pack for the group is.
58
+	 * IF there is no group then it gets automatically set to the Default template pack.
59
+	 *
60
+	 * @since 4.5.0
61
+	 *
62
+	 * @var EE_Messages_Template_Pack
63
+	 */
64
+	protected $_template_pack;
65 65
     
66 66
     
67
-    /**
68
-     * This is set via the _set_message_template_group method and holds whatever the template pack variation for the
69
-     * group is.  If there is no group then it automatically gets set to default.
70
-     *
71
-     * @since 4.5.0
72
-     *
73
-     * @var string
74
-     */
75
-    protected $_variation;
67
+	/**
68
+	 * This is set via the _set_message_template_group method and holds whatever the template pack variation for the
69
+	 * group is.  If there is no group then it automatically gets set to default.
70
+	 *
71
+	 * @since 4.5.0
72
+	 *
73
+	 * @var string
74
+	 */
75
+	protected $_variation;
76 76
 
77 77
 
78
-    /**
79
-     * @param bool $routing
80
-     * @throws EE_Error
81
-     */
82
-    public function __construct($routing = true)
83
-    {
84
-        //make sure messages autoloader is running
85
-        EED_Messages::set_autoloaders();
86
-        parent::__construct($routing);
87
-    }
78
+	/**
79
+	 * @param bool $routing
80
+	 * @throws EE_Error
81
+	 */
82
+	public function __construct($routing = true)
83
+	{
84
+		//make sure messages autoloader is running
85
+		EED_Messages::set_autoloaders();
86
+		parent::__construct($routing);
87
+	}
88 88
     
89 89
     
90
-    protected function _init_page_props()
91
-    {
92
-        $this->page_slug        = EE_MSG_PG_SLUG;
93
-        $this->page_label       = esc_html__('Messages Settings', 'event_espresso');
94
-        $this->_admin_base_url  = EE_MSG_ADMIN_URL;
95
-        $this->_admin_base_path = EE_MSG_ADMIN;
96
-        
97
-        $this->_activate_state = isset($this->_req_data['activate_state']) ? (array)$this->_req_data['activate_state'] : array();
98
-        
99
-        $this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
100
-        $this->_load_message_resource_manager();
101
-    }
90
+	protected function _init_page_props()
91
+	{
92
+		$this->page_slug        = EE_MSG_PG_SLUG;
93
+		$this->page_label       = esc_html__('Messages Settings', 'event_espresso');
94
+		$this->_admin_base_url  = EE_MSG_ADMIN_URL;
95
+		$this->_admin_base_path = EE_MSG_ADMIN;
96
+        
97
+		$this->_activate_state = isset($this->_req_data['activate_state']) ? (array)$this->_req_data['activate_state'] : array();
98
+        
99
+		$this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
100
+		$this->_load_message_resource_manager();
101
+	}
102 102
 
103 103
 
104
-    /**
105
-     * loads messenger objects into the $_active_messengers property (so we can access the needed methods)
106
-     *
107
-     * @throws EE_Error
108
-     * @throws InvalidDataTypeException
109
-     * @throws InvalidInterfaceException
110
-     * @throws InvalidArgumentException
111
-     * @throws ReflectionException
112
-     */
113
-    protected function _load_message_resource_manager()
114
-    {
115
-        $this->_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
116
-    }
104
+	/**
105
+	 * loads messenger objects into the $_active_messengers property (so we can access the needed methods)
106
+	 *
107
+	 * @throws EE_Error
108
+	 * @throws InvalidDataTypeException
109
+	 * @throws InvalidInterfaceException
110
+	 * @throws InvalidArgumentException
111
+	 * @throws ReflectionException
112
+	 */
113
+	protected function _load_message_resource_manager()
114
+	{
115
+		$this->_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
116
+	}
117 117
 
118 118
 
119
-    /**
120
-     * @deprecated 4.9.9.rc.014
121
-     * @return array
122
-     * @throws EE_Error
123
-     * @throws InvalidArgumentException
124
-     * @throws InvalidDataTypeException
125
-     * @throws InvalidInterfaceException
126
-     */
127
-    public function get_messengers_for_list_table()
128
-    {
129
-        EE_Error::doing_it_wrong(
130
-            __METHOD__,
131
-            sprintf(
132
-                esc_html__(
133
-                    'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a messenger filter dropdown which is now generated differently via %s',
134
-                    'event_espresso'
135
-                ),
136
-                'Messages_Admin_Page::get_messengers_select_input()'
137
-            ),
138
-            '4.9.9.rc.014'
139
-        );
140
-        
141
-        $m_values          = array();
142
-        $active_messengers = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
143
-        //setup messengers for selects
144
-        $i = 1;
145
-        foreach ($active_messengers as $active_messenger) {
146
-            if ($active_messenger instanceof EE_Message) {
147
-                $m_values[$i]['id']   = $active_messenger->messenger();
148
-                $m_values[$i]['text'] = ucwords($active_messenger->messenger_label());
149
-                $i++;
150
-            }
151
-        }
152
-        
153
-        return $m_values;
154
-    }
119
+	/**
120
+	 * @deprecated 4.9.9.rc.014
121
+	 * @return array
122
+	 * @throws EE_Error
123
+	 * @throws InvalidArgumentException
124
+	 * @throws InvalidDataTypeException
125
+	 * @throws InvalidInterfaceException
126
+	 */
127
+	public function get_messengers_for_list_table()
128
+	{
129
+		EE_Error::doing_it_wrong(
130
+			__METHOD__,
131
+			sprintf(
132
+				esc_html__(
133
+					'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a messenger filter dropdown which is now generated differently via %s',
134
+					'event_espresso'
135
+				),
136
+				'Messages_Admin_Page::get_messengers_select_input()'
137
+			),
138
+			'4.9.9.rc.014'
139
+		);
140
+        
141
+		$m_values          = array();
142
+		$active_messengers = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
143
+		//setup messengers for selects
144
+		$i = 1;
145
+		foreach ($active_messengers as $active_messenger) {
146
+			if ($active_messenger instanceof EE_Message) {
147
+				$m_values[$i]['id']   = $active_messenger->messenger();
148
+				$m_values[$i]['text'] = ucwords($active_messenger->messenger_label());
149
+				$i++;
150
+			}
151
+		}
152
+        
153
+		return $m_values;
154
+	}
155 155
 
156 156
 
157
-    /**
158
-     * @deprecated 4.9.9.rc.014
159
-     * @return array
160
-     * @throws EE_Error
161
-     * @throws InvalidArgumentException
162
-     * @throws InvalidDataTypeException
163
-     * @throws InvalidInterfaceException
164
-     */
165
-    public function get_message_types_for_list_table()
166
-    {
167
-        EE_Error::doing_it_wrong(
168
-            __METHOD__,
169
-            sprintf(
170
-                esc_html__(
171
-                    'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type filter dropdown which is now generated differently via %s',
172
-                    'event_espresso'
173
-                ),
174
-                'Messages_Admin_Page::get_message_types_select_input()'
175
-            ),
176
-            '4.9.9.rc.014'
177
-        );
178
-        
179
-        $mt_values       = array();
180
-        $active_messages = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
181
-        $i               = 1;
182
-        foreach ($active_messages as $active_message) {
183
-            if ($active_message instanceof EE_Message) {
184
-                $mt_values[$i]['id']   = $active_message->message_type();
185
-                $mt_values[$i]['text'] = ucwords($active_message->message_type_label());
186
-                $i++;
187
-            }
188
-        }
189
-        
190
-        return $mt_values;
191
-    }
157
+	/**
158
+	 * @deprecated 4.9.9.rc.014
159
+	 * @return array
160
+	 * @throws EE_Error
161
+	 * @throws InvalidArgumentException
162
+	 * @throws InvalidDataTypeException
163
+	 * @throws InvalidInterfaceException
164
+	 */
165
+	public function get_message_types_for_list_table()
166
+	{
167
+		EE_Error::doing_it_wrong(
168
+			__METHOD__,
169
+			sprintf(
170
+				esc_html__(
171
+					'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type filter dropdown which is now generated differently via %s',
172
+					'event_espresso'
173
+				),
174
+				'Messages_Admin_Page::get_message_types_select_input()'
175
+			),
176
+			'4.9.9.rc.014'
177
+		);
178
+        
179
+		$mt_values       = array();
180
+		$active_messages = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
181
+		$i               = 1;
182
+		foreach ($active_messages as $active_message) {
183
+			if ($active_message instanceof EE_Message) {
184
+				$mt_values[$i]['id']   = $active_message->message_type();
185
+				$mt_values[$i]['text'] = ucwords($active_message->message_type_label());
186
+				$i++;
187
+			}
188
+		}
189
+        
190
+		return $mt_values;
191
+	}
192 192
 
193 193
 
194
-    /**
195
-     * @deprecated 4.9.9.rc.014
196
-     * @return array
197
-     * @throws EE_Error
198
-     * @throws InvalidArgumentException
199
-     * @throws InvalidDataTypeException
200
-     * @throws InvalidInterfaceException
201
-     */
202
-    public function get_contexts_for_message_types_for_list_table()
203
-    {
204
-        EE_Error::doing_it_wrong(
205
-            __METHOD__,
206
-            sprintf(
207
-                esc_html__(
208
-                    'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type context filter dropdown which is now generated differently via %s',
209
-                    'event_espresso'
210
-                ),
211
-                'Messages_Admin_Page::get_contexts_for_message_types_select_input()'
212
-            ),
213
-            '4.9.9.rc.014'
214
-        );
215
-        
216
-        $contexts                = array();
217
-        $active_message_contexts = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
218
-        foreach ($active_message_contexts as $active_message) {
219
-            if ($active_message instanceof EE_Message) {
220
-                $message_type = $active_message->message_type_object();
221
-                if ($message_type instanceof EE_message_type) {
222
-                    $message_type_contexts = $message_type->get_contexts();
223
-                    foreach ($message_type_contexts as $context => $context_details) {
224
-                        $contexts[$context] = $context_details['label'];
225
-                    }
226
-                }
227
-            }
228
-        }
229
-        
230
-        return $contexts;
231
-    }
194
+	/**
195
+	 * @deprecated 4.9.9.rc.014
196
+	 * @return array
197
+	 * @throws EE_Error
198
+	 * @throws InvalidArgumentException
199
+	 * @throws InvalidDataTypeException
200
+	 * @throws InvalidInterfaceException
201
+	 */
202
+	public function get_contexts_for_message_types_for_list_table()
203
+	{
204
+		EE_Error::doing_it_wrong(
205
+			__METHOD__,
206
+			sprintf(
207
+				esc_html__(
208
+					'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type context filter dropdown which is now generated differently via %s',
209
+					'event_espresso'
210
+				),
211
+				'Messages_Admin_Page::get_contexts_for_message_types_select_input()'
212
+			),
213
+			'4.9.9.rc.014'
214
+		);
215
+        
216
+		$contexts                = array();
217
+		$active_message_contexts = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
218
+		foreach ($active_message_contexts as $active_message) {
219
+			if ($active_message instanceof EE_Message) {
220
+				$message_type = $active_message->message_type_object();
221
+				if ($message_type instanceof EE_message_type) {
222
+					$message_type_contexts = $message_type->get_contexts();
223
+					foreach ($message_type_contexts as $context => $context_details) {
224
+						$contexts[$context] = $context_details['label'];
225
+					}
226
+				}
227
+			}
228
+		}
229
+        
230
+		return $contexts;
231
+	}
232 232
 
233 233
 
234
-    /**
235
-     * Generate select input with provided messenger options array.
236
-     *
237
-     * @param array $messenger_options Array of messengers indexed by messenger slug and values are the messenger
238
-     *                                 labels.
239
-     * @return string
240
-     * @throws EE_Error
241
-     */
242
-    public function get_messengers_select_input($messenger_options)
243
-    {
244
-        //if empty or just one value then just return an empty string
245
-        if (empty($messenger_options)
246
-            || ! is_array($messenger_options)
247
-            || count($messenger_options) === 1
248
-        ) {
249
-            return '';
250
-        }
251
-        //merge in default
252
-        $messenger_options = array_merge(
253
-            array('none_selected' => esc_html__('Show All Messengers', 'event_espresso')),
254
-            $messenger_options
255
-        );
256
-        $input             = new EE_Select_Input(
257
-            $messenger_options,
258
-            array(
259
-                'html_name'  => 'ee_messenger_filter_by',
260
-                'html_id'    => 'ee_messenger_filter_by',
261
-                'html_class' => 'wide',
262
-                'default'    => isset($this->_req_data['ee_messenger_filter_by'])
263
-                    ? sanitize_title($this->_req_data['ee_messenger_filter_by'])
264
-                    : 'none_selected'
265
-            )
266
-        );
267
-        
268
-        return $input->get_html_for_input();
269
-    }
234
+	/**
235
+	 * Generate select input with provided messenger options array.
236
+	 *
237
+	 * @param array $messenger_options Array of messengers indexed by messenger slug and values are the messenger
238
+	 *                                 labels.
239
+	 * @return string
240
+	 * @throws EE_Error
241
+	 */
242
+	public function get_messengers_select_input($messenger_options)
243
+	{
244
+		//if empty or just one value then just return an empty string
245
+		if (empty($messenger_options)
246
+			|| ! is_array($messenger_options)
247
+			|| count($messenger_options) === 1
248
+		) {
249
+			return '';
250
+		}
251
+		//merge in default
252
+		$messenger_options = array_merge(
253
+			array('none_selected' => esc_html__('Show All Messengers', 'event_espresso')),
254
+			$messenger_options
255
+		);
256
+		$input             = new EE_Select_Input(
257
+			$messenger_options,
258
+			array(
259
+				'html_name'  => 'ee_messenger_filter_by',
260
+				'html_id'    => 'ee_messenger_filter_by',
261
+				'html_class' => 'wide',
262
+				'default'    => isset($this->_req_data['ee_messenger_filter_by'])
263
+					? sanitize_title($this->_req_data['ee_messenger_filter_by'])
264
+					: 'none_selected'
265
+			)
266
+		);
267
+        
268
+		return $input->get_html_for_input();
269
+	}
270 270
 
271 271
 
272
-    /**
273
-     * Generate select input with provided message type options array.
274
-     *
275
-     * @param array $message_type_options Array of message types indexed by message type slug, and values are the
276
-     *                                    message type labels
277
-     * @return string
278
-     * @throws EE_Error
279
-     */
280
-    public function get_message_types_select_input($message_type_options)
281
-    {
282
-        //if empty or count of options is 1 then just return an empty string
283
-        if (empty($message_type_options)
284
-            || ! is_array($message_type_options)
285
-            || count($message_type_options) === 1
286
-        ) {
287
-            return '';
288
-        }
289
-        //merge in default
290
-        $message_type_options = array_merge(
291
-            array('none_selected' => esc_html__('Show All Message Types', 'event_espresso')),
292
-            $message_type_options
293
-        );
294
-        $input                = new EE_Select_Input(
295
-            $message_type_options,
296
-            array(
297
-                'html_name'  => 'ee_message_type_filter_by',
298
-                'html_id'    => 'ee_message_type_filter_by',
299
-                'html_class' => 'wide',
300
-                'default'    => isset($this->_req_data['ee_message_type_filter_by'])
301
-                    ? sanitize_title($this->_req_data['ee_message_type_filter_by'])
302
-                    : 'none_selected',
303
-            )
304
-        );
305
-        
306
-        return $input->get_html_for_input();
307
-    }
272
+	/**
273
+	 * Generate select input with provided message type options array.
274
+	 *
275
+	 * @param array $message_type_options Array of message types indexed by message type slug, and values are the
276
+	 *                                    message type labels
277
+	 * @return string
278
+	 * @throws EE_Error
279
+	 */
280
+	public function get_message_types_select_input($message_type_options)
281
+	{
282
+		//if empty or count of options is 1 then just return an empty string
283
+		if (empty($message_type_options)
284
+			|| ! is_array($message_type_options)
285
+			|| count($message_type_options) === 1
286
+		) {
287
+			return '';
288
+		}
289
+		//merge in default
290
+		$message_type_options = array_merge(
291
+			array('none_selected' => esc_html__('Show All Message Types', 'event_espresso')),
292
+			$message_type_options
293
+		);
294
+		$input                = new EE_Select_Input(
295
+			$message_type_options,
296
+			array(
297
+				'html_name'  => 'ee_message_type_filter_by',
298
+				'html_id'    => 'ee_message_type_filter_by',
299
+				'html_class' => 'wide',
300
+				'default'    => isset($this->_req_data['ee_message_type_filter_by'])
301
+					? sanitize_title($this->_req_data['ee_message_type_filter_by'])
302
+					: 'none_selected',
303
+			)
304
+		);
305
+        
306
+		return $input->get_html_for_input();
307
+	}
308 308
 
309 309
 
310
-    /**
311
-     * Generate select input with provide message type contexts array.
312
-     *
313
-     * @param array $context_options Array of message type contexts indexed by context slug, and values are the
314
-     *                               context label.
315
-     * @return string
316
-     * @throws EE_Error
317
-     */
318
-    public function get_contexts_for_message_types_select_input($context_options)
319
-    {
320
-        //if empty or count of options is one then just return empty string
321
-        if (empty($context_options)
322
-            || ! is_array($context_options)
323
-            || count($context_options) === 1
324
-        ) {
325
-            return '';
326
-        }
327
-        //merge in default
328
-        $context_options = array_merge(
329
-            array('none_selected' => esc_html__('Show all Contexts', 'event_espresso')),
330
-            $context_options
331
-        );
332
-        $input           = new EE_Select_Input(
333
-            $context_options,
334
-            array(
335
-                'html_name'  => 'ee_context_filter_by',
336
-                'html_id'    => 'ee_context_filter_by',
337
-                'html_class' => 'wide',
338
-                'default'    => isset($this->_req_data['ee_context_filter_by'])
339
-                    ? sanitize_title($this->_req_data['ee_context_filter_by'])
340
-                    : 'none_selected',
341
-            )
342
-        );
343
-        
344
-        return $input->get_html_for_input();
345
-    }
310
+	/**
311
+	 * Generate select input with provide message type contexts array.
312
+	 *
313
+	 * @param array $context_options Array of message type contexts indexed by context slug, and values are the
314
+	 *                               context label.
315
+	 * @return string
316
+	 * @throws EE_Error
317
+	 */
318
+	public function get_contexts_for_message_types_select_input($context_options)
319
+	{
320
+		//if empty or count of options is one then just return empty string
321
+		if (empty($context_options)
322
+			|| ! is_array($context_options)
323
+			|| count($context_options) === 1
324
+		) {
325
+			return '';
326
+		}
327
+		//merge in default
328
+		$context_options = array_merge(
329
+			array('none_selected' => esc_html__('Show all Contexts', 'event_espresso')),
330
+			$context_options
331
+		);
332
+		$input           = new EE_Select_Input(
333
+			$context_options,
334
+			array(
335
+				'html_name'  => 'ee_context_filter_by',
336
+				'html_id'    => 'ee_context_filter_by',
337
+				'html_class' => 'wide',
338
+				'default'    => isset($this->_req_data['ee_context_filter_by'])
339
+					? sanitize_title($this->_req_data['ee_context_filter_by'])
340
+					: 'none_selected',
341
+			)
342
+		);
343
+        
344
+		return $input->get_html_for_input();
345
+	}
346 346
     
347 347
     
348
-    protected function _ajax_hooks()
349
-    {
350
-        add_action('wp_ajax_activate_messenger', array($this, 'activate_messenger_toggle'));
351
-        add_action('wp_ajax_activate_mt', array($this, 'activate_mt_toggle'));
352
-        add_action('wp_ajax_ee_msgs_save_settings', array($this, 'save_settings'));
353
-        add_action('wp_ajax_ee_msgs_update_mt_form', array($this, 'update_mt_form'));
354
-        add_action('wp_ajax_switch_template_pack', array($this, 'switch_template_pack'));
355
-        add_action('wp_ajax_toggle_context_template', array($this, 'toggle_context_template'));
356
-    }
348
+	protected function _ajax_hooks()
349
+	{
350
+		add_action('wp_ajax_activate_messenger', array($this, 'activate_messenger_toggle'));
351
+		add_action('wp_ajax_activate_mt', array($this, 'activate_mt_toggle'));
352
+		add_action('wp_ajax_ee_msgs_save_settings', array($this, 'save_settings'));
353
+		add_action('wp_ajax_ee_msgs_update_mt_form', array($this, 'update_mt_form'));
354
+		add_action('wp_ajax_switch_template_pack', array($this, 'switch_template_pack'));
355
+		add_action('wp_ajax_toggle_context_template', array($this, 'toggle_context_template'));
356
+	}
357 357
     
358 358
     
359
-    protected function _define_page_props()
360
-    {
361
-        $this->_admin_page_title = $this->page_label;
362
-        $this->_labels           = array(
363
-            'buttons'    => array(
364
-                'add'    => esc_html__('Add New Message Template', 'event_espresso'),
365
-                'edit'   => esc_html__('Edit Message Template', 'event_espresso'),
366
-                'delete' => esc_html__('Delete Message Template', 'event_espresso')
367
-            ),
368
-            'publishbox' => esc_html__('Update Actions', 'event_espresso')
369
-        );
370
-    }
359
+	protected function _define_page_props()
360
+	{
361
+		$this->_admin_page_title = $this->page_label;
362
+		$this->_labels           = array(
363
+			'buttons'    => array(
364
+				'add'    => esc_html__('Add New Message Template', 'event_espresso'),
365
+				'edit'   => esc_html__('Edit Message Template', 'event_espresso'),
366
+				'delete' => esc_html__('Delete Message Template', 'event_espresso')
367
+			),
368
+			'publishbox' => esc_html__('Update Actions', 'event_espresso')
369
+		);
370
+	}
371 371
     
372 372
     
373
-    /**
374
-     *        an array for storing key => value pairs of request actions and their corresponding methods
375
-     * @access protected
376
-     * @return void
377
-     */
378
-    protected function _set_page_routes()
379
-    {
380
-        $grp_id = ! empty($this->_req_data['GRP_ID']) && ! is_array($this->_req_data['GRP_ID'])
381
-            ? $this->_req_data['GRP_ID']
382
-            : 0;
383
-        $grp_id = empty($grp_id) && ! empty($this->_req_data['id'])
384
-            ? $this->_req_data['id']
385
-            : $grp_id;
386
-        $msg_id = ! empty($this->_req_data['MSG_ID']) && ! is_array($this->_req_data['MSG_ID'])
387
-            ? $this->_req_data['MSG_ID']
388
-            : 0;
389
-        
390
-        $this->_page_routes = array(
391
-            'default'                          => array(
392
-                'func'       => '_message_queue_list_table',
393
-                'capability' => 'ee_read_global_messages'
394
-            ),
395
-            'global_mtps'                      => array(
396
-                'func'       => '_ee_default_messages_overview_list_table',
397
-                'capability' => 'ee_read_global_messages'
398
-            ),
399
-            'custom_mtps'                      => array(
400
-                'func'       => '_custom_mtps_preview',
401
-                'capability' => 'ee_read_messages'
402
-            ),
403
-            'add_new_message_template'         => array(
404
-                'func'       => '_add_message_template',
405
-                'capability' => 'ee_edit_messages',
406
-                'noheader'   => true
407
-            ),
408
-            'edit_message_template'            => array(
409
-                'func'       => '_edit_message_template',
410
-                'capability' => 'ee_edit_message',
411
-                'obj_id'     => $grp_id
412
-            ),
413
-            'preview_message'                  => array(
414
-                'func'               => '_preview_message',
415
-                'capability'         => 'ee_read_message',
416
-                'obj_id'             => $grp_id,
417
-                'noheader'           => true,
418
-                'headers_sent_route' => 'display_preview_message'
419
-            ),
420
-            'display_preview_message'          => array(
421
-                'func'       => '_display_preview_message',
422
-                'capability' => 'ee_read_message',
423
-                'obj_id'     => $grp_id
424
-            ),
425
-            'insert_message_template'          => array(
426
-                'func'       => '_insert_or_update_message_template',
427
-                'capability' => 'ee_edit_messages',
428
-                'args'       => array('new_template' => true),
429
-                'noheader'   => true
430
-            ),
431
-            'update_message_template'          => array(
432
-                'func'       => '_insert_or_update_message_template',
433
-                'capability' => 'ee_edit_message',
434
-                'obj_id'     => $grp_id,
435
-                'args'       => array('new_template' => false),
436
-                'noheader'   => true
437
-            ),
438
-            'trash_message_template'           => array(
439
-                'func'       => '_trash_or_restore_message_template',
440
-                'capability' => 'ee_delete_message',
441
-                'obj_id'     => $grp_id,
442
-                'args'       => array('trash' => true, 'all' => true),
443
-                'noheader'   => true
444
-            ),
445
-            'trash_message_template_context'   => array(
446
-                'func'       => '_trash_or_restore_message_template',
447
-                'capability' => 'ee_delete_message',
448
-                'obj_id'     => $grp_id,
449
-                'args'       => array('trash' => true),
450
-                'noheader'   => true
451
-            ),
452
-            'restore_message_template'         => array(
453
-                'func'       => '_trash_or_restore_message_template',
454
-                'capability' => 'ee_delete_message',
455
-                'obj_id'     => $grp_id,
456
-                'args'       => array('trash' => false, 'all' => true),
457
-                'noheader'   => true
458
-            ),
459
-            'restore_message_template_context' => array(
460
-                'func'       => '_trash_or_restore_message_template',
461
-                'capability' => 'ee_delete_message',
462
-                'obj_id'     => $grp_id,
463
-                'args'       => array('trash' => false),
464
-                'noheader'   => true
465
-            ),
466
-            'delete_message_template'          => array(
467
-                'func'       => '_delete_message_template',
468
-                'capability' => 'ee_delete_message',
469
-                'obj_id'     => $grp_id,
470
-                'noheader'   => true
471
-            ),
472
-            'reset_to_default'                 => array(
473
-                'func'       => '_reset_to_default_template',
474
-                'capability' => 'ee_edit_message',
475
-                'obj_id'     => $grp_id,
476
-                'noheader'   => true
477
-            ),
478
-            'settings'                         => array(
479
-                'func'       => '_settings',
480
-                'capability' => 'manage_options'
481
-            ),
482
-            'update_global_settings'           => array(
483
-                'func'       => '_update_global_settings',
484
-                'capability' => 'manage_options',
485
-                'noheader'   => true
486
-            ),
487
-            'generate_now'                     => array(
488
-                'func'       => '_generate_now',
489
-                'capability' => 'ee_send_message',
490
-                'noheader'   => true
491
-            ),
492
-            'generate_and_send_now'            => array(
493
-                'func'       => '_generate_and_send_now',
494
-                'capability' => 'ee_send_message',
495
-                'noheader'   => true
496
-            ),
497
-            'queue_for_resending'              => array(
498
-                'func'       => '_queue_for_resending',
499
-                'capability' => 'ee_send_message',
500
-                'noheader'   => true
501
-            ),
502
-            'send_now'                         => array(
503
-                'func'       => '_send_now',
504
-                'capability' => 'ee_send_message',
505
-                'noheader'   => true
506
-            ),
507
-            'delete_ee_message'                => array(
508
-                'func'       => '_delete_ee_messages',
509
-                'capability' => 'ee_delete_messages',
510
-                'noheader'   => true
511
-            ),
512
-            'delete_ee_messages'               => array(
513
-                'func'       => '_delete_ee_messages',
514
-                'capability' => 'ee_delete_messages',
515
-                'noheader'   => true,
516
-                'obj_id'     => $msg_id
517
-            )
518
-        );
519
-    }
373
+	/**
374
+	 *        an array for storing key => value pairs of request actions and their corresponding methods
375
+	 * @access protected
376
+	 * @return void
377
+	 */
378
+	protected function _set_page_routes()
379
+	{
380
+		$grp_id = ! empty($this->_req_data['GRP_ID']) && ! is_array($this->_req_data['GRP_ID'])
381
+			? $this->_req_data['GRP_ID']
382
+			: 0;
383
+		$grp_id = empty($grp_id) && ! empty($this->_req_data['id'])
384
+			? $this->_req_data['id']
385
+			: $grp_id;
386
+		$msg_id = ! empty($this->_req_data['MSG_ID']) && ! is_array($this->_req_data['MSG_ID'])
387
+			? $this->_req_data['MSG_ID']
388
+			: 0;
389
+        
390
+		$this->_page_routes = array(
391
+			'default'                          => array(
392
+				'func'       => '_message_queue_list_table',
393
+				'capability' => 'ee_read_global_messages'
394
+			),
395
+			'global_mtps'                      => array(
396
+				'func'       => '_ee_default_messages_overview_list_table',
397
+				'capability' => 'ee_read_global_messages'
398
+			),
399
+			'custom_mtps'                      => array(
400
+				'func'       => '_custom_mtps_preview',
401
+				'capability' => 'ee_read_messages'
402
+			),
403
+			'add_new_message_template'         => array(
404
+				'func'       => '_add_message_template',
405
+				'capability' => 'ee_edit_messages',
406
+				'noheader'   => true
407
+			),
408
+			'edit_message_template'            => array(
409
+				'func'       => '_edit_message_template',
410
+				'capability' => 'ee_edit_message',
411
+				'obj_id'     => $grp_id
412
+			),
413
+			'preview_message'                  => array(
414
+				'func'               => '_preview_message',
415
+				'capability'         => 'ee_read_message',
416
+				'obj_id'             => $grp_id,
417
+				'noheader'           => true,
418
+				'headers_sent_route' => 'display_preview_message'
419
+			),
420
+			'display_preview_message'          => array(
421
+				'func'       => '_display_preview_message',
422
+				'capability' => 'ee_read_message',
423
+				'obj_id'     => $grp_id
424
+			),
425
+			'insert_message_template'          => array(
426
+				'func'       => '_insert_or_update_message_template',
427
+				'capability' => 'ee_edit_messages',
428
+				'args'       => array('new_template' => true),
429
+				'noheader'   => true
430
+			),
431
+			'update_message_template'          => array(
432
+				'func'       => '_insert_or_update_message_template',
433
+				'capability' => 'ee_edit_message',
434
+				'obj_id'     => $grp_id,
435
+				'args'       => array('new_template' => false),
436
+				'noheader'   => true
437
+			),
438
+			'trash_message_template'           => array(
439
+				'func'       => '_trash_or_restore_message_template',
440
+				'capability' => 'ee_delete_message',
441
+				'obj_id'     => $grp_id,
442
+				'args'       => array('trash' => true, 'all' => true),
443
+				'noheader'   => true
444
+			),
445
+			'trash_message_template_context'   => array(
446
+				'func'       => '_trash_or_restore_message_template',
447
+				'capability' => 'ee_delete_message',
448
+				'obj_id'     => $grp_id,
449
+				'args'       => array('trash' => true),
450
+				'noheader'   => true
451
+			),
452
+			'restore_message_template'         => array(
453
+				'func'       => '_trash_or_restore_message_template',
454
+				'capability' => 'ee_delete_message',
455
+				'obj_id'     => $grp_id,
456
+				'args'       => array('trash' => false, 'all' => true),
457
+				'noheader'   => true
458
+			),
459
+			'restore_message_template_context' => array(
460
+				'func'       => '_trash_or_restore_message_template',
461
+				'capability' => 'ee_delete_message',
462
+				'obj_id'     => $grp_id,
463
+				'args'       => array('trash' => false),
464
+				'noheader'   => true
465
+			),
466
+			'delete_message_template'          => array(
467
+				'func'       => '_delete_message_template',
468
+				'capability' => 'ee_delete_message',
469
+				'obj_id'     => $grp_id,
470
+				'noheader'   => true
471
+			),
472
+			'reset_to_default'                 => array(
473
+				'func'       => '_reset_to_default_template',
474
+				'capability' => 'ee_edit_message',
475
+				'obj_id'     => $grp_id,
476
+				'noheader'   => true
477
+			),
478
+			'settings'                         => array(
479
+				'func'       => '_settings',
480
+				'capability' => 'manage_options'
481
+			),
482
+			'update_global_settings'           => array(
483
+				'func'       => '_update_global_settings',
484
+				'capability' => 'manage_options',
485
+				'noheader'   => true
486
+			),
487
+			'generate_now'                     => array(
488
+				'func'       => '_generate_now',
489
+				'capability' => 'ee_send_message',
490
+				'noheader'   => true
491
+			),
492
+			'generate_and_send_now'            => array(
493
+				'func'       => '_generate_and_send_now',
494
+				'capability' => 'ee_send_message',
495
+				'noheader'   => true
496
+			),
497
+			'queue_for_resending'              => array(
498
+				'func'       => '_queue_for_resending',
499
+				'capability' => 'ee_send_message',
500
+				'noheader'   => true
501
+			),
502
+			'send_now'                         => array(
503
+				'func'       => '_send_now',
504
+				'capability' => 'ee_send_message',
505
+				'noheader'   => true
506
+			),
507
+			'delete_ee_message'                => array(
508
+				'func'       => '_delete_ee_messages',
509
+				'capability' => 'ee_delete_messages',
510
+				'noheader'   => true
511
+			),
512
+			'delete_ee_messages'               => array(
513
+				'func'       => '_delete_ee_messages',
514
+				'capability' => 'ee_delete_messages',
515
+				'noheader'   => true,
516
+				'obj_id'     => $msg_id
517
+			)
518
+		);
519
+	}
520 520
     
521 521
     
522
-    protected function _set_page_config()
523
-    {
524
-        $this->_page_config = array(
525
-            'default'                  => array(
526
-                'nav'           => array(
527
-                    'label' => esc_html__('Message Activity', 'event_espresso'),
528
-                    'order' => 10
529
-                ),
530
-                'list_table'    => 'EE_Message_List_Table',
531
-                // 'qtips' => array( 'EE_Message_List_Table_Tips' ),
532
-                'require_nonce' => false
533
-            ),
534
-            'global_mtps'              => array(
535
-                'nav'           => array(
536
-                    'label' => esc_html__('Default Message Templates', 'event_espresso'),
537
-                    'order' => 20
538
-                ),
539
-                'list_table'    => 'Messages_Template_List_Table',
540
-                'help_tabs'     => array(
541
-                    'messages_overview_help_tab'                                => array(
542
-                        'title'    => esc_html__('Messages Overview', 'event_espresso'),
543
-                        'filename' => 'messages_overview'
544
-                    ),
545
-                    'messages_overview_messages_table_column_headings_help_tab' => array(
546
-                        'title'    => esc_html__('Messages Table Column Headings', 'event_espresso'),
547
-                        'filename' => 'messages_overview_table_column_headings'
548
-                    ),
549
-                    'messages_overview_messages_filters_help_tab'               => array(
550
-                        'title'    => esc_html__('Message Filters', 'event_espresso'),
551
-                        'filename' => 'messages_overview_filters'
552
-                    ),
553
-                    'messages_overview_messages_views_help_tab'                 => array(
554
-                        'title'    => esc_html__('Message Views', 'event_espresso'),
555
-                        'filename' => 'messages_overview_views'
556
-                    ),
557
-                    'message_overview_message_types_help_tab'                   => array(
558
-                        'title'    => esc_html__('Message Types', 'event_espresso'),
559
-                        'filename' => 'messages_overview_types'
560
-                    ),
561
-                    'messages_overview_messengers_help_tab'                     => array(
562
-                        'title'    => esc_html__('Messengers', 'event_espresso'),
563
-                        'filename' => 'messages_overview_messengers',
564
-                    ),
565
-                ),
566
-                'help_tour'     => array('Messages_Overview_Help_Tour'),
567
-                'require_nonce' => false
568
-            ),
569
-            'custom_mtps'              => array(
570
-                'nav'           => array(
571
-                    'label' => esc_html__('Custom Message Templates', 'event_espresso'),
572
-                    'order' => 30
573
-                ),
574
-                'help_tabs'     => array(),
575
-                'help_tour'     => array(),
576
-                'require_nonce' => false
577
-            ),
578
-            'add_new_message_template' => array(
579
-                'nav'           => array(
580
-                    'label'      => esc_html__('Add New Message Templates', 'event_espresso'),
581
-                    'order'      => 5,
582
-                    'persistent' => false
583
-                ),
584
-                'require_nonce' => false
585
-            ),
586
-            'edit_message_template'    => array(
587
-                'labels'        => array(
588
-                    'buttons'    => array(
589
-                        'reset' => esc_html__('Reset Templates'),
590
-                    ),
591
-                    'publishbox' => esc_html__('Update Actions', 'event_espresso')
592
-                ),
593
-                'nav'           => array(
594
-                    'label'      => esc_html__('Edit Message Templates', 'event_espresso'),
595
-                    'order'      => 5,
596
-                    'persistent' => false,
597
-                    'url'        => ''
598
-                ),
599
-                'metaboxes'     => array('_publish_post_box', '_register_edit_meta_boxes'),
600
-                'has_metaboxes' => true,
601
-                'help_tour'     => array('Message_Templates_Edit_Help_Tour'),
602
-                'help_tabs'     => array(
603
-                    'edit_message_template'       => array(
604
-                        'title'    => esc_html__('Message Template Editor', 'event_espresso'),
605
-                        'callback' => 'edit_message_template_help_tab'
606
-                    ),
607
-                    'message_templates_help_tab'  => array(
608
-                        'title'    => esc_html__('Message Templates', 'event_espresso'),
609
-                        'filename' => 'messages_templates'
610
-                    ),
611
-                    'message_template_shortcodes' => array(
612
-                        'title'    => esc_html__('Message Shortcodes', 'event_espresso'),
613
-                        'callback' => 'message_template_shortcodes_help_tab'
614
-                    ),
615
-                    'message_preview_help_tab'    => array(
616
-                        'title'    => esc_html__('Message Preview', 'event_espresso'),
617
-                        'filename' => 'messages_preview'
618
-                    ),
619
-                    'messages_overview_other_help_tab'                          => array(
620
-                        'title'    => esc_html__('Messages Other', 'event_espresso'),
621
-                        'filename' => 'messages_overview_other',
622
-                    ),
623
-                ),
624
-                'require_nonce' => false
625
-            ),
626
-            'display_preview_message'  => array(
627
-                'nav'           => array(
628
-                    'label'      => esc_html__('Message Preview', 'event_espresso'),
629
-                    'order'      => 5,
630
-                    'url'        => '',
631
-                    'persistent' => false
632
-                ),
633
-                'help_tabs'     => array(
634
-                    'preview_message' => array(
635
-                        'title'    => esc_html__('About Previews', 'event_espresso'),
636
-                        'callback' => 'preview_message_help_tab'
637
-                    )
638
-                ),
639
-                'require_nonce' => false
640
-            ),
641
-            'settings'                 => array(
642
-                'nav'           => array(
643
-                    'label' => esc_html__('Settings', 'event_espresso'),
644
-                    'order' => 40
645
-                ),
646
-                'metaboxes'     => array('_messages_settings_metaboxes'),
647
-                'help_tabs'     => array(
648
-                    'messages_settings_help_tab'               => array(
649
-                        'title'    => esc_html__('Messages Settings', 'event_espresso'),
650
-                        'filename' => 'messages_settings'
651
-                    ),
652
-                    'messages_settings_message_types_help_tab' => array(
653
-                        'title'    => esc_html__('Activating / Deactivating Message Types', 'event_espresso'),
654
-                        'filename' => 'messages_settings_message_types'
655
-                    ),
656
-                    'messages_settings_messengers_help_tab'    => array(
657
-                        'title'    => esc_html__('Activating / Deactivating Messengers', 'event_espresso'),
658
-                        'filename' => 'messages_settings_messengers'
659
-                    ),
660
-                ),
661
-                'help_tour'     => array('Messages_Settings_Help_Tour'),
662
-                'require_nonce' => false
663
-            )
664
-        );
665
-    }
522
+	protected function _set_page_config()
523
+	{
524
+		$this->_page_config = array(
525
+			'default'                  => array(
526
+				'nav'           => array(
527
+					'label' => esc_html__('Message Activity', 'event_espresso'),
528
+					'order' => 10
529
+				),
530
+				'list_table'    => 'EE_Message_List_Table',
531
+				// 'qtips' => array( 'EE_Message_List_Table_Tips' ),
532
+				'require_nonce' => false
533
+			),
534
+			'global_mtps'              => array(
535
+				'nav'           => array(
536
+					'label' => esc_html__('Default Message Templates', 'event_espresso'),
537
+					'order' => 20
538
+				),
539
+				'list_table'    => 'Messages_Template_List_Table',
540
+				'help_tabs'     => array(
541
+					'messages_overview_help_tab'                                => array(
542
+						'title'    => esc_html__('Messages Overview', 'event_espresso'),
543
+						'filename' => 'messages_overview'
544
+					),
545
+					'messages_overview_messages_table_column_headings_help_tab' => array(
546
+						'title'    => esc_html__('Messages Table Column Headings', 'event_espresso'),
547
+						'filename' => 'messages_overview_table_column_headings'
548
+					),
549
+					'messages_overview_messages_filters_help_tab'               => array(
550
+						'title'    => esc_html__('Message Filters', 'event_espresso'),
551
+						'filename' => 'messages_overview_filters'
552
+					),
553
+					'messages_overview_messages_views_help_tab'                 => array(
554
+						'title'    => esc_html__('Message Views', 'event_espresso'),
555
+						'filename' => 'messages_overview_views'
556
+					),
557
+					'message_overview_message_types_help_tab'                   => array(
558
+						'title'    => esc_html__('Message Types', 'event_espresso'),
559
+						'filename' => 'messages_overview_types'
560
+					),
561
+					'messages_overview_messengers_help_tab'                     => array(
562
+						'title'    => esc_html__('Messengers', 'event_espresso'),
563
+						'filename' => 'messages_overview_messengers',
564
+					),
565
+				),
566
+				'help_tour'     => array('Messages_Overview_Help_Tour'),
567
+				'require_nonce' => false
568
+			),
569
+			'custom_mtps'              => array(
570
+				'nav'           => array(
571
+					'label' => esc_html__('Custom Message Templates', 'event_espresso'),
572
+					'order' => 30
573
+				),
574
+				'help_tabs'     => array(),
575
+				'help_tour'     => array(),
576
+				'require_nonce' => false
577
+			),
578
+			'add_new_message_template' => array(
579
+				'nav'           => array(
580
+					'label'      => esc_html__('Add New Message Templates', 'event_espresso'),
581
+					'order'      => 5,
582
+					'persistent' => false
583
+				),
584
+				'require_nonce' => false
585
+			),
586
+			'edit_message_template'    => array(
587
+				'labels'        => array(
588
+					'buttons'    => array(
589
+						'reset' => esc_html__('Reset Templates'),
590
+					),
591
+					'publishbox' => esc_html__('Update Actions', 'event_espresso')
592
+				),
593
+				'nav'           => array(
594
+					'label'      => esc_html__('Edit Message Templates', 'event_espresso'),
595
+					'order'      => 5,
596
+					'persistent' => false,
597
+					'url'        => ''
598
+				),
599
+				'metaboxes'     => array('_publish_post_box', '_register_edit_meta_boxes'),
600
+				'has_metaboxes' => true,
601
+				'help_tour'     => array('Message_Templates_Edit_Help_Tour'),
602
+				'help_tabs'     => array(
603
+					'edit_message_template'       => array(
604
+						'title'    => esc_html__('Message Template Editor', 'event_espresso'),
605
+						'callback' => 'edit_message_template_help_tab'
606
+					),
607
+					'message_templates_help_tab'  => array(
608
+						'title'    => esc_html__('Message Templates', 'event_espresso'),
609
+						'filename' => 'messages_templates'
610
+					),
611
+					'message_template_shortcodes' => array(
612
+						'title'    => esc_html__('Message Shortcodes', 'event_espresso'),
613
+						'callback' => 'message_template_shortcodes_help_tab'
614
+					),
615
+					'message_preview_help_tab'    => array(
616
+						'title'    => esc_html__('Message Preview', 'event_espresso'),
617
+						'filename' => 'messages_preview'
618
+					),
619
+					'messages_overview_other_help_tab'                          => array(
620
+						'title'    => esc_html__('Messages Other', 'event_espresso'),
621
+						'filename' => 'messages_overview_other',
622
+					),
623
+				),
624
+				'require_nonce' => false
625
+			),
626
+			'display_preview_message'  => array(
627
+				'nav'           => array(
628
+					'label'      => esc_html__('Message Preview', 'event_espresso'),
629
+					'order'      => 5,
630
+					'url'        => '',
631
+					'persistent' => false
632
+				),
633
+				'help_tabs'     => array(
634
+					'preview_message' => array(
635
+						'title'    => esc_html__('About Previews', 'event_espresso'),
636
+						'callback' => 'preview_message_help_tab'
637
+					)
638
+				),
639
+				'require_nonce' => false
640
+			),
641
+			'settings'                 => array(
642
+				'nav'           => array(
643
+					'label' => esc_html__('Settings', 'event_espresso'),
644
+					'order' => 40
645
+				),
646
+				'metaboxes'     => array('_messages_settings_metaboxes'),
647
+				'help_tabs'     => array(
648
+					'messages_settings_help_tab'               => array(
649
+						'title'    => esc_html__('Messages Settings', 'event_espresso'),
650
+						'filename' => 'messages_settings'
651
+					),
652
+					'messages_settings_message_types_help_tab' => array(
653
+						'title'    => esc_html__('Activating / Deactivating Message Types', 'event_espresso'),
654
+						'filename' => 'messages_settings_message_types'
655
+					),
656
+					'messages_settings_messengers_help_tab'    => array(
657
+						'title'    => esc_html__('Activating / Deactivating Messengers', 'event_espresso'),
658
+						'filename' => 'messages_settings_messengers'
659
+					),
660
+				),
661
+				'help_tour'     => array('Messages_Settings_Help_Tour'),
662
+				'require_nonce' => false
663
+			)
664
+		);
665
+	}
666 666
     
667 667
     
668
-    protected function _add_screen_options()
669
-    {
670
-        //todo
671
-    }
668
+	protected function _add_screen_options()
669
+	{
670
+		//todo
671
+	}
672 672
     
673 673
     
674
-    protected function _add_screen_options_global_mtps()
675
-    {
676
-        /**
677
-         * Note: the reason for the value swap here on $this->_admin_page_title is because $this->_per_page_screen_options
678
-         * uses the $_admin_page_title property and we want different outputs in the different spots.
679
-         */
680
-        $page_title              = $this->_admin_page_title;
681
-        $this->_admin_page_title = esc_html__('Global Message Templates', 'event_espresso');
682
-        $this->_per_page_screen_option();
683
-        $this->_admin_page_title = $page_title;
684
-    }
674
+	protected function _add_screen_options_global_mtps()
675
+	{
676
+		/**
677
+		 * Note: the reason for the value swap here on $this->_admin_page_title is because $this->_per_page_screen_options
678
+		 * uses the $_admin_page_title property and we want different outputs in the different spots.
679
+		 */
680
+		$page_title              = $this->_admin_page_title;
681
+		$this->_admin_page_title = esc_html__('Global Message Templates', 'event_espresso');
682
+		$this->_per_page_screen_option();
683
+		$this->_admin_page_title = $page_title;
684
+	}
685 685
     
686 686
     
687
-    protected function _add_screen_options_default()
688
-    {
689
-        $this->_admin_page_title = esc_html__('Message Activity', 'event_espresso');
690
-        $this->_per_page_screen_option();
691
-    }
687
+	protected function _add_screen_options_default()
688
+	{
689
+		$this->_admin_page_title = esc_html__('Message Activity', 'event_espresso');
690
+		$this->_per_page_screen_option();
691
+	}
692 692
     
693 693
     
694
-    //none of the below group are currently used for Messages
695
-    protected function _add_feature_pointers()
696
-    {
697
-    }
694
+	//none of the below group are currently used for Messages
695
+	protected function _add_feature_pointers()
696
+	{
697
+	}
698 698
     
699
-    public function admin_init()
700
-    {
701
-    }
699
+	public function admin_init()
700
+	{
701
+	}
702 702
     
703
-    public function admin_notices()
704
-    {
705
-    }
703
+	public function admin_notices()
704
+	{
705
+	}
706 706
     
707
-    public function admin_footer_scripts()
708
-    {
709
-    }
707
+	public function admin_footer_scripts()
708
+	{
709
+	}
710 710
     
711 711
     
712
-    public function messages_help_tab()
713
-    {
714
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
715
-    }
712
+	public function messages_help_tab()
713
+	{
714
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
715
+	}
716 716
     
717 717
     
718
-    public function messengers_help_tab()
719
-    {
720
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
721
-    }
718
+	public function messengers_help_tab()
719
+	{
720
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
721
+	}
722 722
     
723 723
     
724
-    public function message_types_help_tab()
725
-    {
726
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
727
-    }
724
+	public function message_types_help_tab()
725
+	{
726
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
727
+	}
728 728
     
729 729
     
730
-    public function messages_overview_help_tab()
731
-    {
732
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
733
-    }
730
+	public function messages_overview_help_tab()
731
+	{
732
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
733
+	}
734 734
     
735 735
     
736
-    public function message_templates_help_tab()
737
-    {
738
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
739
-    }
736
+	public function message_templates_help_tab()
737
+	{
738
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
739
+	}
740 740
     
741 741
     
742
-    public function edit_message_template_help_tab()
743
-    {
744
-        $args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="'
745
-                        . esc_attr__('Editor Title', 'event_espresso')
746
-                        . '" />';
747
-        $args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="'
748
-                        . esc_attr__('Context Switcher and Preview', 'event_espresso')
749
-                        . '" />';
750
-        $args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="'
751
-                        . esc_attr__('Message Template Form Fields', 'event_espresso')
752
-                        . '" />';
753
-        $args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="'
754
-                        . esc_attr__('Shortcodes Metabox', 'event_espresso')
755
-                        . '" />';
756
-        $args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="'
757
-                        . esc_attr__('Publish Metabox', 'event_espresso')
758
-                        . '" />';
759
-        EEH_Template::display_template(
760
-            EE_MSG_TEMPLATE_PATH  . 'ee_msg_messages_templates_editor_help_tab.template.php',
761
-            $args
762
-        );
763
-    }
742
+	public function edit_message_template_help_tab()
743
+	{
744
+		$args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="'
745
+						. esc_attr__('Editor Title', 'event_espresso')
746
+						. '" />';
747
+		$args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="'
748
+						. esc_attr__('Context Switcher and Preview', 'event_espresso')
749
+						. '" />';
750
+		$args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="'
751
+						. esc_attr__('Message Template Form Fields', 'event_espresso')
752
+						. '" />';
753
+		$args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="'
754
+						. esc_attr__('Shortcodes Metabox', 'event_espresso')
755
+						. '" />';
756
+		$args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="'
757
+						. esc_attr__('Publish Metabox', 'event_espresso')
758
+						. '" />';
759
+		EEH_Template::display_template(
760
+			EE_MSG_TEMPLATE_PATH  . 'ee_msg_messages_templates_editor_help_tab.template.php',
761
+			$args
762
+		);
763
+	}
764 764
     
765 765
     
766
-    public function message_template_shortcodes_help_tab()
767
-    {
768
-        $this->_set_shortcodes();
769
-        $args['shortcodes'] = $this->_shortcodes;
770
-        EEH_Template::display_template(
771
-            EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
772
-            $args
773
-        );
774
-    }
766
+	public function message_template_shortcodes_help_tab()
767
+	{
768
+		$this->_set_shortcodes();
769
+		$args['shortcodes'] = $this->_shortcodes;
770
+		EEH_Template::display_template(
771
+			EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
772
+			$args
773
+		);
774
+	}
775 775
     
776 776
     
777
-    public function preview_message_help_tab()
778
-    {
779
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
780
-    }
777
+	public function preview_message_help_tab()
778
+	{
779
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
780
+	}
781 781
     
782 782
     
783
-    public function settings_help_tab()
784
-    {
785
-        $args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png'
786
-                        . '" alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />';
787
-        $args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
788
-                        . '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />';
789
-        $args['img3'] = '<div class="switch">'
790
-                        . '<input class="ee-on-off-toggle ee-toggle-round-flat"'
791
-                        . ' type="checkbox" checked="checked">'
792
-                        . '<label for="ee-on-off-toggle-on"></label>'
793
-                        . '</div>';
794
-        $args['img4'] = '<div class="switch">'
795
-                        . '<input class="ee-on-off-toggle ee-toggle-round-flat"'
796
-                        . ' type="checkbox">'
797
-                        . '<label for="ee-on-off-toggle-on"></label>'
798
-                        . '</div>';
799
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
800
-    }
783
+	public function settings_help_tab()
784
+	{
785
+		$args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png'
786
+						. '" alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />';
787
+		$args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
788
+						. '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />';
789
+		$args['img3'] = '<div class="switch">'
790
+						. '<input class="ee-on-off-toggle ee-toggle-round-flat"'
791
+						. ' type="checkbox" checked="checked">'
792
+						. '<label for="ee-on-off-toggle-on"></label>'
793
+						. '</div>';
794
+		$args['img4'] = '<div class="switch">'
795
+						. '<input class="ee-on-off-toggle ee-toggle-round-flat"'
796
+						. ' type="checkbox">'
797
+						. '<label for="ee-on-off-toggle-on"></label>'
798
+						. '</div>';
799
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
800
+	}
801 801
     
802 802
     
803
-    public function load_scripts_styles()
804
-    {
805
-        wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
806
-        wp_enqueue_style('espresso_ee_msg');
807
-        
808
-        wp_register_script('ee-messages-settings', EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
809
-            array('jquery-ui-droppable', 'ee-serialize-full-array'), EVENT_ESPRESSO_VERSION, true);
810
-        wp_register_script('ee-msg-list-table-js', EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
811
-            array('ee-dialog'), EVENT_ESPRESSO_VERSION);
812
-    }
803
+	public function load_scripts_styles()
804
+	{
805
+		wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
806
+		wp_enqueue_style('espresso_ee_msg');
807
+        
808
+		wp_register_script('ee-messages-settings', EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
809
+			array('jquery-ui-droppable', 'ee-serialize-full-array'), EVENT_ESPRESSO_VERSION, true);
810
+		wp_register_script('ee-msg-list-table-js', EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
811
+			array('ee-dialog'), EVENT_ESPRESSO_VERSION);
812
+	}
813 813
     
814 814
     
815
-    public function load_scripts_styles_default()
816
-    {
817
-        wp_enqueue_script('ee-msg-list-table-js');
818
-    }
815
+	public function load_scripts_styles_default()
816
+	{
817
+		wp_enqueue_script('ee-msg-list-table-js');
818
+	}
819 819
     
820 820
     
821
-    public function wp_editor_css($mce_css)
822
-    {
823
-        //if we're on the edit_message_template route
824
-        if ($this->_req_action === 'edit_message_template' && $this->_active_messenger instanceof EE_messenger) {
825
-            $message_type_name = $this->_active_message_type_name;
821
+	public function wp_editor_css($mce_css)
822
+	{
823
+		//if we're on the edit_message_template route
824
+		if ($this->_req_action === 'edit_message_template' && $this->_active_messenger instanceof EE_messenger) {
825
+			$message_type_name = $this->_active_message_type_name;
826 826
             
827
-            //we're going to REPLACE the existing mce css
828
-            //we need to get the css file location from the active messenger
829
-            $mce_css = $this->_active_messenger->get_variation($this->_template_pack, $message_type_name, true,
830
-                'wpeditor', $this->_variation);
831
-        }
832
-        
833
-        return $mce_css;
834
-    }
827
+			//we're going to REPLACE the existing mce css
828
+			//we need to get the css file location from the active messenger
829
+			$mce_css = $this->_active_messenger->get_variation($this->_template_pack, $message_type_name, true,
830
+				'wpeditor', $this->_variation);
831
+		}
832
+        
833
+		return $mce_css;
834
+	}
835 835
     
836 836
     
837
-    public function load_scripts_styles_edit_message_template()
838
-    {
839
-        
840
-        $this->_set_shortcodes();
841
-        
842
-        EE_Registry::$i18n_js_strings['confirm_default_reset']        = sprintf(
843
-            esc_html__(
844
-                '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.',
845
-                'event_espresso'
846
-            ),
847
-            $this->_message_template_group->messenger_obj()->label['singular'],
848
-            $this->_message_template_group->message_type_obj()->label['singular']
849
-        );
850
-        EE_Registry::$i18n_js_strings['confirm_switch_template_pack'] = esc_html__(
851
-            '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?',
852
-            'event_espresso'
853
-        );
854
-        EE_Registry::$i18n_js_strings['server_error'] = esc_html__(
855
-            'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
856
-            'event_espresso'
857
-        );
858
-        
859
-        wp_register_script(
860
-            'ee_msgs_edit_js',
861
-            EE_MSG_ASSETS_URL . 'ee_message_editor.js',
862
-            array('jquery'),
863
-            EVENT_ESPRESSO_VERSION
864
-        );
865
-        
866
-        wp_enqueue_script('ee_admin_js');
867
-        wp_enqueue_script('ee_msgs_edit_js');
868
-        
869
-        //add in special css for tiny_mce
870
-        add_filter('mce_css', array($this, 'wp_editor_css'));
871
-    }
837
+	public function load_scripts_styles_edit_message_template()
838
+	{
839
+        
840
+		$this->_set_shortcodes();
841
+        
842
+		EE_Registry::$i18n_js_strings['confirm_default_reset']        = sprintf(
843
+			esc_html__(
844
+				'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.',
845
+				'event_espresso'
846
+			),
847
+			$this->_message_template_group->messenger_obj()->label['singular'],
848
+			$this->_message_template_group->message_type_obj()->label['singular']
849
+		);
850
+		EE_Registry::$i18n_js_strings['confirm_switch_template_pack'] = esc_html__(
851
+			'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?',
852
+			'event_espresso'
853
+		);
854
+		EE_Registry::$i18n_js_strings['server_error'] = esc_html__(
855
+			'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
856
+			'event_espresso'
857
+		);
858
+        
859
+		wp_register_script(
860
+			'ee_msgs_edit_js',
861
+			EE_MSG_ASSETS_URL . 'ee_message_editor.js',
862
+			array('jquery'),
863
+			EVENT_ESPRESSO_VERSION
864
+		);
865
+        
866
+		wp_enqueue_script('ee_admin_js');
867
+		wp_enqueue_script('ee_msgs_edit_js');
868
+        
869
+		//add in special css for tiny_mce
870
+		add_filter('mce_css', array($this, 'wp_editor_css'));
871
+	}
872 872
     
873 873
     
874
-    public function load_scripts_styles_display_preview_message()
875
-    {
876
-        
877
-        $this->_set_message_template_group();
878
-        
879
-        if (isset($this->_req_data['messenger'])) {
880
-            $this->_active_messenger = $this->_message_resource_manager->get_active_messenger(
881
-                $this->_req_data['messenger']
882
-            );
883
-        }
884
-        
885
-        $message_type_name = isset($this->_req_data['message_type']) ? $this->_req_data['message_type'] : '';
886
-        
887
-        
888
-        wp_enqueue_style('espresso_preview_css',
889
-            $this->_active_messenger->get_variation(
890
-                $this->_template_pack,
891
-                $message_type_name,
892
-                true,
893
-                'preview',
894
-                $this->_variation
895
-            )
896
-        );
897
-    }
874
+	public function load_scripts_styles_display_preview_message()
875
+	{
876
+        
877
+		$this->_set_message_template_group();
878
+        
879
+		if (isset($this->_req_data['messenger'])) {
880
+			$this->_active_messenger = $this->_message_resource_manager->get_active_messenger(
881
+				$this->_req_data['messenger']
882
+			);
883
+		}
884
+        
885
+		$message_type_name = isset($this->_req_data['message_type']) ? $this->_req_data['message_type'] : '';
886
+        
887
+        
888
+		wp_enqueue_style('espresso_preview_css',
889
+			$this->_active_messenger->get_variation(
890
+				$this->_template_pack,
891
+				$message_type_name,
892
+				true,
893
+				'preview',
894
+				$this->_variation
895
+			)
896
+		);
897
+	}
898 898
     
899 899
     
900
-    public function load_scripts_styles_settings()
901
-    {
902
-        wp_register_style(
903
-            'ee-message-settings',
904
-            EE_MSG_ASSETS_URL . 'ee_message_settings.css',
905
-            array(),
906
-            EVENT_ESPRESSO_VERSION
907
-        );
908
-        wp_enqueue_style('ee-text-links');
909
-        wp_enqueue_style('ee-message-settings');
910
-        wp_enqueue_script('ee-messages-settings');
911
-    }
900
+	public function load_scripts_styles_settings()
901
+	{
902
+		wp_register_style(
903
+			'ee-message-settings',
904
+			EE_MSG_ASSETS_URL . 'ee_message_settings.css',
905
+			array(),
906
+			EVENT_ESPRESSO_VERSION
907
+		);
908
+		wp_enqueue_style('ee-text-links');
909
+		wp_enqueue_style('ee-message-settings');
910
+		wp_enqueue_script('ee-messages-settings');
911
+	}
912 912
     
913 913
     
914
-    /**
915
-     * set views array for List Table
916
-     */
917
-    public function _set_list_table_views_global_mtps()
918
-    {
919
-        $this->_views = array(
920
-            'in_use' => array(
921
-                'slug'        => 'in_use',
922
-                'label'       => esc_html__('In Use', 'event_espresso'),
923
-                'count'       => 0,
924
-            )
925
-        );
926
-    }
914
+	/**
915
+	 * set views array for List Table
916
+	 */
917
+	public function _set_list_table_views_global_mtps()
918
+	{
919
+		$this->_views = array(
920
+			'in_use' => array(
921
+				'slug'        => 'in_use',
922
+				'label'       => esc_html__('In Use', 'event_espresso'),
923
+				'count'       => 0,
924
+			)
925
+		);
926
+	}
927 927
 
928 928
 
929
-    /**
930
-     * Set views array for the Custom Template List Table
931
-     */
932
-    public function _set_list_table_views_custom_mtps()
933
-    {
934
-        $this->_set_list_table_views_global_mtps();
935
-        $this->_views['in_use']['bulk_action'] = array(
936
-                'trash_message_template' => esc_html__('Move to Trash', 'event_espresso')
937
-        );
938
-    }
929
+	/**
930
+	 * Set views array for the Custom Template List Table
931
+	 */
932
+	public function _set_list_table_views_custom_mtps()
933
+	{
934
+		$this->_set_list_table_views_global_mtps();
935
+		$this->_views['in_use']['bulk_action'] = array(
936
+				'trash_message_template' => esc_html__('Move to Trash', 'event_espresso')
937
+		);
938
+	}
939 939
 
940 940
 
941
-    /**
942
-     * set views array for message queue list table
943
-     *
944
-     * @throws InvalidDataTypeException
945
-     * @throws InvalidInterfaceException
946
-     * @throws InvalidArgumentException
947
-     * @throws EE_Error
948
-     * @throws ReflectionException
949
-     */
950
-    public function _set_list_table_views_default()
951
-    {
952
-        EE_Registry::instance()->load_helper('Template');
953
-        
954
-        $common_bulk_actions = EE_Registry::instance()->CAP->current_user_can(
955
-            'ee_send_message',
956
-            'message_list_table_bulk_actions'
957
-        )
958
-            ? array(
959
-                'generate_now'          => esc_html__('Generate Now', 'event_espresso'),
960
-                'generate_and_send_now' => esc_html__('Generate and Send Now', 'event_espresso'),
961
-                'queue_for_resending'   => esc_html__('Queue for Resending', 'event_espresso'),
962
-                'send_now'              => esc_html__('Send Now', 'event_espresso')
963
-            )
964
-            : array();
965
-        
966
-        $delete_bulk_action = EE_Registry::instance()->CAP->current_user_can(
967
-            'ee_delete_messages',
968
-            'message_list_table_bulk_actions'
969
-        )
970
-            ? array('delete_ee_messages' => esc_html__('Delete Messages', 'event_espresso'))
971
-            : array();
972
-        
973
-        
974
-        $this->_views = array(
975
-            'all' => array(
976
-                'slug'        => 'all',
977
-                'label'       => esc_html__('All', 'event_espresso'),
978
-                'count'       => 0,
979
-                'bulk_action' => array_merge($common_bulk_actions, $delete_bulk_action)
980
-            )
981
-        );
982
-        
983
-        
984
-        foreach (EEM_Message::instance()->all_statuses() as $status) {
985
-            if ($status === EEM_Message::status_debug_only && ! EEM_Message::debug()) {
986
-                continue;
987
-            }
988
-            $status_bulk_actions = $common_bulk_actions;
989
-            //unset bulk actions not applying to status
990
-            if (! empty($status_bulk_actions)) {
991
-                switch ($status) {
992
-                    case EEM_Message::status_idle:
993
-                    case EEM_Message::status_resend:
994
-                        $status_bulk_actions['send_now'] = $common_bulk_actions['send_now'];
995
-                        break;
941
+	/**
942
+	 * set views array for message queue list table
943
+	 *
944
+	 * @throws InvalidDataTypeException
945
+	 * @throws InvalidInterfaceException
946
+	 * @throws InvalidArgumentException
947
+	 * @throws EE_Error
948
+	 * @throws ReflectionException
949
+	 */
950
+	public function _set_list_table_views_default()
951
+	{
952
+		EE_Registry::instance()->load_helper('Template');
953
+        
954
+		$common_bulk_actions = EE_Registry::instance()->CAP->current_user_can(
955
+			'ee_send_message',
956
+			'message_list_table_bulk_actions'
957
+		)
958
+			? array(
959
+				'generate_now'          => esc_html__('Generate Now', 'event_espresso'),
960
+				'generate_and_send_now' => esc_html__('Generate and Send Now', 'event_espresso'),
961
+				'queue_for_resending'   => esc_html__('Queue for Resending', 'event_espresso'),
962
+				'send_now'              => esc_html__('Send Now', 'event_espresso')
963
+			)
964
+			: array();
965
+        
966
+		$delete_bulk_action = EE_Registry::instance()->CAP->current_user_can(
967
+			'ee_delete_messages',
968
+			'message_list_table_bulk_actions'
969
+		)
970
+			? array('delete_ee_messages' => esc_html__('Delete Messages', 'event_espresso'))
971
+			: array();
972
+        
973
+        
974
+		$this->_views = array(
975
+			'all' => array(
976
+				'slug'        => 'all',
977
+				'label'       => esc_html__('All', 'event_espresso'),
978
+				'count'       => 0,
979
+				'bulk_action' => array_merge($common_bulk_actions, $delete_bulk_action)
980
+			)
981
+		);
982
+        
983
+        
984
+		foreach (EEM_Message::instance()->all_statuses() as $status) {
985
+			if ($status === EEM_Message::status_debug_only && ! EEM_Message::debug()) {
986
+				continue;
987
+			}
988
+			$status_bulk_actions = $common_bulk_actions;
989
+			//unset bulk actions not applying to status
990
+			if (! empty($status_bulk_actions)) {
991
+				switch ($status) {
992
+					case EEM_Message::status_idle:
993
+					case EEM_Message::status_resend:
994
+						$status_bulk_actions['send_now'] = $common_bulk_actions['send_now'];
995
+						break;
996 996
                     
997
-                    case EEM_Message::status_failed:
998
-                    case EEM_Message::status_debug_only:
999
-                    case EEM_Message::status_messenger_executing:
1000
-                        $status_bulk_actions = array();
1001
-                        break;
997
+					case EEM_Message::status_failed:
998
+					case EEM_Message::status_debug_only:
999
+					case EEM_Message::status_messenger_executing:
1000
+						$status_bulk_actions = array();
1001
+						break;
1002 1002
                     
1003
-                    case EEM_Message::status_incomplete:
1004
-                        unset($status_bulk_actions['queue_for_resending'], $status_bulk_actions['send_now']);
1005
-                        break;
1003
+					case EEM_Message::status_incomplete:
1004
+						unset($status_bulk_actions['queue_for_resending'], $status_bulk_actions['send_now']);
1005
+						break;
1006 1006
                     
1007
-                    case EEM_Message::status_retry:
1008
-                    case EEM_Message::status_sent:
1009
-                        unset($status_bulk_actions['generate_now'], $status_bulk_actions['generate_and_send_now']);
1010
-                        break;
1011
-                }
1012
-            }
1007
+					case EEM_Message::status_retry:
1008
+					case EEM_Message::status_sent:
1009
+						unset($status_bulk_actions['generate_now'], $status_bulk_actions['generate_and_send_now']);
1010
+						break;
1011
+				}
1012
+			}
1013 1013
 
1014
-            //skip adding messenger executing status to views because it will be included with the Failed view.
1015
-            if ( $status === EEM_Message::status_messenger_executing ) {
1016
-                continue;
1017
-            }
1014
+			//skip adding messenger executing status to views because it will be included with the Failed view.
1015
+			if ( $status === EEM_Message::status_messenger_executing ) {
1016
+				continue;
1017
+			}
1018 1018
             
1019
-            $this->_views[strtolower($status)] = array(
1020
-                'slug'        => strtolower($status),
1021
-                'label'       => EEH_Template::pretty_status($status, false, 'sentence'),
1022
-                'count'       => 0,
1023
-                'bulk_action' => array_merge($status_bulk_actions, $delete_bulk_action)
1024
-            );
1025
-        }
1026
-    }
1019
+			$this->_views[strtolower($status)] = array(
1020
+				'slug'        => strtolower($status),
1021
+				'label'       => EEH_Template::pretty_status($status, false, 'sentence'),
1022
+				'count'       => 0,
1023
+				'bulk_action' => array_merge($status_bulk_actions, $delete_bulk_action)
1024
+			);
1025
+		}
1026
+	}
1027 1027
     
1028 1028
     
1029
-    protected function _ee_default_messages_overview_list_table()
1030
-    {
1031
-        $this->_admin_page_title = esc_html__('Default Message Templates', 'event_espresso');
1032
-        $this->display_admin_list_table_page_with_no_sidebar();
1033
-    }
1029
+	protected function _ee_default_messages_overview_list_table()
1030
+	{
1031
+		$this->_admin_page_title = esc_html__('Default Message Templates', 'event_espresso');
1032
+		$this->display_admin_list_table_page_with_no_sidebar();
1033
+	}
1034 1034
     
1035 1035
     
1036
-    protected function _message_queue_list_table()
1037
-    {
1038
-        $this->_search_btn_label                   = esc_html__('Message Activity', 'event_espresso');
1039
-        $this->_template_args['per_column']        = 6;
1040
-        $this->_template_args['after_list_table']  = $this->_display_legend($this->_message_legend_items());
1041
-        $this->_template_args['before_list_table'] = '<h3>'
1042
-                                                     . EEM_Message::instance()->get_pretty_label_for_results()
1043
-                                                     . '</h3>';
1044
-        $this->display_admin_list_table_page_with_no_sidebar();
1045
-    }
1036
+	protected function _message_queue_list_table()
1037
+	{
1038
+		$this->_search_btn_label                   = esc_html__('Message Activity', 'event_espresso');
1039
+		$this->_template_args['per_column']        = 6;
1040
+		$this->_template_args['after_list_table']  = $this->_display_legend($this->_message_legend_items());
1041
+		$this->_template_args['before_list_table'] = '<h3>'
1042
+													 . EEM_Message::instance()->get_pretty_label_for_results()
1043
+													 . '</h3>';
1044
+		$this->display_admin_list_table_page_with_no_sidebar();
1045
+	}
1046 1046
     
1047 1047
     
1048
-    protected function _message_legend_items()
1049
-    {
1050
-        
1051
-        $action_css_classes = EEH_MSG_Template::get_message_action_icons();
1052
-        $action_items       = array();
1053
-        
1054
-        foreach ($action_css_classes as $action_item => $action_details) {
1055
-            if ($action_item === 'see_notifications_for') {
1056
-                continue;
1057
-            }
1058
-            $action_items[$action_item] = array(
1059
-                'class' => $action_details['css_class'],
1060
-                'desc'  => $action_details['label']
1061
-            );
1062
-        }
1063
-        
1064
-        /** @type array $status_items status legend setup */
1065
-        $status_items = array(
1066
-            'sent_status'       => array(
1067
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
1068
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence')
1069
-            ),
1070
-            'idle_status'       => array(
1071
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
1072
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence')
1073
-            ),
1074
-            'failed_status'     => array(
1075
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
1076
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence')
1077
-            ),
1078
-            'messenger_executing_status' => array(
1079
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
1080
-                'desc' => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence')
1081
-            ),
1082
-            'resend_status'     => array(
1083
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
1084
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence')
1085
-            ),
1086
-            'incomplete_status' => array(
1087
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1088
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence')
1089
-            ),
1090
-            'retry_status'      => array(
1091
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1092
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence')
1093
-            )
1094
-        );
1095
-        if (EEM_Message::debug()) {
1096
-            $status_items['debug_only_status'] = array(
1097
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1098
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence')
1099
-            );
1100
-        }
1101
-        
1102
-        return array_merge($action_items, $status_items);
1103
-    }
1048
+	protected function _message_legend_items()
1049
+	{
1050
+        
1051
+		$action_css_classes = EEH_MSG_Template::get_message_action_icons();
1052
+		$action_items       = array();
1053
+        
1054
+		foreach ($action_css_classes as $action_item => $action_details) {
1055
+			if ($action_item === 'see_notifications_for') {
1056
+				continue;
1057
+			}
1058
+			$action_items[$action_item] = array(
1059
+				'class' => $action_details['css_class'],
1060
+				'desc'  => $action_details['label']
1061
+			);
1062
+		}
1063
+        
1064
+		/** @type array $status_items status legend setup */
1065
+		$status_items = array(
1066
+			'sent_status'       => array(
1067
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
1068
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence')
1069
+			),
1070
+			'idle_status'       => array(
1071
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
1072
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence')
1073
+			),
1074
+			'failed_status'     => array(
1075
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
1076
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence')
1077
+			),
1078
+			'messenger_executing_status' => array(
1079
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
1080
+				'desc' => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence')
1081
+			),
1082
+			'resend_status'     => array(
1083
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
1084
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence')
1085
+			),
1086
+			'incomplete_status' => array(
1087
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1088
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence')
1089
+			),
1090
+			'retry_status'      => array(
1091
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1092
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence')
1093
+			)
1094
+		);
1095
+		if (EEM_Message::debug()) {
1096
+			$status_items['debug_only_status'] = array(
1097
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1098
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence')
1099
+			);
1100
+		}
1101
+        
1102
+		return array_merge($action_items, $status_items);
1103
+	}
1104 1104
     
1105 1105
     
1106
-    protected function _custom_mtps_preview()
1107
-    {
1108
-        $this->_admin_page_title              = esc_html__('Custom Message Templates (Preview)', 'event_espresso');
1109
-        $this->_template_args['preview_img']  = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png"'
1110
-            . ' alt="' . esc_attr__('Preview Custom Message Templates screenshot', 'event_espresso') . '" />';
1111
-        $this->_template_args['preview_text'] = '<strong>'
1112
-            . esc_html__(
1113
-                '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.',
1114
-                'event_espresso'
1115
-            )
1116
-            . '</strong>';
1106
+	protected function _custom_mtps_preview()
1107
+	{
1108
+		$this->_admin_page_title              = esc_html__('Custom Message Templates (Preview)', 'event_espresso');
1109
+		$this->_template_args['preview_img']  = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png"'
1110
+			. ' alt="' . esc_attr__('Preview Custom Message Templates screenshot', 'event_espresso') . '" />';
1111
+		$this->_template_args['preview_text'] = '<strong>'
1112
+			. esc_html__(
1113
+				'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.',
1114
+				'event_espresso'
1115
+			)
1116
+			. '</strong>';
1117 1117
 
1118
-        $this->display_admin_caf_preview_page('custom_message_types', false);
1119
-    }
1118
+		$this->display_admin_caf_preview_page('custom_message_types', false);
1119
+	}
1120 1120
 
1121 1121
 
1122
-    /**
1123
-     * get_message_templates
1124
-     * This gets all the message templates for listing on the overview list.
1125
-     *
1126
-     * @access public
1127
-     * @param int    $perpage the amount of templates groups to show per page
1128
-     * @param string $type    the current _view we're getting templates for
1129
-     * @param bool   $count   return count?
1130
-     * @param bool   $all     disregard any paging info (get all data);
1131
-     * @param bool   $global  whether to return just global (true) or custom templates (false)
1132
-     * @return array
1133
-     * @throws EE_Error
1134
-     * @throws InvalidArgumentException
1135
-     * @throws InvalidDataTypeException
1136
-     * @throws InvalidInterfaceException
1137
-     */
1138
-    public function get_message_templates(
1139
-        $perpage = 10,
1140
-        $type = 'in_use',
1141
-        $count = false,
1142
-        $all = false,
1143
-        $global = true)
1144
-    {
1145
-        
1146
-        $MTP = EEM_Message_Template_Group::instance();
1147
-        
1148
-        $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? 'GRP_ID' : $this->_req_data['orderby'];
1149
-        $orderby                    = $this->_req_data['orderby'];
1150
-        
1151
-        $order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
1152
-            ? $this->_req_data['order']
1153
-            : 'ASC';
1154
-        
1155
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
1156
-            ? $this->_req_data['paged']
1157
-            : 1;
1158
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
1159
-            ? $this->_req_data['perpage']
1160
-            : $perpage;
1161
-        
1162
-        $offset = ($current_page - 1) * $per_page;
1163
-        $limit  = $all ? null : array($offset, $per_page);
1164
-        
1165
-        
1166
-        //options will match what is in the _views array property
1167
-        switch ($type) {
1168
-            case 'in_use':
1169
-                $templates = $MTP->get_all_active_message_templates($orderby, $order, $limit, $count, $global, true);
1170
-                break;
1171
-            default:
1172
-                $templates = $MTP->get_all_trashed_grouped_message_templates($orderby, $order, $limit, $count, $global);
1173
-        }
1174
-        
1175
-        return $templates;
1176
-    }
1122
+	/**
1123
+	 * get_message_templates
1124
+	 * This gets all the message templates for listing on the overview list.
1125
+	 *
1126
+	 * @access public
1127
+	 * @param int    $perpage the amount of templates groups to show per page
1128
+	 * @param string $type    the current _view we're getting templates for
1129
+	 * @param bool   $count   return count?
1130
+	 * @param bool   $all     disregard any paging info (get all data);
1131
+	 * @param bool   $global  whether to return just global (true) or custom templates (false)
1132
+	 * @return array
1133
+	 * @throws EE_Error
1134
+	 * @throws InvalidArgumentException
1135
+	 * @throws InvalidDataTypeException
1136
+	 * @throws InvalidInterfaceException
1137
+	 */
1138
+	public function get_message_templates(
1139
+		$perpage = 10,
1140
+		$type = 'in_use',
1141
+		$count = false,
1142
+		$all = false,
1143
+		$global = true)
1144
+	{
1145
+        
1146
+		$MTP = EEM_Message_Template_Group::instance();
1147
+        
1148
+		$this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? 'GRP_ID' : $this->_req_data['orderby'];
1149
+		$orderby                    = $this->_req_data['orderby'];
1150
+        
1151
+		$order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
1152
+			? $this->_req_data['order']
1153
+			: 'ASC';
1154
+        
1155
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
1156
+			? $this->_req_data['paged']
1157
+			: 1;
1158
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
1159
+			? $this->_req_data['perpage']
1160
+			: $perpage;
1161
+        
1162
+		$offset = ($current_page - 1) * $per_page;
1163
+		$limit  = $all ? null : array($offset, $per_page);
1164
+        
1165
+        
1166
+		//options will match what is in the _views array property
1167
+		switch ($type) {
1168
+			case 'in_use':
1169
+				$templates = $MTP->get_all_active_message_templates($orderby, $order, $limit, $count, $global, true);
1170
+				break;
1171
+			default:
1172
+				$templates = $MTP->get_all_trashed_grouped_message_templates($orderby, $order, $limit, $count, $global);
1173
+		}
1174
+        
1175
+		return $templates;
1176
+	}
1177 1177
     
1178 1178
     
1179
-    /**
1180
-     * filters etc might need a list of installed message_types
1181
-     * @return array an array of message type objects
1182
-     */
1183
-    public function get_installed_message_types()
1184
-    {
1185
-        $installed_message_types = $this->_message_resource_manager->installed_message_types();
1186
-        $installed               = array();
1187
-        
1188
-        foreach ($installed_message_types as $message_type) {
1189
-            $installed[$message_type->name] = $message_type;
1190
-        }
1191
-        
1192
-        return $installed;
1193
-    }
1179
+	/**
1180
+	 * filters etc might need a list of installed message_types
1181
+	 * @return array an array of message type objects
1182
+	 */
1183
+	public function get_installed_message_types()
1184
+	{
1185
+		$installed_message_types = $this->_message_resource_manager->installed_message_types();
1186
+		$installed               = array();
1187
+        
1188
+		foreach ($installed_message_types as $message_type) {
1189
+			$installed[$message_type->name] = $message_type;
1190
+		}
1191
+        
1192
+		return $installed;
1193
+	}
1194 1194
     
1195 1195
     
1196
-    /**
1197
-     * _add_message_template
1198
-     *
1199
-     * This is used when creating a custom template. All Custom Templates start based off another template.
1200
-     *
1201
-     * @param string $message_type
1202
-     * @param string $messenger
1203
-     * @param string $GRP_ID
1204
-     *
1205
-     * @throws EE_error
1206
-     */
1207
-    protected function _add_message_template($message_type = '', $messenger = '', $GRP_ID = '')
1208
-    {
1209
-        //set values override any request data
1210
-        $message_type = ! empty($message_type) ? $message_type : '';
1211
-        $message_type = empty($message_type) && ! empty($this->_req_data['message_type'])
1212
-            ? $this->_req_data['message_type']
1213
-            : $message_type;
1214
-        
1215
-        $messenger = ! empty($messenger) ? $messenger : '';
1216
-        $messenger = empty($messenger) && ! empty($this->_req_data['messenger'])
1217
-            ? $this->_req_data['messenger']
1218
-            : $messenger;
1219
-        
1220
-        $GRP_ID = ! empty($GRP_ID) ? $GRP_ID : '';
1221
-        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : $GRP_ID;
1222
-        
1223
-        //we need messenger and message type.  They should be coming from the event editor. If not here then return error
1224
-        if (empty($message_type) || empty($messenger)) {
1225
-            throw new EE_Error(
1226
-                esc_html__(
1227
-                    'Sorry, but we can\'t create new templates because we\'re missing the messenger or message type',
1228
-                    'event_espresso'
1229
-                )
1230
-            );
1231
-        }
1232
-        
1233
-        //we need the GRP_ID for the template being used as the base for the new template
1234
-        if (empty($GRP_ID)) {
1235
-            throw new EE_Error(
1236
-                esc_html__(
1237
-                    'In order to create a custom message template the GRP_ID of the template being used as a base is needed',
1238
-                    'event_espresso'
1239
-                )
1240
-            );
1241
-        }
1242
-        
1243
-        //let's just make sure the template gets generated!
1244
-        
1245
-        //we need to reassign some variables for what the insert is expecting
1246
-        $this->_req_data['MTP_messenger']    = $messenger;
1247
-        $this->_req_data['MTP_message_type'] = $message_type;
1248
-        $this->_req_data['GRP_ID']           = $GRP_ID;
1249
-        $this->_insert_or_update_message_template(true);
1250
-    }
1196
+	/**
1197
+	 * _add_message_template
1198
+	 *
1199
+	 * This is used when creating a custom template. All Custom Templates start based off another template.
1200
+	 *
1201
+	 * @param string $message_type
1202
+	 * @param string $messenger
1203
+	 * @param string $GRP_ID
1204
+	 *
1205
+	 * @throws EE_error
1206
+	 */
1207
+	protected function _add_message_template($message_type = '', $messenger = '', $GRP_ID = '')
1208
+	{
1209
+		//set values override any request data
1210
+		$message_type = ! empty($message_type) ? $message_type : '';
1211
+		$message_type = empty($message_type) && ! empty($this->_req_data['message_type'])
1212
+			? $this->_req_data['message_type']
1213
+			: $message_type;
1214
+        
1215
+		$messenger = ! empty($messenger) ? $messenger : '';
1216
+		$messenger = empty($messenger) && ! empty($this->_req_data['messenger'])
1217
+			? $this->_req_data['messenger']
1218
+			: $messenger;
1219
+        
1220
+		$GRP_ID = ! empty($GRP_ID) ? $GRP_ID : '';
1221
+		$GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : $GRP_ID;
1222
+        
1223
+		//we need messenger and message type.  They should be coming from the event editor. If not here then return error
1224
+		if (empty($message_type) || empty($messenger)) {
1225
+			throw new EE_Error(
1226
+				esc_html__(
1227
+					'Sorry, but we can\'t create new templates because we\'re missing the messenger or message type',
1228
+					'event_espresso'
1229
+				)
1230
+			);
1231
+		}
1232
+        
1233
+		//we need the GRP_ID for the template being used as the base for the new template
1234
+		if (empty($GRP_ID)) {
1235
+			throw new EE_Error(
1236
+				esc_html__(
1237
+					'In order to create a custom message template the GRP_ID of the template being used as a base is needed',
1238
+					'event_espresso'
1239
+				)
1240
+			);
1241
+		}
1242
+        
1243
+		//let's just make sure the template gets generated!
1244
+        
1245
+		//we need to reassign some variables for what the insert is expecting
1246
+		$this->_req_data['MTP_messenger']    = $messenger;
1247
+		$this->_req_data['MTP_message_type'] = $message_type;
1248
+		$this->_req_data['GRP_ID']           = $GRP_ID;
1249
+		$this->_insert_or_update_message_template(true);
1250
+	}
1251 1251
 
1252 1252
 
1253
-    /**
1254
-     * public wrapper for the _add_message_template method
1255
-     *
1256
-     * @param string $message_type     message type slug
1257
-     * @param string $messenger        messenger slug
1258
-     * @param int    $GRP_ID           GRP_ID for the related message template group this new template will be based
1259
-     *                                 off of.
1260
-     * @throws EE_error
1261
-     */
1262
-    public function add_message_template($message_type, $messenger, $GRP_ID)
1263
-    {
1264
-        $this->_add_message_template($message_type, $messenger, $GRP_ID);
1265
-    }
1253
+	/**
1254
+	 * public wrapper for the _add_message_template method
1255
+	 *
1256
+	 * @param string $message_type     message type slug
1257
+	 * @param string $messenger        messenger slug
1258
+	 * @param int    $GRP_ID           GRP_ID for the related message template group this new template will be based
1259
+	 *                                 off of.
1260
+	 * @throws EE_error
1261
+	 */
1262
+	public function add_message_template($message_type, $messenger, $GRP_ID)
1263
+	{
1264
+		$this->_add_message_template($message_type, $messenger, $GRP_ID);
1265
+	}
1266 1266
 
1267 1267
 
1268
-    /**
1269
-     * _edit_message_template
1270
-     *
1271
-     * @access protected
1272
-     * @return void
1273
-     * @throws InvalidIdentifierException
1274
-     * @throws DomainException
1275
-     * @throws EE_Error
1276
-     * @throws InvalidArgumentException
1277
-     * @throws ReflectionException
1278
-     * @throws InvalidDataTypeException
1279
-     * @throws InvalidInterfaceException
1280
-     */
1281
-    protected function _edit_message_template()
1282
-    {
1283
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1284
-        $template_fields = '';
1285
-        $sidebar_fields  = '';
1286
-        //we filter the tinyMCE settings to remove the validation since message templates by their nature will not have
1287
-        // valid html in the templates.
1288
-        add_filter('tiny_mce_before_init', array($this, 'filter_tinymce_init'), 10, 2);
1289
-        
1290
-        $GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
1291
-            ? absint($this->_req_data['id'])
1292
-            : false;
1293
-        
1294
-        $this->_set_shortcodes(); //this also sets the _message_template property.
1295
-        $message_template_group = $this->_message_template_group;
1296
-        $c_label                = $message_template_group->context_label();
1297
-        $c_config               = $message_template_group->contexts_config();
1298
-        
1299
-        reset($c_config);
1300
-        $context = isset($this->_req_data['context']) && ! empty($this->_req_data['context'])
1301
-            ? strtolower($this->_req_data['context'])
1302
-            : key($c_config);
1303
-        
1304
-        
1305
-        if (empty($GRP_ID)) {
1306
-            $action = 'insert_message_template';
1307
-            $edit_message_template_form_url = add_query_arg(
1308
-                array('action' => $action, 'noheader' => true),
1309
-                EE_MSG_ADMIN_URL
1310
-            );
1311
-        } else {
1312
-            $action = 'update_message_template';
1313
-            $edit_message_template_form_url = add_query_arg(
1314
-                array('action' => $action, 'noheader' => true),
1315
-                EE_MSG_ADMIN_URL
1316
-            );
1317
-        }
1318
-        
1319
-        //set active messenger for this view
1320
-        $this->_active_messenger         = $this->_message_resource_manager->get_active_messenger(
1321
-            $message_template_group->messenger()
1322
-        );
1323
-        $this->_active_message_type_name = $message_template_group->message_type();
1324
-        
1325
-        
1326
-        //Do we have any validation errors?
1327
-        $validators = $this->_get_transient();
1328
-        $v_fields   = ! empty($validators) ? array_keys($validators) : array();
1329
-        
1330
-        
1331
-        //we need to assemble the title from Various details
1332
-        $context_label = sprintf(
1333
-            esc_html__('(%s %s)', 'event_espresso'),
1334
-            $c_config[$context]['label'],
1335
-            ucwords($c_label['label'])
1336
-        );
1337
-        
1338
-        $title = sprintf(
1339
-            esc_html__(' %s %s Template %s', 'event_espresso'),
1340
-            ucwords($message_template_group->messenger_obj()->label['singular']),
1341
-            ucwords($message_template_group->message_type_obj()->label['singular']),
1342
-            $context_label
1343
-        );
1344
-        
1345
-        $this->_template_args['GRP_ID']           = $GRP_ID;
1346
-        $this->_template_args['message_template'] = $message_template_group;
1347
-        $this->_template_args['is_extra_fields']  = false;
1348
-        
1349
-        
1350
-        //let's get EEH_MSG_Template so we can get template form fields
1351
-        $template_field_structure = EEH_MSG_Template::get_fields(
1352
-            $message_template_group->messenger(),
1353
-            $message_template_group->message_type()
1354
-        );
1355
-        
1356
-        if ( ! $template_field_structure) {
1357
-            $template_field_structure = false;
1358
-            $template_fields          = esc_html__(
1359
-                'There was an error in assembling the fields for this display (you should see an error message)',
1360
-                'event_espresso'
1361
-            );
1362
-        }
1363
-        
1364
-        
1365
-        $message_templates = $message_template_group->context_templates();
1366
-        
1367
-        
1368
-        //if we have the extra key.. then we need to remove the content index from the template_field_structure as it
1369
-        // will get handled in the "extra" array.
1370
-        if (is_array($template_field_structure[$context]) && isset($template_field_structure[$context]['extra'])) {
1371
-            foreach ($template_field_structure[$context]['extra'] as $reference_field => $new_fields) {
1372
-                unset($template_field_structure[$context][$reference_field]);
1373
-            }
1374
-        }
1375
-        
1376
-        //let's loop through the template_field_structure and actually assemble the input fields!
1377
-        if ( ! empty($template_field_structure)) {
1378
-            foreach ($template_field_structure[$context] as $template_field => $field_setup_array) {
1379
-                //if this is an 'extra' template field then we need to remove any existing fields that are keyed up in
1380
-                // the extra array and reset them.
1381
-                if ($template_field === 'extra') {
1382
-                    $this->_template_args['is_extra_fields'] = true;
1383
-                    foreach ($field_setup_array as $reference_field => $new_fields_array) {
1384
-                        $message_template = $message_templates[$context][$reference_field];
1385
-                        $content          = $message_template instanceof EE_Message_Template
1386
-                            ? $message_template->get('MTP_content')
1387
-                            : '';
1388
-                        foreach ($new_fields_array as $extra_field => $extra_array) {
1389
-                            //let's verify if we need this extra field via the shortcodes parameter.
1390
-                            $continue = false;
1391
-                            if (isset($extra_array['shortcodes_required'])) {
1392
-                                foreach ((array)$extra_array['shortcodes_required'] as $shortcode) {
1393
-                                    if ( ! array_key_exists($shortcode, $this->_shortcodes)) {
1394
-                                        $continue = true;
1395
-                                    }
1396
-                                }
1397
-                                if ($continue) {
1398
-                                    continue;
1399
-                                }
1400
-                            }
1268
+	/**
1269
+	 * _edit_message_template
1270
+	 *
1271
+	 * @access protected
1272
+	 * @return void
1273
+	 * @throws InvalidIdentifierException
1274
+	 * @throws DomainException
1275
+	 * @throws EE_Error
1276
+	 * @throws InvalidArgumentException
1277
+	 * @throws ReflectionException
1278
+	 * @throws InvalidDataTypeException
1279
+	 * @throws InvalidInterfaceException
1280
+	 */
1281
+	protected function _edit_message_template()
1282
+	{
1283
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1284
+		$template_fields = '';
1285
+		$sidebar_fields  = '';
1286
+		//we filter the tinyMCE settings to remove the validation since message templates by their nature will not have
1287
+		// valid html in the templates.
1288
+		add_filter('tiny_mce_before_init', array($this, 'filter_tinymce_init'), 10, 2);
1289
+        
1290
+		$GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
1291
+			? absint($this->_req_data['id'])
1292
+			: false;
1293
+        
1294
+		$this->_set_shortcodes(); //this also sets the _message_template property.
1295
+		$message_template_group = $this->_message_template_group;
1296
+		$c_label                = $message_template_group->context_label();
1297
+		$c_config               = $message_template_group->contexts_config();
1298
+        
1299
+		reset($c_config);
1300
+		$context = isset($this->_req_data['context']) && ! empty($this->_req_data['context'])
1301
+			? strtolower($this->_req_data['context'])
1302
+			: key($c_config);
1303
+        
1304
+        
1305
+		if (empty($GRP_ID)) {
1306
+			$action = 'insert_message_template';
1307
+			$edit_message_template_form_url = add_query_arg(
1308
+				array('action' => $action, 'noheader' => true),
1309
+				EE_MSG_ADMIN_URL
1310
+			);
1311
+		} else {
1312
+			$action = 'update_message_template';
1313
+			$edit_message_template_form_url = add_query_arg(
1314
+				array('action' => $action, 'noheader' => true),
1315
+				EE_MSG_ADMIN_URL
1316
+			);
1317
+		}
1318
+        
1319
+		//set active messenger for this view
1320
+		$this->_active_messenger         = $this->_message_resource_manager->get_active_messenger(
1321
+			$message_template_group->messenger()
1322
+		);
1323
+		$this->_active_message_type_name = $message_template_group->message_type();
1324
+        
1325
+        
1326
+		//Do we have any validation errors?
1327
+		$validators = $this->_get_transient();
1328
+		$v_fields   = ! empty($validators) ? array_keys($validators) : array();
1329
+        
1330
+        
1331
+		//we need to assemble the title from Various details
1332
+		$context_label = sprintf(
1333
+			esc_html__('(%s %s)', 'event_espresso'),
1334
+			$c_config[$context]['label'],
1335
+			ucwords($c_label['label'])
1336
+		);
1337
+        
1338
+		$title = sprintf(
1339
+			esc_html__(' %s %s Template %s', 'event_espresso'),
1340
+			ucwords($message_template_group->messenger_obj()->label['singular']),
1341
+			ucwords($message_template_group->message_type_obj()->label['singular']),
1342
+			$context_label
1343
+		);
1344
+        
1345
+		$this->_template_args['GRP_ID']           = $GRP_ID;
1346
+		$this->_template_args['message_template'] = $message_template_group;
1347
+		$this->_template_args['is_extra_fields']  = false;
1348
+        
1349
+        
1350
+		//let's get EEH_MSG_Template so we can get template form fields
1351
+		$template_field_structure = EEH_MSG_Template::get_fields(
1352
+			$message_template_group->messenger(),
1353
+			$message_template_group->message_type()
1354
+		);
1355
+        
1356
+		if ( ! $template_field_structure) {
1357
+			$template_field_structure = false;
1358
+			$template_fields          = esc_html__(
1359
+				'There was an error in assembling the fields for this display (you should see an error message)',
1360
+				'event_espresso'
1361
+			);
1362
+		}
1363
+        
1364
+        
1365
+		$message_templates = $message_template_group->context_templates();
1366
+        
1367
+        
1368
+		//if we have the extra key.. then we need to remove the content index from the template_field_structure as it
1369
+		// will get handled in the "extra" array.
1370
+		if (is_array($template_field_structure[$context]) && isset($template_field_structure[$context]['extra'])) {
1371
+			foreach ($template_field_structure[$context]['extra'] as $reference_field => $new_fields) {
1372
+				unset($template_field_structure[$context][$reference_field]);
1373
+			}
1374
+		}
1375
+        
1376
+		//let's loop through the template_field_structure and actually assemble the input fields!
1377
+		if ( ! empty($template_field_structure)) {
1378
+			foreach ($template_field_structure[$context] as $template_field => $field_setup_array) {
1379
+				//if this is an 'extra' template field then we need to remove any existing fields that are keyed up in
1380
+				// the extra array and reset them.
1381
+				if ($template_field === 'extra') {
1382
+					$this->_template_args['is_extra_fields'] = true;
1383
+					foreach ($field_setup_array as $reference_field => $new_fields_array) {
1384
+						$message_template = $message_templates[$context][$reference_field];
1385
+						$content          = $message_template instanceof EE_Message_Template
1386
+							? $message_template->get('MTP_content')
1387
+							: '';
1388
+						foreach ($new_fields_array as $extra_field => $extra_array) {
1389
+							//let's verify if we need this extra field via the shortcodes parameter.
1390
+							$continue = false;
1391
+							if (isset($extra_array['shortcodes_required'])) {
1392
+								foreach ((array)$extra_array['shortcodes_required'] as $shortcode) {
1393
+									if ( ! array_key_exists($shortcode, $this->_shortcodes)) {
1394
+										$continue = true;
1395
+									}
1396
+								}
1397
+								if ($continue) {
1398
+									continue;
1399
+								}
1400
+							}
1401 1401
                             
1402
-                            $field_id                                = $reference_field
1403
-                                                                       . '-'
1404
-                                                                       . $extra_field
1405
-                                                                       . '-content';
1406
-                            $template_form_fields[$field_id]         = $extra_array;
1407
-                            $template_form_fields[$field_id]['name'] = 'MTP_template_fields['
1408
-                                                                       . $reference_field
1409
-                                                                       . '][content]['
1410
-                                                                       . $extra_field . ']';
1411
-                            $css_class                               = isset($extra_array['css_class'])
1412
-                                ? $extra_array['css_class']
1413
-                                : '';
1402
+							$field_id                                = $reference_field
1403
+																	   . '-'
1404
+																	   . $extra_field
1405
+																	   . '-content';
1406
+							$template_form_fields[$field_id]         = $extra_array;
1407
+							$template_form_fields[$field_id]['name'] = 'MTP_template_fields['
1408
+																	   . $reference_field
1409
+																	   . '][content]['
1410
+																	   . $extra_field . ']';
1411
+							$css_class                               = isset($extra_array['css_class'])
1412
+								? $extra_array['css_class']
1413
+								: '';
1414 1414
                             
1415
-                            $template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1416
-                                && in_array($extra_field, $v_fields, true)
1417
-                                &&
1418
-                                (
1419
-                                    is_array($validators[$extra_field])
1420
-                                    && isset($validators[$extra_field]['msg'])
1421
-                                )
1422
-                                ? 'validate-error ' . $css_class
1423
-                                : $css_class;
1415
+							$template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1416
+								&& in_array($extra_field, $v_fields, true)
1417
+								&&
1418
+								(
1419
+									is_array($validators[$extra_field])
1420
+									&& isset($validators[$extra_field]['msg'])
1421
+								)
1422
+								? 'validate-error ' . $css_class
1423
+								: $css_class;
1424 1424
                             
1425
-                            $template_form_fields[$field_id]['value'] = ! empty($message_templates)
1426
-                                                                        && isset($content[$extra_field])
1427
-                                ? $content[$extra_field]
1428
-                                : '';
1425
+							$template_form_fields[$field_id]['value'] = ! empty($message_templates)
1426
+																		&& isset($content[$extra_field])
1427
+								? $content[$extra_field]
1428
+								: '';
1429 1429
                             
1430
-                            //do we have a validation error?  if we do then let's use that value instead
1431
-                            $template_form_fields[$field_id]['value'] = isset($validators[$extra_field])
1432
-                                ? $validators[$extra_field]['value']
1433
-                                : $template_form_fields[$field_id]['value'];
1430
+							//do we have a validation error?  if we do then let's use that value instead
1431
+							$template_form_fields[$field_id]['value'] = isset($validators[$extra_field])
1432
+								? $validators[$extra_field]['value']
1433
+								: $template_form_fields[$field_id]['value'];
1434 1434
                             
1435 1435
                             
1436
-                            $template_form_fields[$field_id]['db-col'] = 'MTP_content';
1436
+							$template_form_fields[$field_id]['db-col'] = 'MTP_content';
1437 1437
                             
1438
-                            //shortcode selector
1439
-                            $field_name_to_use                                 = $extra_field === 'main'
1440
-                                ? 'content'
1441
-                                : $extra_field;
1442
-                            $template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1443
-                                $field_name_to_use,
1444
-                                $field_id
1445
-                            );
1438
+							//shortcode selector
1439
+							$field_name_to_use                                 = $extra_field === 'main'
1440
+								? 'content'
1441
+								: $extra_field;
1442
+							$template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1443
+								$field_name_to_use,
1444
+								$field_id
1445
+							);
1446 1446
                             
1447
-                            if (isset($extra_array['input']) && $extra_array['input'] === 'wp_editor') {
1448
-                                //we want to decode the entities
1449
-                                $template_form_fields[$field_id]['value'] = $template_form_fields[$field_id]['value'];
1447
+							if (isset($extra_array['input']) && $extra_array['input'] === 'wp_editor') {
1448
+								//we want to decode the entities
1449
+								$template_form_fields[$field_id]['value'] = $template_form_fields[$field_id]['value'];
1450 1450
                                 
1451
-                            }/**/
1452
-                        }
1453
-                        $templatefield_MTP_id          = $reference_field . '-MTP_ID';
1454
-                        $templatefield_templatename_id = $reference_field . '-name';
1451
+							}/**/
1452
+						}
1453
+						$templatefield_MTP_id          = $reference_field . '-MTP_ID';
1454
+						$templatefield_templatename_id = $reference_field . '-name';
1455 1455
                         
1456
-                        $template_form_fields[$templatefield_MTP_id] = array(
1457
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1458
-                            'label'      => null,
1459
-                            'input'      => 'hidden',
1460
-                            'type'       => 'int',
1461
-                            'required'   => false,
1462
-                            'validation' => false,
1463
-                            'value'      => ! empty($message_templates) ? $message_template->ID() : '',
1464
-                            'css_class'  => '',
1465
-                            'format'     => '%d',
1466
-                            'db-col'     => 'MTP_ID'
1467
-                        );
1456
+						$template_form_fields[$templatefield_MTP_id] = array(
1457
+							'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1458
+							'label'      => null,
1459
+							'input'      => 'hidden',
1460
+							'type'       => 'int',
1461
+							'required'   => false,
1462
+							'validation' => false,
1463
+							'value'      => ! empty($message_templates) ? $message_template->ID() : '',
1464
+							'css_class'  => '',
1465
+							'format'     => '%d',
1466
+							'db-col'     => 'MTP_ID'
1467
+						);
1468 1468
                         
1469
-                        $template_form_fields[$templatefield_templatename_id] = array(
1470
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1471
-                            'label'      => null,
1472
-                            'input'      => 'hidden',
1473
-                            'type'       => 'string',
1474
-                            'required'   => false,
1475
-                            'validation' => true,
1476
-                            'value'      => $reference_field,
1477
-                            'css_class'  => '',
1478
-                            'format'     => '%s',
1479
-                            'db-col'     => 'MTP_template_field'
1480
-                        );
1481
-                    }
1482
-                    continue; //skip the next stuff, we got the necessary fields here for this dataset.
1483
-                } else {
1484
-                    $field_id                                 = $template_field . '-content';
1485
-                    $template_form_fields[$field_id]          = $field_setup_array;
1486
-                    $template_form_fields[$field_id]['name']  = 'MTP_template_fields[' . $template_field . '][content]';
1487
-                    $message_template                         = isset($message_templates[$context][$template_field])
1488
-                        ? $message_templates[$context][$template_field]
1489
-                        : null;
1490
-                    $template_form_fields[$field_id]['value'] = ! empty($message_templates)
1491
-                                                                && is_array($message_templates[$context])
1492
-                                                                && $message_template instanceof EE_Message_Template
1493
-                        ? $message_template->get('MTP_content')
1494
-                        : '';
1469
+						$template_form_fields[$templatefield_templatename_id] = array(
1470
+							'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1471
+							'label'      => null,
1472
+							'input'      => 'hidden',
1473
+							'type'       => 'string',
1474
+							'required'   => false,
1475
+							'validation' => true,
1476
+							'value'      => $reference_field,
1477
+							'css_class'  => '',
1478
+							'format'     => '%s',
1479
+							'db-col'     => 'MTP_template_field'
1480
+						);
1481
+					}
1482
+					continue; //skip the next stuff, we got the necessary fields here for this dataset.
1483
+				} else {
1484
+					$field_id                                 = $template_field . '-content';
1485
+					$template_form_fields[$field_id]          = $field_setup_array;
1486
+					$template_form_fields[$field_id]['name']  = 'MTP_template_fields[' . $template_field . '][content]';
1487
+					$message_template                         = isset($message_templates[$context][$template_field])
1488
+						? $message_templates[$context][$template_field]
1489
+						: null;
1490
+					$template_form_fields[$field_id]['value'] = ! empty($message_templates)
1491
+																&& is_array($message_templates[$context])
1492
+																&& $message_template instanceof EE_Message_Template
1493
+						? $message_template->get('MTP_content')
1494
+						: '';
1495 1495
                     
1496
-                    //do we have a validator error for this field?  if we do then we'll use that value instead
1497
-                    $template_form_fields[$field_id]['value'] = isset($validators[$template_field])
1498
-                        ? $validators[$template_field]['value']
1499
-                        : $template_form_fields[$field_id]['value'];
1496
+					//do we have a validator error for this field?  if we do then we'll use that value instead
1497
+					$template_form_fields[$field_id]['value'] = isset($validators[$template_field])
1498
+						? $validators[$template_field]['value']
1499
+						: $template_form_fields[$field_id]['value'];
1500 1500
                     
1501 1501
                     
1502
-                    $template_form_fields[$field_id]['db-col']    = 'MTP_content';
1503
-                    $css_class                                    = isset($field_setup_array['css_class'])
1504
-                        ? $field_setup_array['css_class']
1505
-                        : '';
1506
-                    $template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1507
-                                                                    && in_array($template_field, $v_fields, true)
1508
-                                                                    && isset($validators[$template_field]['msg'])
1509
-                        ? 'validate-error ' . $css_class
1510
-                        : $css_class;
1502
+					$template_form_fields[$field_id]['db-col']    = 'MTP_content';
1503
+					$css_class                                    = isset($field_setup_array['css_class'])
1504
+						? $field_setup_array['css_class']
1505
+						: '';
1506
+					$template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1507
+																	&& in_array($template_field, $v_fields, true)
1508
+																	&& isset($validators[$template_field]['msg'])
1509
+						? 'validate-error ' . $css_class
1510
+						: $css_class;
1511 1511
                     
1512
-                    //shortcode selector
1513
-                    $template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1514
-                        $template_field, $field_id
1515
-                    );
1516
-                }
1512
+					//shortcode selector
1513
+					$template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1514
+						$template_field, $field_id
1515
+					);
1516
+				}
1517 1517
                 
1518
-                //k took care of content field(s) now let's take care of others.
1518
+				//k took care of content field(s) now let's take care of others.
1519 1519
                 
1520
-                $templatefield_MTP_id                = $template_field . '-MTP_ID';
1521
-                $templatefield_field_templatename_id = $template_field . '-name';
1520
+				$templatefield_MTP_id                = $template_field . '-MTP_ID';
1521
+				$templatefield_field_templatename_id = $template_field . '-name';
1522 1522
                 
1523
-                //foreach template field there are actually two form fields created
1524
-                $template_form_fields[$templatefield_MTP_id] = array(
1525
-                    'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1526
-                    'label'      => null,
1527
-                    'input'      => 'hidden',
1528
-                    'type'       => 'int',
1529
-                    'required'   => false,
1530
-                    'validation' => true,
1531
-                    'value'      => $message_template instanceof EE_Message_Template ? $message_template->ID() : '',
1532
-                    'css_class'  => '',
1533
-                    'format'     => '%d',
1534
-                    'db-col'     => 'MTP_ID'
1535
-                );
1523
+				//foreach template field there are actually two form fields created
1524
+				$template_form_fields[$templatefield_MTP_id] = array(
1525
+					'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1526
+					'label'      => null,
1527
+					'input'      => 'hidden',
1528
+					'type'       => 'int',
1529
+					'required'   => false,
1530
+					'validation' => true,
1531
+					'value'      => $message_template instanceof EE_Message_Template ? $message_template->ID() : '',
1532
+					'css_class'  => '',
1533
+					'format'     => '%d',
1534
+					'db-col'     => 'MTP_ID'
1535
+				);
1536 1536
                 
1537
-                $template_form_fields[$templatefield_field_templatename_id] = array(
1538
-                    'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1539
-                    'label'      => null,
1540
-                    'input'      => 'hidden',
1541
-                    'type'       => 'string',
1542
-                    'required'   => false,
1543
-                    'validation' => true,
1544
-                    'value'      => $template_field,
1545
-                    'css_class'  => '',
1546
-                    'format'     => '%s',
1547
-                    'db-col'     => 'MTP_template_field'
1548
-                );
1537
+				$template_form_fields[$templatefield_field_templatename_id] = array(
1538
+					'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1539
+					'label'      => null,
1540
+					'input'      => 'hidden',
1541
+					'type'       => 'string',
1542
+					'required'   => false,
1543
+					'validation' => true,
1544
+					'value'      => $template_field,
1545
+					'css_class'  => '',
1546
+					'format'     => '%s',
1547
+					'db-col'     => 'MTP_template_field'
1548
+				);
1549 1549
                 
1550
-            }
1550
+			}
1551 1551
             
1552
-            //add other fields
1553
-            $template_form_fields['ee-msg-current-context'] = array(
1554
-                'name'       => 'MTP_context',
1555
-                'label'      => null,
1556
-                'input'      => 'hidden',
1557
-                'type'       => 'string',
1558
-                'required'   => false,
1559
-                'validation' => true,
1560
-                'value'      => $context,
1561
-                'css_class'  => '',
1562
-                'format'     => '%s',
1563
-                'db-col'     => 'MTP_context'
1564
-            );
1552
+			//add other fields
1553
+			$template_form_fields['ee-msg-current-context'] = array(
1554
+				'name'       => 'MTP_context',
1555
+				'label'      => null,
1556
+				'input'      => 'hidden',
1557
+				'type'       => 'string',
1558
+				'required'   => false,
1559
+				'validation' => true,
1560
+				'value'      => $context,
1561
+				'css_class'  => '',
1562
+				'format'     => '%s',
1563
+				'db-col'     => 'MTP_context'
1564
+			);
1565 1565
             
1566
-            $template_form_fields['ee-msg-grp-id'] = array(
1567
-                'name'       => 'GRP_ID',
1568
-                'label'      => null,
1569
-                'input'      => 'hidden',
1570
-                'type'       => 'int',
1571
-                'required'   => false,
1572
-                'validation' => true,
1573
-                'value'      => $GRP_ID,
1574
-                'css_class'  => '',
1575
-                'format'     => '%d',
1576
-                'db-col'     => 'GRP_ID'
1577
-            );
1566
+			$template_form_fields['ee-msg-grp-id'] = array(
1567
+				'name'       => 'GRP_ID',
1568
+				'label'      => null,
1569
+				'input'      => 'hidden',
1570
+				'type'       => 'int',
1571
+				'required'   => false,
1572
+				'validation' => true,
1573
+				'value'      => $GRP_ID,
1574
+				'css_class'  => '',
1575
+				'format'     => '%d',
1576
+				'db-col'     => 'GRP_ID'
1577
+			);
1578 1578
             
1579
-            $template_form_fields['ee-msg-messenger'] = array(
1580
-                'name'       => 'MTP_messenger',
1581
-                'label'      => null,
1582
-                'input'      => 'hidden',
1583
-                'type'       => 'string',
1584
-                'required'   => false,
1585
-                'validation' => true,
1586
-                'value'      => $message_template_group->messenger(),
1587
-                'css_class'  => '',
1588
-                'format'     => '%s',
1589
-                'db-col'     => 'MTP_messenger'
1590
-            );
1579
+			$template_form_fields['ee-msg-messenger'] = array(
1580
+				'name'       => 'MTP_messenger',
1581
+				'label'      => null,
1582
+				'input'      => 'hidden',
1583
+				'type'       => 'string',
1584
+				'required'   => false,
1585
+				'validation' => true,
1586
+				'value'      => $message_template_group->messenger(),
1587
+				'css_class'  => '',
1588
+				'format'     => '%s',
1589
+				'db-col'     => 'MTP_messenger'
1590
+			);
1591 1591
             
1592
-            $template_form_fields['ee-msg-message-type'] = array(
1593
-                'name'       => 'MTP_message_type',
1594
-                'label'      => null,
1595
-                'input'      => 'hidden',
1596
-                'type'       => 'string',
1597
-                'required'   => false,
1598
-                'validation' => true,
1599
-                'value'      => $message_template_group->message_type(),
1600
-                'css_class'  => '',
1601
-                'format'     => '%s',
1602
-                'db-col'     => 'MTP_message_type'
1603
-            );
1592
+			$template_form_fields['ee-msg-message-type'] = array(
1593
+				'name'       => 'MTP_message_type',
1594
+				'label'      => null,
1595
+				'input'      => 'hidden',
1596
+				'type'       => 'string',
1597
+				'required'   => false,
1598
+				'validation' => true,
1599
+				'value'      => $message_template_group->message_type(),
1600
+				'css_class'  => '',
1601
+				'format'     => '%s',
1602
+				'db-col'     => 'MTP_message_type'
1603
+			);
1604 1604
             
1605
-            $sidebar_form_fields['ee-msg-is-global'] = array(
1606
-                'name'       => 'MTP_is_global',
1607
-                'label'      => esc_html__('Global Template', 'event_espresso'),
1608
-                'input'      => 'hidden',
1609
-                'type'       => 'int',
1610
-                'required'   => false,
1611
-                'validation' => true,
1612
-                'value'      => $message_template_group->get('MTP_is_global'),
1613
-                'css_class'  => '',
1614
-                'format'     => '%d',
1615
-                'db-col'     => 'MTP_is_global'
1616
-            );
1605
+			$sidebar_form_fields['ee-msg-is-global'] = array(
1606
+				'name'       => 'MTP_is_global',
1607
+				'label'      => esc_html__('Global Template', 'event_espresso'),
1608
+				'input'      => 'hidden',
1609
+				'type'       => 'int',
1610
+				'required'   => false,
1611
+				'validation' => true,
1612
+				'value'      => $message_template_group->get('MTP_is_global'),
1613
+				'css_class'  => '',
1614
+				'format'     => '%d',
1615
+				'db-col'     => 'MTP_is_global'
1616
+			);
1617 1617
             
1618
-            $sidebar_form_fields['ee-msg-is-override'] = array(
1619
-                'name'       => 'MTP_is_override',
1620
-                'label'      => esc_html__('Override all custom', 'event_espresso'),
1621
-                'input'      => $message_template_group->is_global() ? 'checkbox' : 'hidden',
1622
-                'type'       => 'int',
1623
-                'required'   => false,
1624
-                'validation' => true,
1625
-                'value'      => $message_template_group->get('MTP_is_override'),
1626
-                'css_class'  => '',
1627
-                'format'     => '%d',
1628
-                'db-col'     => 'MTP_is_override'
1629
-            );
1618
+			$sidebar_form_fields['ee-msg-is-override'] = array(
1619
+				'name'       => 'MTP_is_override',
1620
+				'label'      => esc_html__('Override all custom', 'event_espresso'),
1621
+				'input'      => $message_template_group->is_global() ? 'checkbox' : 'hidden',
1622
+				'type'       => 'int',
1623
+				'required'   => false,
1624
+				'validation' => true,
1625
+				'value'      => $message_template_group->get('MTP_is_override'),
1626
+				'css_class'  => '',
1627
+				'format'     => '%d',
1628
+				'db-col'     => 'MTP_is_override'
1629
+			);
1630 1630
             
1631
-            $sidebar_form_fields['ee-msg-is-active'] = array(
1632
-                'name'       => 'MTP_is_active',
1633
-                'label'      => esc_html__('Active Template', 'event_espresso'),
1634
-                'input'      => 'hidden',
1635
-                'type'       => 'int',
1636
-                'required'   => false,
1637
-                'validation' => true,
1638
-                'value'      => $message_template_group->is_active(),
1639
-                'css_class'  => '',
1640
-                'format'     => '%d',
1641
-                'db-col'     => 'MTP_is_active'
1642
-            );
1631
+			$sidebar_form_fields['ee-msg-is-active'] = array(
1632
+				'name'       => 'MTP_is_active',
1633
+				'label'      => esc_html__('Active Template', 'event_espresso'),
1634
+				'input'      => 'hidden',
1635
+				'type'       => 'int',
1636
+				'required'   => false,
1637
+				'validation' => true,
1638
+				'value'      => $message_template_group->is_active(),
1639
+				'css_class'  => '',
1640
+				'format'     => '%d',
1641
+				'db-col'     => 'MTP_is_active'
1642
+			);
1643 1643
             
1644
-            $sidebar_form_fields['ee-msg-deleted'] = array(
1645
-                'name'       => 'MTP_deleted',
1646
-                'label'      => null,
1647
-                'input'      => 'hidden',
1648
-                'type'       => 'int',
1649
-                'required'   => false,
1650
-                'validation' => true,
1651
-                'value'      => $message_template_group->get('MTP_deleted'),
1652
-                'css_class'  => '',
1653
-                'format'     => '%d',
1654
-                'db-col'     => 'MTP_deleted'
1655
-            );
1656
-            $sidebar_form_fields['ee-msg-author']  = array(
1657
-                'name'       => 'MTP_user_id',
1658
-                'label'      => esc_html__('Author', 'event_espresso'),
1659
-                'input'      => 'hidden',
1660
-                'type'       => 'int',
1661
-                'required'   => false,
1662
-                'validation' => false,
1663
-                'value'      => $message_template_group->user(),
1664
-                'format'     => '%d',
1665
-                'db-col'     => 'MTP_user_id'
1666
-            );
1644
+			$sidebar_form_fields['ee-msg-deleted'] = array(
1645
+				'name'       => 'MTP_deleted',
1646
+				'label'      => null,
1647
+				'input'      => 'hidden',
1648
+				'type'       => 'int',
1649
+				'required'   => false,
1650
+				'validation' => true,
1651
+				'value'      => $message_template_group->get('MTP_deleted'),
1652
+				'css_class'  => '',
1653
+				'format'     => '%d',
1654
+				'db-col'     => 'MTP_deleted'
1655
+			);
1656
+			$sidebar_form_fields['ee-msg-author']  = array(
1657
+				'name'       => 'MTP_user_id',
1658
+				'label'      => esc_html__('Author', 'event_espresso'),
1659
+				'input'      => 'hidden',
1660
+				'type'       => 'int',
1661
+				'required'   => false,
1662
+				'validation' => false,
1663
+				'value'      => $message_template_group->user(),
1664
+				'format'     => '%d',
1665
+				'db-col'     => 'MTP_user_id'
1666
+			);
1667 1667
             
1668
-            $sidebar_form_fields['ee-msg-route'] = array(
1669
-                'name'  => 'action',
1670
-                'input' => 'hidden',
1671
-                'type'  => 'string',
1672
-                'value' => $action
1673
-            );
1668
+			$sidebar_form_fields['ee-msg-route'] = array(
1669
+				'name'  => 'action',
1670
+				'input' => 'hidden',
1671
+				'type'  => 'string',
1672
+				'value' => $action
1673
+			);
1674 1674
             
1675
-            $sidebar_form_fields['ee-msg-id']        = array(
1676
-                'name'  => 'id',
1677
-                'input' => 'hidden',
1678
-                'type'  => 'int',
1679
-                'value' => $GRP_ID
1680
-            );
1681
-            $sidebar_form_fields['ee-msg-evt-nonce'] = array(
1682
-                'name'  => $action . '_nonce',
1683
-                'input' => 'hidden',
1684
-                'type'  => 'string',
1685
-                'value' => wp_create_nonce($action . '_nonce')
1686
-            );
1675
+			$sidebar_form_fields['ee-msg-id']        = array(
1676
+				'name'  => 'id',
1677
+				'input' => 'hidden',
1678
+				'type'  => 'int',
1679
+				'value' => $GRP_ID
1680
+			);
1681
+			$sidebar_form_fields['ee-msg-evt-nonce'] = array(
1682
+				'name'  => $action . '_nonce',
1683
+				'input' => 'hidden',
1684
+				'type'  => 'string',
1685
+				'value' => wp_create_nonce($action . '_nonce')
1686
+			);
1687 1687
             
1688
-            if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
1689
-                $sidebar_form_fields['ee-msg-template-switch'] = array(
1690
-                    'name'  => 'template_switch',
1691
-                    'input' => 'hidden',
1692
-                    'type'  => 'int',
1693
-                    'value' => 1
1694
-                );
1695
-            }
1688
+			if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
1689
+				$sidebar_form_fields['ee-msg-template-switch'] = array(
1690
+					'name'  => 'template_switch',
1691
+					'input' => 'hidden',
1692
+					'type'  => 'int',
1693
+					'value' => 1
1694
+				);
1695
+			}
1696 1696
             
1697 1697
             
1698
-            $template_fields = $this->_generate_admin_form_fields($template_form_fields);
1699
-            $sidebar_fields  = $this->_generate_admin_form_fields($sidebar_form_fields);
1698
+			$template_fields = $this->_generate_admin_form_fields($template_form_fields);
1699
+			$sidebar_fields  = $this->_generate_admin_form_fields($sidebar_form_fields);
1700 1700
             
1701 1701
             
1702
-        } //end if ( !empty($template_field_structure) )
1703
-        
1704
-        //set extra content for publish box
1705
-        $this->_template_args['publish_box_extra_content'] = $sidebar_fields;
1706
-        $this->_set_publish_post_box_vars(
1707
-            'id',
1708
-            $GRP_ID,
1709
-            false,
1710
-            add_query_arg(
1711
-                array('action' => 'global_mtps'),
1712
-                $this->_admin_base_url
1713
-            )
1714
-        );
1715
-        
1716
-        //add preview button
1717
-        $preview_url    = parent::add_query_args_and_nonce(
1718
-            array(
1719
-                'message_type' => $message_template_group->message_type(),
1720
-                'messenger'    => $message_template_group->messenger(),
1721
-                'context'      => $context,
1722
-                'GRP_ID'       => $GRP_ID,
1723
-                'action'       => 'preview_message'
1724
-            ),
1725
-            $this->_admin_base_url
1726
-        );
1727
-        $preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">'
1728
-                          . esc_html__('Preview', 'event_espresso')
1729
-                          . '</a>';
1730
-        
1731
-        
1732
-        //setup context switcher
1733
-        $context_switcher_args = array(
1734
-            'page'    => 'espresso_messages',
1735
-            'action'  => 'edit_message_template',
1736
-            'id'      => $GRP_ID,
1737
-            'context' => $context,
1738
-            'extra'   => $preview_button
1739
-        );
1740
-        $this->_set_context_switcher($message_template_group, $context_switcher_args);
1741
-        
1742
-        
1743
-        //main box
1744
-        $this->_template_args['template_fields']                         = $template_fields;
1745
-        $this->_template_args['sidebar_box_id']                          = 'details';
1746
-        $this->_template_args['action']                                  = $action;
1747
-        $this->_template_args['context']                                 = $context;
1748
-        $this->_template_args['edit_message_template_form_url']          = $edit_message_template_form_url;
1749
-        $this->_template_args['learn_more_about_message_templates_link'] =
1750
-            $this->_learn_more_about_message_templates_link();
1751
-        
1752
-        
1753
-        $this->_template_args['before_admin_page_content'] = $this->add_context_switcher();
1754
-        $this->_template_args['before_admin_page_content'] .= $this->add_active_context_element(
1755
-            $message_template_group,
1756
-            $context,
1757
-            $context_label
1758
-        );
1759
-        $this->_template_args['before_admin_page_content'] .= $this->_add_form_element_before();
1760
-        $this->_template_args['after_admin_page_content'] = $this->_add_form_element_after();
1761
-        
1762
-        $this->_template_path = $this->_template_args['GRP_ID']
1763
-            ? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1764
-            : EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1765
-        
1766
-        //send along EE_Message_Template_Group object for further template use.
1767
-        $this->_template_args['MTP'] = $message_template_group;
1768
-        
1769
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
1770
-            $this->_template_path,
1771
-            $this->_template_args,
1772
-            true
1773
-        );
1774
-        
1775
-        
1776
-        //finally, let's set the admin_page title
1777
-        $this->_admin_page_title = sprintf(__('Editing %s', 'event_espresso'), $title);
1778
-        
1779
-        
1780
-        //we need to take care of setting the shortcodes property for use elsewhere.
1781
-        $this->_set_shortcodes();
1782
-        
1783
-        
1784
-        //final template wrapper
1785
-        $this->display_admin_page_with_sidebar();
1786
-    }
1702
+		} //end if ( !empty($template_field_structure) )
1703
+        
1704
+		//set extra content for publish box
1705
+		$this->_template_args['publish_box_extra_content'] = $sidebar_fields;
1706
+		$this->_set_publish_post_box_vars(
1707
+			'id',
1708
+			$GRP_ID,
1709
+			false,
1710
+			add_query_arg(
1711
+				array('action' => 'global_mtps'),
1712
+				$this->_admin_base_url
1713
+			)
1714
+		);
1715
+        
1716
+		//add preview button
1717
+		$preview_url    = parent::add_query_args_and_nonce(
1718
+			array(
1719
+				'message_type' => $message_template_group->message_type(),
1720
+				'messenger'    => $message_template_group->messenger(),
1721
+				'context'      => $context,
1722
+				'GRP_ID'       => $GRP_ID,
1723
+				'action'       => 'preview_message'
1724
+			),
1725
+			$this->_admin_base_url
1726
+		);
1727
+		$preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">'
1728
+						  . esc_html__('Preview', 'event_espresso')
1729
+						  . '</a>';
1730
+        
1731
+        
1732
+		//setup context switcher
1733
+		$context_switcher_args = array(
1734
+			'page'    => 'espresso_messages',
1735
+			'action'  => 'edit_message_template',
1736
+			'id'      => $GRP_ID,
1737
+			'context' => $context,
1738
+			'extra'   => $preview_button
1739
+		);
1740
+		$this->_set_context_switcher($message_template_group, $context_switcher_args);
1741
+        
1742
+        
1743
+		//main box
1744
+		$this->_template_args['template_fields']                         = $template_fields;
1745
+		$this->_template_args['sidebar_box_id']                          = 'details';
1746
+		$this->_template_args['action']                                  = $action;
1747
+		$this->_template_args['context']                                 = $context;
1748
+		$this->_template_args['edit_message_template_form_url']          = $edit_message_template_form_url;
1749
+		$this->_template_args['learn_more_about_message_templates_link'] =
1750
+			$this->_learn_more_about_message_templates_link();
1751
+        
1752
+        
1753
+		$this->_template_args['before_admin_page_content'] = $this->add_context_switcher();
1754
+		$this->_template_args['before_admin_page_content'] .= $this->add_active_context_element(
1755
+			$message_template_group,
1756
+			$context,
1757
+			$context_label
1758
+		);
1759
+		$this->_template_args['before_admin_page_content'] .= $this->_add_form_element_before();
1760
+		$this->_template_args['after_admin_page_content'] = $this->_add_form_element_after();
1761
+        
1762
+		$this->_template_path = $this->_template_args['GRP_ID']
1763
+			? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1764
+			: EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1765
+        
1766
+		//send along EE_Message_Template_Group object for further template use.
1767
+		$this->_template_args['MTP'] = $message_template_group;
1768
+        
1769
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
1770
+			$this->_template_path,
1771
+			$this->_template_args,
1772
+			true
1773
+		);
1774
+        
1775
+        
1776
+		//finally, let's set the admin_page title
1777
+		$this->_admin_page_title = sprintf(__('Editing %s', 'event_espresso'), $title);
1778
+        
1779
+        
1780
+		//we need to take care of setting the shortcodes property for use elsewhere.
1781
+		$this->_set_shortcodes();
1782
+        
1783
+        
1784
+		//final template wrapper
1785
+		$this->display_admin_page_with_sidebar();
1786
+	}
1787 1787
     
1788 1788
     
1789
-    public function filter_tinymce_init($mceInit, $editor_id)
1790
-    {
1791
-        return $mceInit;
1792
-    }
1789
+	public function filter_tinymce_init($mceInit, $editor_id)
1790
+	{
1791
+		return $mceInit;
1792
+	}
1793 1793
     
1794 1794
     
1795
-    public function add_context_switcher()
1796
-    {
1797
-        return $this->_context_switcher;
1798
-    }
1795
+	public function add_context_switcher()
1796
+	{
1797
+		return $this->_context_switcher;
1798
+	}
1799 1799
 
1800 1800
 
1801
-    /**
1802
-     * Adds the activation/deactivation toggle for the message template context.
1803
-     *
1804
-     * @param EE_Message_Template_Group $message_template_group
1805
-     * @param string                    $context
1806
-     * @param string                    $context_label
1807
-     * @return string
1808
-     * @throws DomainException
1809
-     * @throws EE_Error
1810
-     * @throws InvalidIdentifierException
1811
-     */
1812
-    protected function add_active_context_element(
1813
-        EE_Message_Template_Group $message_template_group,
1814
-        $context,
1815
-        $context_label
1816
-    ) {
1817
-        $template_args = array(
1818
-            'context' => $context,
1819
-            'nonce' => wp_create_nonce('activate_' . $context . '_toggle_nonce'),
1820
-            'is_active' => $message_template_group->is_context_active($context),
1821
-            'on_off_action' => $message_template_group->is_context_active($context)
1822
-                ? 'context-off'
1823
-                : 'context-on',
1824
-            'context_label' => str_replace(array('(', ')'), '', $context_label),
1825
-            'message_template_group_id' => $message_template_group->ID()
1826
-        );
1827
-        return EEH_Template::display_template(
1828
-          EE_MSG_TEMPLATE_PATH . 'ee_msg_editor_active_context_element.template.php',
1829
-          $template_args,
1830
-          true
1831
-        );
1832
-    }
1801
+	/**
1802
+	 * Adds the activation/deactivation toggle for the message template context.
1803
+	 *
1804
+	 * @param EE_Message_Template_Group $message_template_group
1805
+	 * @param string                    $context
1806
+	 * @param string                    $context_label
1807
+	 * @return string
1808
+	 * @throws DomainException
1809
+	 * @throws EE_Error
1810
+	 * @throws InvalidIdentifierException
1811
+	 */
1812
+	protected function add_active_context_element(
1813
+		EE_Message_Template_Group $message_template_group,
1814
+		$context,
1815
+		$context_label
1816
+	) {
1817
+		$template_args = array(
1818
+			'context' => $context,
1819
+			'nonce' => wp_create_nonce('activate_' . $context . '_toggle_nonce'),
1820
+			'is_active' => $message_template_group->is_context_active($context),
1821
+			'on_off_action' => $message_template_group->is_context_active($context)
1822
+				? 'context-off'
1823
+				: 'context-on',
1824
+			'context_label' => str_replace(array('(', ')'), '', $context_label),
1825
+			'message_template_group_id' => $message_template_group->ID()
1826
+		);
1827
+		return EEH_Template::display_template(
1828
+		  EE_MSG_TEMPLATE_PATH . 'ee_msg_editor_active_context_element.template.php',
1829
+		  $template_args,
1830
+		  true
1831
+		);
1832
+	}
1833 1833
 
1834 1834
 
1835
-    /**
1836
-     * Ajax callback for `toggle_context_template` ajax action.
1837
-     * Handles toggling the message context on or off.
1838
-     * @throws EE_Error
1839
-     * @throws InvalidArgumentException
1840
-     * @throws InvalidDataTypeException
1841
-     * @throws InvalidIdentifierException
1842
-     * @throws InvalidInterfaceException
1843
-     */
1844
-    public function toggle_context_template()
1845
-    {
1846
-        $success = true;
1847
-        //check for required data
1848
-        if (!isset(
1849
-            $this->_req_data['message_template_group_id'],
1850
-            $this->_req_data['context'],
1851
-            $this->_req_data['status']
1852
-        )) {
1853
-            EE_Error::add_error(
1854
-                esc_html__('Required data for doing this action is not available.', 'event_espresso'),
1855
-                __FILE__,
1856
-                __FUNCTION__,
1857
-                __LINE__
1858
-            );
1859
-            $success = false;
1860
-        }
1835
+	/**
1836
+	 * Ajax callback for `toggle_context_template` ajax action.
1837
+	 * Handles toggling the message context on or off.
1838
+	 * @throws EE_Error
1839
+	 * @throws InvalidArgumentException
1840
+	 * @throws InvalidDataTypeException
1841
+	 * @throws InvalidIdentifierException
1842
+	 * @throws InvalidInterfaceException
1843
+	 */
1844
+	public function toggle_context_template()
1845
+	{
1846
+		$success = true;
1847
+		//check for required data
1848
+		if (!isset(
1849
+			$this->_req_data['message_template_group_id'],
1850
+			$this->_req_data['context'],
1851
+			$this->_req_data['status']
1852
+		)) {
1853
+			EE_Error::add_error(
1854
+				esc_html__('Required data for doing this action is not available.', 'event_espresso'),
1855
+				__FILE__,
1856
+				__FUNCTION__,
1857
+				__LINE__
1858
+			);
1859
+			$success = false;
1860
+		}
1861 1861
 
1862
-        $nonce = isset($this->_req_data['toggle_context_nonce'])
1863
-            ? sanitize_text_field($this->_req_data['toggle_context_nonce'])
1864
-            : '';
1865
-        $nonce_ref = 'activate_' . $this->_req_data['context'] . '_toggle_nonce';
1866
-        $this->_verify_nonce($nonce, $nonce_ref);
1867
-        $status = $this->_req_data['status'];
1868
-        if ($status !== 'off' && $status !=='on') {
1869
-            EE_Error::add_error(
1870
-                sprintf(
1871
-                    esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
1872
-                    $this->_req_data['status']
1873
-                ),
1874
-                __FILE__,
1875
-                __FUNCTION__,
1876
-                __LINE__
1877
-            );
1878
-            $success = false;
1879
-        }
1880
-        $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID(
1881
-            $this->_req_data['message_template_group_id']
1882
-        );
1883
-        if (! $message_template_group instanceof EE_Message_Template_Group) {
1884
-            EE_Error::add_error(
1885
-                sprintf(
1886
-                    esc_html__(
1887
-                        'Unable to change the active state because the given id "%1$d" does not match a valid "%2$s"',
1888
-                        'event_espresso'
1889
-                    ),
1890
-                    $this->_req_data['message_template_group_id'],
1891
-                    'EE_Message_Template_Group'
1892
-                ),
1893
-                __FILE__,
1894
-                __FUNCTION__,
1895
-                __LINE__
1896
-            );
1897
-            $success = false;
1898
-        }
1899
-        if ($success) {
1900
-            $success = $status === 'off'
1901
-                ? $message_template_group->deactivate_context($this->_req_data['context'])
1902
-                : $message_template_group->activate_context($this->_req_data['context']);
1903
-        }
1904
-        $this->_template_args['success'] = $success;
1905
-        $this->_return_json();
1906
-    }
1862
+		$nonce = isset($this->_req_data['toggle_context_nonce'])
1863
+			? sanitize_text_field($this->_req_data['toggle_context_nonce'])
1864
+			: '';
1865
+		$nonce_ref = 'activate_' . $this->_req_data['context'] . '_toggle_nonce';
1866
+		$this->_verify_nonce($nonce, $nonce_ref);
1867
+		$status = $this->_req_data['status'];
1868
+		if ($status !== 'off' && $status !=='on') {
1869
+			EE_Error::add_error(
1870
+				sprintf(
1871
+					esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
1872
+					$this->_req_data['status']
1873
+				),
1874
+				__FILE__,
1875
+				__FUNCTION__,
1876
+				__LINE__
1877
+			);
1878
+			$success = false;
1879
+		}
1880
+		$message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID(
1881
+			$this->_req_data['message_template_group_id']
1882
+		);
1883
+		if (! $message_template_group instanceof EE_Message_Template_Group) {
1884
+			EE_Error::add_error(
1885
+				sprintf(
1886
+					esc_html__(
1887
+						'Unable to change the active state because the given id "%1$d" does not match a valid "%2$s"',
1888
+						'event_espresso'
1889
+					),
1890
+					$this->_req_data['message_template_group_id'],
1891
+					'EE_Message_Template_Group'
1892
+				),
1893
+				__FILE__,
1894
+				__FUNCTION__,
1895
+				__LINE__
1896
+			);
1897
+			$success = false;
1898
+		}
1899
+		if ($success) {
1900
+			$success = $status === 'off'
1901
+				? $message_template_group->deactivate_context($this->_req_data['context'])
1902
+				: $message_template_group->activate_context($this->_req_data['context']);
1903
+		}
1904
+		$this->_template_args['success'] = $success;
1905
+		$this->_return_json();
1906
+	}
1907 1907
 
1908 1908
 
1909 1909
     
1910
-    public function _add_form_element_before()
1911
-    {
1912
-        return '<form method="post" action="'
1913
-               . $this->_template_args["edit_message_template_form_url"]
1914
-               . '" id="ee-msg-edit-frm">';
1915
-    }
1910
+	public function _add_form_element_before()
1911
+	{
1912
+		return '<form method="post" action="'
1913
+			   . $this->_template_args["edit_message_template_form_url"]
1914
+			   . '" id="ee-msg-edit-frm">';
1915
+	}
1916 1916
     
1917
-    public function _add_form_element_after()
1918
-    {
1919
-        return '</form>';
1920
-    }
1917
+	public function _add_form_element_after()
1918
+	{
1919
+		return '</form>';
1920
+	}
1921 1921
 
1922 1922
 
1923
-    /**
1924
-     * This executes switching the template pack for a message template.
1925
-     *
1926
-     * @since 4.5.0
1927
-     * @throws EE_Error
1928
-     * @throws InvalidDataTypeException
1929
-     * @throws InvalidInterfaceException
1930
-     * @throws InvalidArgumentException
1931
-     * @throws ReflectionException
1932
-     */
1933
-    public function switch_template_pack()
1934
-    {
1935
-        $GRP_ID        = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1936
-        $template_pack = ! empty($this->_req_data['template_pack']) ? $this->_req_data['template_pack'] : '';
1937
-        
1938
-        //verify we have needed values.
1939
-        if (empty($GRP_ID) || empty($template_pack)) {
1940
-            $this->_template_args['error'] = true;
1941
-            EE_Error::add_error(
1942
-                esc_html__('The required date for switching templates is not available.', 'event_espresso'),
1943
-                __FILE__,
1944
-                __FUNCTION__,
1945
-                __LINE__
1946
-            );
1947
-        } else {
1948
-            //get template, set the new template_pack and then reset to default
1949
-            /** @type EE_Message_Template_Group $message_template_group */
1950
-            $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1923
+	/**
1924
+	 * This executes switching the template pack for a message template.
1925
+	 *
1926
+	 * @since 4.5.0
1927
+	 * @throws EE_Error
1928
+	 * @throws InvalidDataTypeException
1929
+	 * @throws InvalidInterfaceException
1930
+	 * @throws InvalidArgumentException
1931
+	 * @throws ReflectionException
1932
+	 */
1933
+	public function switch_template_pack()
1934
+	{
1935
+		$GRP_ID        = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1936
+		$template_pack = ! empty($this->_req_data['template_pack']) ? $this->_req_data['template_pack'] : '';
1937
+        
1938
+		//verify we have needed values.
1939
+		if (empty($GRP_ID) || empty($template_pack)) {
1940
+			$this->_template_args['error'] = true;
1941
+			EE_Error::add_error(
1942
+				esc_html__('The required date for switching templates is not available.', 'event_espresso'),
1943
+				__FILE__,
1944
+				__FUNCTION__,
1945
+				__LINE__
1946
+			);
1947
+		} else {
1948
+			//get template, set the new template_pack and then reset to default
1949
+			/** @type EE_Message_Template_Group $message_template_group */
1950
+			$message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1951 1951
             
1952
-            $message_template_group->set_template_pack_name($template_pack);
1953
-            $this->_req_data['msgr'] = $message_template_group->messenger();
1954
-            $this->_req_data['mt']   = $message_template_group->message_type();
1952
+			$message_template_group->set_template_pack_name($template_pack);
1953
+			$this->_req_data['msgr'] = $message_template_group->messenger();
1954
+			$this->_req_data['mt']   = $message_template_group->message_type();
1955 1955
             
1956
-            $query_args = $this->_reset_to_default_template();
1956
+			$query_args = $this->_reset_to_default_template();
1957 1957
             
1958
-            if (empty($query_args['id'])) {
1959
-                EE_Error::add_error(
1960
-                    esc_html__(
1961
-                        'Something went wrong with switching the template pack. Please try again or contact EE support',
1962
-                        'event_espresso'
1963
-                    ),
1964
-                    __FILE__,
1965
-                    __FUNCTION__,
1966
-                    __LINE__
1967
-                );
1968
-                $this->_template_args['error'] = true;
1969
-            } else {
1970
-                $template_label       = $message_template_group->get_template_pack()->label;
1971
-                $template_pack_labels = $message_template_group->messenger_obj()->get_supports_labels();
1972
-                EE_Error::add_success(
1973
-                    sprintf(
1974
-                        esc_html__(
1975
-                            'This message template has been successfully switched to use the %1$s %2$s.  Please wait while the page reloads with your new template.',
1976
-                            'event_espresso'
1977
-                        ),
1978
-                        $template_label,
1979
-                        $template_pack_labels->template_pack
1980
-                    )
1981
-                );
1982
-                //generate the redirect url for js.
1983
-                $url                                          = self::add_query_args_and_nonce($query_args,
1984
-                    $this->_admin_base_url);
1985
-                $this->_template_args['data']['redirect_url'] = $url;
1986
-                $this->_template_args['success']              = true;
1987
-            }
1958
+			if (empty($query_args['id'])) {
1959
+				EE_Error::add_error(
1960
+					esc_html__(
1961
+						'Something went wrong with switching the template pack. Please try again or contact EE support',
1962
+						'event_espresso'
1963
+					),
1964
+					__FILE__,
1965
+					__FUNCTION__,
1966
+					__LINE__
1967
+				);
1968
+				$this->_template_args['error'] = true;
1969
+			} else {
1970
+				$template_label       = $message_template_group->get_template_pack()->label;
1971
+				$template_pack_labels = $message_template_group->messenger_obj()->get_supports_labels();
1972
+				EE_Error::add_success(
1973
+					sprintf(
1974
+						esc_html__(
1975
+							'This message template has been successfully switched to use the %1$s %2$s.  Please wait while the page reloads with your new template.',
1976
+							'event_espresso'
1977
+						),
1978
+						$template_label,
1979
+						$template_pack_labels->template_pack
1980
+					)
1981
+				);
1982
+				//generate the redirect url for js.
1983
+				$url                                          = self::add_query_args_and_nonce($query_args,
1984
+					$this->_admin_base_url);
1985
+				$this->_template_args['data']['redirect_url'] = $url;
1986
+				$this->_template_args['success']              = true;
1987
+			}
1988 1988
             
1989
-            $this->_return_json();
1989
+			$this->_return_json();
1990 1990
             
1991
-        }
1992
-    }
1991
+		}
1992
+	}
1993 1993
 
1994 1994
 
1995
-    /**
1996
-     * This handles resetting the template for the given messenger/message_type so that users can start from scratch if
1997
-     * they want.
1998
-     *
1999
-     * @access protected
2000
-     * @return array|null
2001
-     * @throws EE_Error
2002
-     * @throws InvalidArgumentException
2003
-     * @throws InvalidDataTypeException
2004
-     * @throws InvalidInterfaceException
2005
-     */
2006
-    protected function _reset_to_default_template()
2007
-    {
2008
-        
2009
-        $templates = array();
2010
-        $GRP_ID    = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2011
-        //we need to make sure we've got the info we need.
2012
-        if ( ! isset($this->_req_data['msgr'], $this->_req_data['mt'], $this->_req_data['GRP_ID'])) {
2013
-            EE_Error::add_error(
2014
-                esc_html__(
2015
-                    '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.',
2016
-                    'event_espresso'
2017
-                ),
2018
-                __FILE__, __FUNCTION__, __LINE__
2019
-            );
2020
-        }
2021
-        
2022
-        // all templates will be reset to whatever the defaults are
2023
-        // for the global template matching the messenger and message type.
2024
-        $success = ! empty($GRP_ID) ? true : false;
2025
-        
2026
-        if ($success) {
1995
+	/**
1996
+	 * This handles resetting the template for the given messenger/message_type so that users can start from scratch if
1997
+	 * they want.
1998
+	 *
1999
+	 * @access protected
2000
+	 * @return array|null
2001
+	 * @throws EE_Error
2002
+	 * @throws InvalidArgumentException
2003
+	 * @throws InvalidDataTypeException
2004
+	 * @throws InvalidInterfaceException
2005
+	 */
2006
+	protected function _reset_to_default_template()
2007
+	{
2008
+        
2009
+		$templates = array();
2010
+		$GRP_ID    = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2011
+		//we need to make sure we've got the info we need.
2012
+		if ( ! isset($this->_req_data['msgr'], $this->_req_data['mt'], $this->_req_data['GRP_ID'])) {
2013
+			EE_Error::add_error(
2014
+				esc_html__(
2015
+					'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.',
2016
+					'event_espresso'
2017
+				),
2018
+				__FILE__, __FUNCTION__, __LINE__
2019
+			);
2020
+		}
2021
+        
2022
+		// all templates will be reset to whatever the defaults are
2023
+		// for the global template matching the messenger and message type.
2024
+		$success = ! empty($GRP_ID) ? true : false;
2025
+        
2026
+		if ($success) {
2027 2027
             
2028
-            //let's first determine if the incoming template is a global template,
2029
-            // if it isn't then we need to get the global template matching messenger and message type.
2030
-            //$MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID( $GRP_ID );
2028
+			//let's first determine if the incoming template is a global template,
2029
+			// if it isn't then we need to get the global template matching messenger and message type.
2030
+			//$MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID( $GRP_ID );
2031 2031
             
2032 2032
             
2033
-            //note this is ONLY deleting the template fields (Message Template rows) NOT the message template group.
2034
-            $success = $this->_delete_mtp_permanently($GRP_ID, false);
2033
+			//note this is ONLY deleting the template fields (Message Template rows) NOT the message template group.
2034
+			$success = $this->_delete_mtp_permanently($GRP_ID, false);
2035 2035
             
2036
-            if ($success) {
2037
-                // if successfully deleted, lets generate the new ones.
2038
-                // Note. We set GLOBAL to true, because resets on ANY template
2039
-                // will use the related global template defaults for regeneration.
2040
-                // This means that if a custom template is reset it resets to whatever the related global template is.
2041
-                // HOWEVER, we DO keep the template pack and template variation set
2042
-                // for the current custom template when resetting.
2043
-                $templates = $this->_generate_new_templates(
2044
-                    $this->_req_data['msgr'],
2045
-                    $this->_req_data['mt'],
2046
-                    $GRP_ID,
2047
-                    true
2048
-                );
2049
-            }
2036
+			if ($success) {
2037
+				// if successfully deleted, lets generate the new ones.
2038
+				// Note. We set GLOBAL to true, because resets on ANY template
2039
+				// will use the related global template defaults for regeneration.
2040
+				// This means that if a custom template is reset it resets to whatever the related global template is.
2041
+				// HOWEVER, we DO keep the template pack and template variation set
2042
+				// for the current custom template when resetting.
2043
+				$templates = $this->_generate_new_templates(
2044
+					$this->_req_data['msgr'],
2045
+					$this->_req_data['mt'],
2046
+					$GRP_ID,
2047
+					true
2048
+				);
2049
+			}
2050 2050
             
2051
-        }
2052
-        
2053
-        //any error messages?
2054
-        if ( ! $success) {
2055
-            EE_Error::add_error(
2056
-                esc_html__('Something went wrong with deleting existing templates. Unable to reset to default',
2057
-                    'event_espresso'),
2058
-                __FILE__, __FUNCTION__, __LINE__
2059
-            );
2060
-        }
2061
-        
2062
-        //all good, let's add a success message!
2063
-        if ($success && ! empty($templates)) {
2064
-            //the info for the template we generated is the first element in the returned array
2065
-            // $templates = $templates[0];
2066
-            EE_Error::overwrite_success();
2067
-            EE_Error::add_success(__('Templates have been reset to defaults.', 'event_espresso'));
2068
-        }
2069
-        
2070
-        
2071
-        $query_args = array(
2072
-            'id'      => isset($templates['GRP_ID']) ? $templates['GRP_ID'] : null,
2073
-            'context' => isset($templates['MTP_context']) ? $templates['MTP_context'] : null,
2074
-            'action'  => isset($templates['GRP_ID']) ? 'edit_message_template' : 'global_mtps'
2075
-        );
2076
-        
2077
-        //if called via ajax then we return query args otherwise redirect
2078
-        if (defined('DOING_AJAX') && DOING_AJAX) {
2079
-            return $query_args;
2080
-        } else {
2081
-            $this->_redirect_after_action(false, '', '', $query_args, true);
2051
+		}
2052
+        
2053
+		//any error messages?
2054
+		if ( ! $success) {
2055
+			EE_Error::add_error(
2056
+				esc_html__('Something went wrong with deleting existing templates. Unable to reset to default',
2057
+					'event_espresso'),
2058
+				__FILE__, __FUNCTION__, __LINE__
2059
+			);
2060
+		}
2061
+        
2062
+		//all good, let's add a success message!
2063
+		if ($success && ! empty($templates)) {
2064
+			//the info for the template we generated is the first element in the returned array
2065
+			// $templates = $templates[0];
2066
+			EE_Error::overwrite_success();
2067
+			EE_Error::add_success(__('Templates have been reset to defaults.', 'event_espresso'));
2068
+		}
2069
+        
2070
+        
2071
+		$query_args = array(
2072
+			'id'      => isset($templates['GRP_ID']) ? $templates['GRP_ID'] : null,
2073
+			'context' => isset($templates['MTP_context']) ? $templates['MTP_context'] : null,
2074
+			'action'  => isset($templates['GRP_ID']) ? 'edit_message_template' : 'global_mtps'
2075
+		);
2076
+        
2077
+		//if called via ajax then we return query args otherwise redirect
2078
+		if (defined('DOING_AJAX') && DOING_AJAX) {
2079
+			return $query_args;
2080
+		} else {
2081
+			$this->_redirect_after_action(false, '', '', $query_args, true);
2082 2082
 
2083
-            return null;
2084
-        }
2085
-    }
2083
+			return null;
2084
+		}
2085
+	}
2086 2086
 
2087 2087
 
2088
-    /**
2089
-     * Retrieve and set the message preview for display.
2090
-     *
2091
-     * @param bool $send if TRUE then we are doing an actual TEST send with the results of the preview.
2092
-     * @return string
2093
-     * @throws ReflectionException
2094
-     * @throws EE_Error
2095
-     * @throws InvalidArgumentException
2096
-     * @throws InvalidDataTypeException
2097
-     * @throws InvalidInterfaceException
2098
-     */
2099
-    public function _preview_message($send = false)
2100
-    {
2101
-        //first make sure we've got the necessary parameters
2102
-        if (
2103
-        ! isset(
2104
-            $this->_req_data['message_type'],
2105
-            $this->_req_data['messenger'],
2106
-            $this->_req_data['messenger'],
2107
-            $this->_req_data['GRP_ID']
2108
-        )
2109
-        ) {
2110
-            EE_Error::add_error(
2111
-                esc_html__('Missing necessary parameters for displaying preview', 'event_espresso'),
2112
-                __FILE__, __FUNCTION__, __LINE__
2113
-            );
2114
-        }
2115
-        
2116
-        EE_Registry::instance()->REQ->set('GRP_ID', $this->_req_data['GRP_ID']);
2117
-        
2118
-        
2119
-        //get the preview!
2120
-        $preview = EED_Messages::preview_message($this->_req_data['message_type'], $this->_req_data['context'],
2121
-            $this->_req_data['messenger'], $send);
2122
-        
2123
-        if ($send) {
2124
-            return $preview;
2125
-        }
2126
-        
2127
-        //let's add a button to go back to the edit view
2128
-        $query_args             = array(
2129
-            'id'      => $this->_req_data['GRP_ID'],
2130
-            'context' => $this->_req_data['context'],
2131
-            'action'  => 'edit_message_template'
2132
-        );
2133
-        $go_back_url            = parent::add_query_args_and_nonce($query_args, $this->_admin_base_url);
2134
-        $preview_button         = '<a href="'
2135
-                                  . $go_back_url
2136
-                                  . '" class="button-secondary messages-preview-go-back-button">'
2137
-                                  . esc_html__('Go Back to Edit', 'event_espresso')
2138
-                                  . '</a>';
2139
-        $message_types          = $this->get_installed_message_types();
2140
-        $active_messenger       = $this->_message_resource_manager->get_active_messenger(
2141
-                $this->_req_data['messenger']
2142
-        );
2143
-        $active_messenger_label = $active_messenger instanceof EE_messenger
2144
-            ? ucwords($active_messenger->label['singular'])
2145
-            : esc_html__('Unknown Messenger', 'event_espresso');
2146
-        //let's provide a helpful title for context
2147
-        $preview_title = sprintf(
2148
-            esc_html__('Viewing Preview for %s %s Message Template', 'event_espresso'),
2149
-            $active_messenger_label,
2150
-            ucwords($message_types[$this->_req_data['message_type']]->label['singular'])
2151
-        );
2152
-        //setup display of preview.
2153
-        $this->_admin_page_title                    = $preview_title;
2154
-        $this->_template_args['admin_page_content'] = $preview_button . '<br />' . $preview;
2155
-        $this->_template_args['data']['force_json'] = true;
2156
-        
2157
-        return '';
2158
-    }
2088
+	/**
2089
+	 * Retrieve and set the message preview for display.
2090
+	 *
2091
+	 * @param bool $send if TRUE then we are doing an actual TEST send with the results of the preview.
2092
+	 * @return string
2093
+	 * @throws ReflectionException
2094
+	 * @throws EE_Error
2095
+	 * @throws InvalidArgumentException
2096
+	 * @throws InvalidDataTypeException
2097
+	 * @throws InvalidInterfaceException
2098
+	 */
2099
+	public function _preview_message($send = false)
2100
+	{
2101
+		//first make sure we've got the necessary parameters
2102
+		if (
2103
+		! isset(
2104
+			$this->_req_data['message_type'],
2105
+			$this->_req_data['messenger'],
2106
+			$this->_req_data['messenger'],
2107
+			$this->_req_data['GRP_ID']
2108
+		)
2109
+		) {
2110
+			EE_Error::add_error(
2111
+				esc_html__('Missing necessary parameters for displaying preview', 'event_espresso'),
2112
+				__FILE__, __FUNCTION__, __LINE__
2113
+			);
2114
+		}
2115
+        
2116
+		EE_Registry::instance()->REQ->set('GRP_ID', $this->_req_data['GRP_ID']);
2117
+        
2118
+        
2119
+		//get the preview!
2120
+		$preview = EED_Messages::preview_message($this->_req_data['message_type'], $this->_req_data['context'],
2121
+			$this->_req_data['messenger'], $send);
2122
+        
2123
+		if ($send) {
2124
+			return $preview;
2125
+		}
2126
+        
2127
+		//let's add a button to go back to the edit view
2128
+		$query_args             = array(
2129
+			'id'      => $this->_req_data['GRP_ID'],
2130
+			'context' => $this->_req_data['context'],
2131
+			'action'  => 'edit_message_template'
2132
+		);
2133
+		$go_back_url            = parent::add_query_args_and_nonce($query_args, $this->_admin_base_url);
2134
+		$preview_button         = '<a href="'
2135
+								  . $go_back_url
2136
+								  . '" class="button-secondary messages-preview-go-back-button">'
2137
+								  . esc_html__('Go Back to Edit', 'event_espresso')
2138
+								  . '</a>';
2139
+		$message_types          = $this->get_installed_message_types();
2140
+		$active_messenger       = $this->_message_resource_manager->get_active_messenger(
2141
+				$this->_req_data['messenger']
2142
+		);
2143
+		$active_messenger_label = $active_messenger instanceof EE_messenger
2144
+			? ucwords($active_messenger->label['singular'])
2145
+			: esc_html__('Unknown Messenger', 'event_espresso');
2146
+		//let's provide a helpful title for context
2147
+		$preview_title = sprintf(
2148
+			esc_html__('Viewing Preview for %s %s Message Template', 'event_espresso'),
2149
+			$active_messenger_label,
2150
+			ucwords($message_types[$this->_req_data['message_type']]->label['singular'])
2151
+		);
2152
+		//setup display of preview.
2153
+		$this->_admin_page_title                    = $preview_title;
2154
+		$this->_template_args['admin_page_content'] = $preview_button . '<br />' . $preview;
2155
+		$this->_template_args['data']['force_json'] = true;
2156
+        
2157
+		return '';
2158
+	}
2159 2159
     
2160 2160
     
2161
-    /**
2162
-     * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
2163
-     * gets called automatically.
2164
-     *
2165
-     * @since 4.5.0
2166
-     *
2167
-     * @return string
2168
-     */
2169
-    protected function _display_preview_message()
2170
-    {
2171
-        $this->display_admin_page_with_no_sidebar();
2172
-    }
2161
+	/**
2162
+	 * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
2163
+	 * gets called automatically.
2164
+	 *
2165
+	 * @since 4.5.0
2166
+	 *
2167
+	 * @return string
2168
+	 */
2169
+	protected function _display_preview_message()
2170
+	{
2171
+		$this->display_admin_page_with_no_sidebar();
2172
+	}
2173 2173
     
2174 2174
     
2175
-    /**
2176
-     * registers metaboxes that should show up on the "edit_message_template" page
2177
-     *
2178
-     * @access protected
2179
-     * @return void
2180
-     */
2181
-    protected function _register_edit_meta_boxes()
2182
-    {
2183
-        add_meta_box(
2184
-            'mtp_valid_shortcodes',
2185
-            esc_html__('Valid Shortcodes', 'event_espresso'),
2186
-            array($this, 'shortcode_meta_box'),
2187
-            $this->_current_screen->id,
2188
-            'side',
2189
-            'default');
2190
-        add_meta_box(
2191
-            'mtp_extra_actions',
2192
-            esc_html__('Extra Actions', 'event_espresso'),
2193
-            array($this, 'extra_actions_meta_box'),
2194
-            $this->_current_screen->id,
2195
-            'side',
2196
-            'high'
2197
-        );
2198
-        add_meta_box(
2199
-            'mtp_templates',
2200
-            esc_html__('Template Styles', 'event_espresso'),
2201
-            array($this, 'template_pack_meta_box'),
2202
-            $this->_current_screen->id,
2203
-            'side',
2204
-            'high'
2205
-        );
2206
-    }
2175
+	/**
2176
+	 * registers metaboxes that should show up on the "edit_message_template" page
2177
+	 *
2178
+	 * @access protected
2179
+	 * @return void
2180
+	 */
2181
+	protected function _register_edit_meta_boxes()
2182
+	{
2183
+		add_meta_box(
2184
+			'mtp_valid_shortcodes',
2185
+			esc_html__('Valid Shortcodes', 'event_espresso'),
2186
+			array($this, 'shortcode_meta_box'),
2187
+			$this->_current_screen->id,
2188
+			'side',
2189
+			'default');
2190
+		add_meta_box(
2191
+			'mtp_extra_actions',
2192
+			esc_html__('Extra Actions', 'event_espresso'),
2193
+			array($this, 'extra_actions_meta_box'),
2194
+			$this->_current_screen->id,
2195
+			'side',
2196
+			'high'
2197
+		);
2198
+		add_meta_box(
2199
+			'mtp_templates',
2200
+			esc_html__('Template Styles', 'event_espresso'),
2201
+			array($this, 'template_pack_meta_box'),
2202
+			$this->_current_screen->id,
2203
+			'side',
2204
+			'high'
2205
+		);
2206
+	}
2207 2207
 
2208 2208
 
2209
-    /**
2210
-     * metabox content for all template pack and variation selection.
2211
-     *
2212
-     * @since 4.5.0
2213
-     * @return string
2214
-     * @throws DomainException
2215
-     * @throws EE_Error
2216
-     * @throws InvalidArgumentException
2217
-     * @throws ReflectionException
2218
-     * @throws InvalidDataTypeException
2219
-     * @throws InvalidInterfaceException
2220
-     */
2221
-    public function template_pack_meta_box()
2222
-    {
2223
-        $this->_set_message_template_group();
2224
-        
2225
-        $tp_collection = EEH_MSG_Template::get_template_pack_collection();
2226
-        
2227
-        $tp_select_values = array();
2228
-        
2229
-        foreach ($tp_collection as $tp) {
2230
-            //only include template packs that support this messenger and message type!
2231
-            $supports = $tp->get_supports();
2232
-            if (
2233
-                ! isset($supports[$this->_message_template_group->messenger()])
2234
-                || ! in_array(
2235
-                    $this->_message_template_group->message_type(),
2236
-                    $supports[$this->_message_template_group->messenger()],
2237
-                    true
2238
-                )
2239
-            ) {
2240
-                //not supported
2241
-                continue;
2242
-            }
2209
+	/**
2210
+	 * metabox content for all template pack and variation selection.
2211
+	 *
2212
+	 * @since 4.5.0
2213
+	 * @return string
2214
+	 * @throws DomainException
2215
+	 * @throws EE_Error
2216
+	 * @throws InvalidArgumentException
2217
+	 * @throws ReflectionException
2218
+	 * @throws InvalidDataTypeException
2219
+	 * @throws InvalidInterfaceException
2220
+	 */
2221
+	public function template_pack_meta_box()
2222
+	{
2223
+		$this->_set_message_template_group();
2224
+        
2225
+		$tp_collection = EEH_MSG_Template::get_template_pack_collection();
2226
+        
2227
+		$tp_select_values = array();
2228
+        
2229
+		foreach ($tp_collection as $tp) {
2230
+			//only include template packs that support this messenger and message type!
2231
+			$supports = $tp->get_supports();
2232
+			if (
2233
+				! isset($supports[$this->_message_template_group->messenger()])
2234
+				|| ! in_array(
2235
+					$this->_message_template_group->message_type(),
2236
+					$supports[$this->_message_template_group->messenger()],
2237
+					true
2238
+				)
2239
+			) {
2240
+				//not supported
2241
+				continue;
2242
+			}
2243 2243
             
2244
-            $tp_select_values[] = array(
2245
-                'text' => $tp->label,
2246
-                'id'   => $tp->dbref
2247
-            );
2248
-        }
2249
-        
2250
-        //if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by
2251
-        // the default template pack.  This still allows for the odd template pack to override.
2252
-        if (empty($tp_select_values)) {
2253
-            $tp_select_values[] = array(
2254
-                'text' => esc_html__('Default', 'event_espresso'),
2255
-                'id'   => 'default'
2256
-            );
2257
-        }
2258
-        
2259
-        //setup variation select values for the currently selected template.
2260
-        $variations               = $this->_message_template_group->get_template_pack()->get_variations(
2261
-            $this->_message_template_group->messenger(),
2262
-            $this->_message_template_group->message_type()
2263
-        );
2264
-        $variations_select_values = array();
2265
-        foreach ($variations as $variation => $label) {
2266
-            $variations_select_values[] = array(
2267
-                'text' => $label,
2268
-                'id'   => $variation
2269
-            );
2270
-        }
2271
-        
2272
-        $template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
2273
-        
2274
-        $template_args['template_packs_selector']        = EEH_Form_Fields::select_input(
2275
-            'MTP_template_pack',
2276
-            $tp_select_values,
2277
-            $this->_message_template_group->get_template_pack_name()
2278
-        );
2279
-        $template_args['variations_selector']            = EEH_Form_Fields::select_input(
2280
-            'MTP_template_variation',
2281
-            $variations_select_values,
2282
-            $this->_message_template_group->get_template_pack_variation()
2283
-        );
2284
-        $template_args['template_pack_label']            = $template_pack_labels->template_pack;
2285
-        $template_args['template_variation_label']       = $template_pack_labels->template_variation;
2286
-        $template_args['template_pack_description']      = $template_pack_labels->template_pack_description;
2287
-        $template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
2288
-        
2289
-        $template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
2290
-        
2291
-        EEH_Template::display_template($template, $template_args);
2292
-    }
2244
+			$tp_select_values[] = array(
2245
+				'text' => $tp->label,
2246
+				'id'   => $tp->dbref
2247
+			);
2248
+		}
2249
+        
2250
+		//if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by
2251
+		// the default template pack.  This still allows for the odd template pack to override.
2252
+		if (empty($tp_select_values)) {
2253
+			$tp_select_values[] = array(
2254
+				'text' => esc_html__('Default', 'event_espresso'),
2255
+				'id'   => 'default'
2256
+			);
2257
+		}
2258
+        
2259
+		//setup variation select values for the currently selected template.
2260
+		$variations               = $this->_message_template_group->get_template_pack()->get_variations(
2261
+			$this->_message_template_group->messenger(),
2262
+			$this->_message_template_group->message_type()
2263
+		);
2264
+		$variations_select_values = array();
2265
+		foreach ($variations as $variation => $label) {
2266
+			$variations_select_values[] = array(
2267
+				'text' => $label,
2268
+				'id'   => $variation
2269
+			);
2270
+		}
2271
+        
2272
+		$template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
2273
+        
2274
+		$template_args['template_packs_selector']        = EEH_Form_Fields::select_input(
2275
+			'MTP_template_pack',
2276
+			$tp_select_values,
2277
+			$this->_message_template_group->get_template_pack_name()
2278
+		);
2279
+		$template_args['variations_selector']            = EEH_Form_Fields::select_input(
2280
+			'MTP_template_variation',
2281
+			$variations_select_values,
2282
+			$this->_message_template_group->get_template_pack_variation()
2283
+		);
2284
+		$template_args['template_pack_label']            = $template_pack_labels->template_pack;
2285
+		$template_args['template_variation_label']       = $template_pack_labels->template_variation;
2286
+		$template_args['template_pack_description']      = $template_pack_labels->template_pack_description;
2287
+		$template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
2288
+        
2289
+		$template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
2290
+        
2291
+		EEH_Template::display_template($template, $template_args);
2292
+	}
2293 2293
     
2294 2294
     
2295
-    /**
2296
-     * This meta box holds any extra actions related to Message Templates
2297
-     * For now, this includes Resetting templates to defaults and sending a test email.
2298
-     *
2299
-     * @access  public
2300
-     * @return void
2301
-     * @throws EE_Error
2302
-     */
2303
-    public function extra_actions_meta_box()
2304
-    {
2305
-        $template_form_fields = array();
2306
-        
2307
-        $extra_args = array(
2308
-            'msgr'   => $this->_message_template_group->messenger(),
2309
-            'mt'     => $this->_message_template_group->message_type(),
2310
-            'GRP_ID' => $this->_message_template_group->GRP_ID()
2311
-        );
2312
-        //first we need to see if there are any fields
2313
-        $fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2314
-        
2315
-        if ( ! empty($fields)) {
2316
-            //yup there be fields
2317
-            foreach ($fields as $field => $config) {
2318
-                $field_id = $this->_message_template_group->messenger() . '_' . $field;
2319
-                $existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2320
-                $default  = isset($config['default']) ? $config['default'] : '';
2321
-                $default  = isset($config['value']) ? $config['value'] : $default;
2295
+	/**
2296
+	 * This meta box holds any extra actions related to Message Templates
2297
+	 * For now, this includes Resetting templates to defaults and sending a test email.
2298
+	 *
2299
+	 * @access  public
2300
+	 * @return void
2301
+	 * @throws EE_Error
2302
+	 */
2303
+	public function extra_actions_meta_box()
2304
+	{
2305
+		$template_form_fields = array();
2306
+        
2307
+		$extra_args = array(
2308
+			'msgr'   => $this->_message_template_group->messenger(),
2309
+			'mt'     => $this->_message_template_group->message_type(),
2310
+			'GRP_ID' => $this->_message_template_group->GRP_ID()
2311
+		);
2312
+		//first we need to see if there are any fields
2313
+		$fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2314
+        
2315
+		if ( ! empty($fields)) {
2316
+			//yup there be fields
2317
+			foreach ($fields as $field => $config) {
2318
+				$field_id = $this->_message_template_group->messenger() . '_' . $field;
2319
+				$existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2320
+				$default  = isset($config['default']) ? $config['default'] : '';
2321
+				$default  = isset($config['value']) ? $config['value'] : $default;
2322 2322
                 
2323
-                // if type is hidden and the value is empty
2324
-                // something may have gone wrong so let's correct with the defaults
2325
-                $fix              = $config['input'] === 'hidden'
2326
-                                    && isset($existing[$field])
2327
-                                    && empty($existing[$field])
2328
-                    ? $default
2329
-                    : '';
2330
-                $existing[$field] = isset($existing[$field]) && empty($fix)
2331
-                    ? $existing[$field]
2332
-                    : $fix;
2323
+				// if type is hidden and the value is empty
2324
+				// something may have gone wrong so let's correct with the defaults
2325
+				$fix              = $config['input'] === 'hidden'
2326
+									&& isset($existing[$field])
2327
+									&& empty($existing[$field])
2328
+					? $default
2329
+					: '';
2330
+				$existing[$field] = isset($existing[$field]) && empty($fix)
2331
+					? $existing[$field]
2332
+					: $fix;
2333 2333
                 
2334
-                $template_form_fields[$field_id] = array(
2335
-                    'name'       => 'test_settings_fld[' . $field . ']',
2336
-                    'label'      => $config['label'],
2337
-                    'input'      => $config['input'],
2338
-                    'type'       => $config['type'],
2339
-                    'required'   => $config['required'],
2340
-                    'validation' => $config['validation'],
2341
-                    'value'      => isset($existing[$field]) ? $existing[$field] : $default,
2342
-                    'css_class'  => $config['css_class'],
2343
-                    'options'    => isset($config['options']) ? $config['options'] : array(),
2344
-                    'default'    => $default,
2345
-                    'format'     => $config['format']
2346
-                );
2347
-            }
2348
-        }
2349
-        
2350
-        $test_settings_fields = ! empty($template_form_fields)
2351
-            ? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2352
-            : '';
2353
-        
2354
-        $test_settings_html = '';
2355
-        //print out $test_settings_fields
2356
-        if ( ! empty($test_settings_fields)) {
2357
-            echo $test_settings_fields;
2358
-            $test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2359
-            $test_settings_html .= 'name="test_button" value="';
2360
-            $test_settings_html .= esc_html__('Test Send', 'event_espresso');
2361
-            $test_settings_html .= '" /><div style="clear:both"></div>';
2362
-        }
2363
-        
2364
-        //and button
2365
-        $test_settings_html .= '<p>'
2366
-                               . esc_html__('Need to reset this message type and start over?', 'event_espresso')
2367
-                               . '</p>';
2368
-        $test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2369
-        $test_settings_html .= $this->get_action_link_or_button(
2370
-            'reset_to_default',
2371
-            'reset',
2372
-            $extra_args,
2373
-            'button-primary reset-default-button'
2374
-        );
2375
-        $test_settings_html .= '</div><div style="clear:both"></div>';
2376
-        echo $test_settings_html;
2377
-    }
2334
+				$template_form_fields[$field_id] = array(
2335
+					'name'       => 'test_settings_fld[' . $field . ']',
2336
+					'label'      => $config['label'],
2337
+					'input'      => $config['input'],
2338
+					'type'       => $config['type'],
2339
+					'required'   => $config['required'],
2340
+					'validation' => $config['validation'],
2341
+					'value'      => isset($existing[$field]) ? $existing[$field] : $default,
2342
+					'css_class'  => $config['css_class'],
2343
+					'options'    => isset($config['options']) ? $config['options'] : array(),
2344
+					'default'    => $default,
2345
+					'format'     => $config['format']
2346
+				);
2347
+			}
2348
+		}
2349
+        
2350
+		$test_settings_fields = ! empty($template_form_fields)
2351
+			? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2352
+			: '';
2353
+        
2354
+		$test_settings_html = '';
2355
+		//print out $test_settings_fields
2356
+		if ( ! empty($test_settings_fields)) {
2357
+			echo $test_settings_fields;
2358
+			$test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2359
+			$test_settings_html .= 'name="test_button" value="';
2360
+			$test_settings_html .= esc_html__('Test Send', 'event_espresso');
2361
+			$test_settings_html .= '" /><div style="clear:both"></div>';
2362
+		}
2363
+        
2364
+		//and button
2365
+		$test_settings_html .= '<p>'
2366
+							   . esc_html__('Need to reset this message type and start over?', 'event_espresso')
2367
+							   . '</p>';
2368
+		$test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2369
+		$test_settings_html .= $this->get_action_link_or_button(
2370
+			'reset_to_default',
2371
+			'reset',
2372
+			$extra_args,
2373
+			'button-primary reset-default-button'
2374
+		);
2375
+		$test_settings_html .= '</div><div style="clear:both"></div>';
2376
+		echo $test_settings_html;
2377
+	}
2378 2378
 
2379 2379
 
2380
-    /**
2381
-     * This returns the shortcode selector skeleton for a given context and field.
2382
-     *
2383
-     * @since 4.9.rc.000
2384
-     * @param string $field           The name of the field retrieving shortcodes for.
2385
-     * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2386
-     * @return string
2387
-     * @throws DomainException
2388
-     * @throws EE_Error
2389
-     * @throws InvalidArgumentException
2390
-     * @throws ReflectionException
2391
-     * @throws InvalidDataTypeException
2392
-     * @throws InvalidInterfaceException
2393
-     */
2394
-    protected function _get_shortcode_selector($field, $linked_input_id)
2395
-    {
2396
-        $template_args = array(
2397
-            'shortcodes'      => $this->_get_shortcodes(array($field), true),
2398
-            'fieldname'       => $field,
2399
-            'linked_input_id' => $linked_input_id
2400
-        );
2401
-        
2402
-        return EEH_Template::display_template(
2403
-            EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2404
-            $template_args,
2405
-            true
2406
-        );
2407
-    }
2380
+	/**
2381
+	 * This returns the shortcode selector skeleton for a given context and field.
2382
+	 *
2383
+	 * @since 4.9.rc.000
2384
+	 * @param string $field           The name of the field retrieving shortcodes for.
2385
+	 * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2386
+	 * @return string
2387
+	 * @throws DomainException
2388
+	 * @throws EE_Error
2389
+	 * @throws InvalidArgumentException
2390
+	 * @throws ReflectionException
2391
+	 * @throws InvalidDataTypeException
2392
+	 * @throws InvalidInterfaceException
2393
+	 */
2394
+	protected function _get_shortcode_selector($field, $linked_input_id)
2395
+	{
2396
+		$template_args = array(
2397
+			'shortcodes'      => $this->_get_shortcodes(array($field), true),
2398
+			'fieldname'       => $field,
2399
+			'linked_input_id' => $linked_input_id
2400
+		);
2401
+        
2402
+		return EEH_Template::display_template(
2403
+			EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2404
+			$template_args,
2405
+			true
2406
+		);
2407
+	}
2408 2408
 
2409 2409
 
2410
-    /**
2411
-     * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2412
-     * page)
2413
-     *
2414
-     * @access public
2415
-     * @return void
2416
-     * @throws EE_Error
2417
-     * @throws InvalidArgumentException
2418
-     * @throws ReflectionException
2419
-     * @throws InvalidDataTypeException
2420
-     * @throws InvalidInterfaceException
2421
-     */
2422
-    public function shortcode_meta_box()
2423
-    {
2424
-        $shortcodes = $this->_get_shortcodes(array(), false); //just make sure shortcodes property is set
2425
-        //$messenger = $this->_message_template_group->messenger_obj();
2426
-        //now let's set the content depending on the status of the shortcodes array
2427
-        if (empty($shortcodes)) {
2428
-            $content = '<p>' . esc_html__('There are no valid shortcodes available', 'event_espresso') . '</p>';
2429
-            echo $content;
2430
-        } else {
2431
-            //$alt = 0;
2432
-            ?>
2410
+	/**
2411
+	 * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2412
+	 * page)
2413
+	 *
2414
+	 * @access public
2415
+	 * @return void
2416
+	 * @throws EE_Error
2417
+	 * @throws InvalidArgumentException
2418
+	 * @throws ReflectionException
2419
+	 * @throws InvalidDataTypeException
2420
+	 * @throws InvalidInterfaceException
2421
+	 */
2422
+	public function shortcode_meta_box()
2423
+	{
2424
+		$shortcodes = $this->_get_shortcodes(array(), false); //just make sure shortcodes property is set
2425
+		//$messenger = $this->_message_template_group->messenger_obj();
2426
+		//now let's set the content depending on the status of the shortcodes array
2427
+		if (empty($shortcodes)) {
2428
+			$content = '<p>' . esc_html__('There are no valid shortcodes available', 'event_espresso') . '</p>';
2429
+			echo $content;
2430
+		} else {
2431
+			//$alt = 0;
2432
+			?>
2433 2433
             <div style="float:right; margin-top:10px"><?php echo $this->_get_help_tab_link('message_template_shortcodes'); ?></div>
2434 2434
             <p class="small-text"><?php printf(
2435
-                    esc_html__(
2436
-                        'You can view the shortcodes usable in your template by clicking the %s icon next to each field.',
2437
-                        'event_espresso'
2438
-                    ),
2439
-                    '<span class="dashicons dashicons-menu"></span>'
2440
-                ); ?></p>
2435
+					esc_html__(
2436
+						'You can view the shortcodes usable in your template by clicking the %s icon next to each field.',
2437
+						'event_espresso'
2438
+					),
2439
+					'<span class="dashicons dashicons-menu"></span>'
2440
+				); ?></p>
2441 2441
             <?php
2442
-        }
2442
+		}
2443 2443
         
2444 2444
         
2445
-    }
2445
+	}
2446 2446
 
2447 2447
 
2448
-    /**
2449
-     * used to set the $_shortcodes property for when its needed elsewhere.
2450
-     *
2451
-     * @access protected
2452
-     * @return void
2453
-     * @throws EE_Error
2454
-     * @throws InvalidArgumentException
2455
-     * @throws ReflectionException
2456
-     * @throws InvalidDataTypeException
2457
-     * @throws InvalidInterfaceException
2458
-     */
2459
-    protected function _set_shortcodes()
2460
-    {
2461
-        
2462
-        //no need to run this if the property is already set
2463
-        if ( ! empty($this->_shortcodes)) {
2464
-            return;
2465
-        }
2466
-        
2467
-        $this->_shortcodes = $this->_get_shortcodes();
2468
-    }
2448
+	/**
2449
+	 * used to set the $_shortcodes property for when its needed elsewhere.
2450
+	 *
2451
+	 * @access protected
2452
+	 * @return void
2453
+	 * @throws EE_Error
2454
+	 * @throws InvalidArgumentException
2455
+	 * @throws ReflectionException
2456
+	 * @throws InvalidDataTypeException
2457
+	 * @throws InvalidInterfaceException
2458
+	 */
2459
+	protected function _set_shortcodes()
2460
+	{
2461
+        
2462
+		//no need to run this if the property is already set
2463
+		if ( ! empty($this->_shortcodes)) {
2464
+			return;
2465
+		}
2466
+        
2467
+		$this->_shortcodes = $this->_get_shortcodes();
2468
+	}
2469 2469
 
2470 2470
 
2471
-    /**
2472
-     * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2473
-     * property)
2474
-     *
2475
-     * @access  protected
2476
-     * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2477
-     *                         for. Defaults to all (for the given context)
2478
-     * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2479
-     * @return array Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2480
-     *                         true just an array of shortcode/label pairs.
2481
-     * @throws EE_Error
2482
-     * @throws InvalidArgumentException
2483
-     * @throws ReflectionException
2484
-     * @throws InvalidDataTypeException
2485
-     * @throws InvalidInterfaceException
2486
-     */
2487
-    protected function _get_shortcodes($fields = array(), $merged = true)
2488
-    {
2489
-        $this->_set_message_template_group();
2490
-        
2491
-        //we need the messenger and message template to retrieve the valid shortcodes array.
2492
-        $GRP_ID  = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
2493
-            ? absint($this->_req_data['id'])
2494
-            : false;
2495
-        $context = isset($this->_req_data['context'])
2496
-            ? $this->_req_data['context']
2497
-            : key($this->_message_template_group->contexts_config());
2498
-        
2499
-        return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2500
-    }
2471
+	/**
2472
+	 * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2473
+	 * property)
2474
+	 *
2475
+	 * @access  protected
2476
+	 * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2477
+	 *                         for. Defaults to all (for the given context)
2478
+	 * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2479
+	 * @return array Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2480
+	 *                         true just an array of shortcode/label pairs.
2481
+	 * @throws EE_Error
2482
+	 * @throws InvalidArgumentException
2483
+	 * @throws ReflectionException
2484
+	 * @throws InvalidDataTypeException
2485
+	 * @throws InvalidInterfaceException
2486
+	 */
2487
+	protected function _get_shortcodes($fields = array(), $merged = true)
2488
+	{
2489
+		$this->_set_message_template_group();
2490
+        
2491
+		//we need the messenger and message template to retrieve the valid shortcodes array.
2492
+		$GRP_ID  = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
2493
+			? absint($this->_req_data['id'])
2494
+			: false;
2495
+		$context = isset($this->_req_data['context'])
2496
+			? $this->_req_data['context']
2497
+			: key($this->_message_template_group->contexts_config());
2498
+        
2499
+		return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2500
+	}
2501 2501
 
2502 2502
 
2503
-    /**
2504
-     * This sets the _message_template property (containing the called message_template object)
2505
-     *
2506
-     * @access protected
2507
-     * @return void
2508
-     * @throws EE_Error
2509
-     * @throws InvalidArgumentException
2510
-     * @throws ReflectionException
2511
-     * @throws InvalidDataTypeException
2512
-     * @throws InvalidInterfaceException
2513
-     */
2514
-    protected function _set_message_template_group()
2515
-    {
2516
-        
2517
-        if ( ! empty($this->_message_template_group)) {
2518
-            return;
2519
-        } //get out if this is already set.
2520
-        
2521
-        $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2522
-        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2523
-        
2524
-        //let's get the message templates
2525
-        $MTP = EEM_Message_Template_Group::instance();
2526
-        
2527
-        if (empty($GRP_ID)) {
2528
-            $this->_message_template_group = $MTP->create_default_object();
2529
-        } else {
2530
-            $this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2531
-        }
2532
-        
2533
-        $this->_template_pack = $this->_message_template_group->get_template_pack();
2534
-        $this->_variation     = $this->_message_template_group->get_template_pack_variation();
2535
-        
2536
-    }
2503
+	/**
2504
+	 * This sets the _message_template property (containing the called message_template object)
2505
+	 *
2506
+	 * @access protected
2507
+	 * @return void
2508
+	 * @throws EE_Error
2509
+	 * @throws InvalidArgumentException
2510
+	 * @throws ReflectionException
2511
+	 * @throws InvalidDataTypeException
2512
+	 * @throws InvalidInterfaceException
2513
+	 */
2514
+	protected function _set_message_template_group()
2515
+	{
2516
+        
2517
+		if ( ! empty($this->_message_template_group)) {
2518
+			return;
2519
+		} //get out if this is already set.
2520
+        
2521
+		$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2522
+		$GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2523
+        
2524
+		//let's get the message templates
2525
+		$MTP = EEM_Message_Template_Group::instance();
2526
+        
2527
+		if (empty($GRP_ID)) {
2528
+			$this->_message_template_group = $MTP->create_default_object();
2529
+		} else {
2530
+			$this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2531
+		}
2532
+        
2533
+		$this->_template_pack = $this->_message_template_group->get_template_pack();
2534
+		$this->_variation     = $this->_message_template_group->get_template_pack_variation();
2535
+        
2536
+	}
2537 2537
 
2538 2538
 
2539
-    /**
2540
-     * sets up a context switcher for edit forms
2541
-     *
2542
-     * @access  protected
2543
-     * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2544
-     * @param array                      $args                  various things the context switcher needs.
2545
-     * @throws EE_Error
2546
-     */
2547
-    protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2548
-    {
2549
-        $context_details = $template_group_object->contexts_config();
2550
-        $context_label   = $template_group_object->context_label();
2551
-        ob_start();
2552
-        ?>
2539
+	/**
2540
+	 * sets up a context switcher for edit forms
2541
+	 *
2542
+	 * @access  protected
2543
+	 * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2544
+	 * @param array                      $args                  various things the context switcher needs.
2545
+	 * @throws EE_Error
2546
+	 */
2547
+	protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2548
+	{
2549
+		$context_details = $template_group_object->contexts_config();
2550
+		$context_label   = $template_group_object->context_label();
2551
+		ob_start();
2552
+		?>
2553 2553
         <div class="ee-msg-switcher-container">
2554 2554
             <form method="get" action="<?php echo EE_MSG_ADMIN_URL; ?>" id="ee-msg-context-switcher-frm">
2555 2555
                 <?php
2556
-                foreach ($args as $name => $value) {
2557
-                    if ($name === 'context' || empty($value) || $name === 'extra') {
2558
-                        continue;
2559
-                    }
2560
-                    ?>
2556
+				foreach ($args as $name => $value) {
2557
+					if ($name === 'context' || empty($value) || $name === 'extra') {
2558
+						continue;
2559
+					}
2560
+					?>
2561 2561
                     <input type="hidden" name="<?php echo $name; ?>" value="<?php echo $value; ?>"/>
2562 2562
                     <?php
2563
-                }
2564
-                //setup nonce_url
2565
-                wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2566
-                ?>
2563
+				}
2564
+				//setup nonce_url
2565
+				wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2566
+				?>
2567 2567
                 <select name="context">
2568 2568
                     <?php
2569
-                    $context_templates = $template_group_object->context_templates();
2570
-                    if (is_array($context_templates)) :
2571
-                        foreach ($context_templates as $context => $template_fields) :
2572
-                            $checked = ($context === $args['context']) ? 'selected="selected"' : '';
2573
-                            ?>
2569
+					$context_templates = $template_group_object->context_templates();
2570
+					if (is_array($context_templates)) :
2571
+						foreach ($context_templates as $context => $template_fields) :
2572
+							$checked = ($context === $args['context']) ? 'selected="selected"' : '';
2573
+							?>
2574 2574
                             <option value="<?php echo $context; ?>" <?php echo $checked; ?>>
2575 2575
                                 <?php echo $context_details[$context]['label']; ?>
2576 2576
                             </option>
@@ -2583,1863 +2583,1863 @@  discard block
 block discarded – undo
2583 2583
             <?php echo $args['extra']; ?>
2584 2584
         </div> <!-- end .ee-msg-switcher-container -->
2585 2585
         <?php
2586
-        $output = ob_get_contents();
2587
-        ob_clean();
2588
-        $this->_context_switcher = $output;
2589
-    }
2586
+		$output = ob_get_contents();
2587
+		ob_clean();
2588
+		$this->_context_switcher = $output;
2589
+	}
2590 2590
     
2591 2591
     
2592
-    /**
2593
-     * utility for sanitizing new values coming in.
2594
-     * Note: this is only used when updating a context.
2595
-     *
2596
-     * @access protected
2597
-     *
2598
-     * @param int $index This helps us know which template field to select from the request array.
2599
-     *
2600
-     * @return array
2601
-     */
2602
-    protected function _set_message_template_column_values($index)
2603
-    {
2604
-        if (is_array($this->_req_data['MTP_template_fields'][$index]['content'])) {
2605
-            foreach ($this->_req_data['MTP_template_fields'][$index]['content'] as $field => $value) {
2606
-                $this->_req_data['MTP_template_fields'][$index]['content'][$field] = $value;
2607
-            }
2608
-        }
2609
-        
2610
-        
2611
-        $set_column_values = array(
2612
-            'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][$index]['MTP_ID']),
2613
-            'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2614
-            'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2615
-            'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2616
-            'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2617
-            'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][$index]['name']),
2618
-            'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2619
-            'MTP_content'        => $this->_req_data['MTP_template_fields'][$index]['content'],
2620
-            'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2621
-                ? absint($this->_req_data['MTP_is_global'])
2622
-                : 0,
2623
-            'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2624
-                ? absint($this->_req_data['MTP_is_override'])
2625
-                : 0,
2626
-            'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2627
-            'MTP_is_active'      => absint($this->_req_data['MTP_is_active'])
2628
-        );
2629
-        
2630
-        
2631
-        return $set_column_values;
2632
-    }
2592
+	/**
2593
+	 * utility for sanitizing new values coming in.
2594
+	 * Note: this is only used when updating a context.
2595
+	 *
2596
+	 * @access protected
2597
+	 *
2598
+	 * @param int $index This helps us know which template field to select from the request array.
2599
+	 *
2600
+	 * @return array
2601
+	 */
2602
+	protected function _set_message_template_column_values($index)
2603
+	{
2604
+		if (is_array($this->_req_data['MTP_template_fields'][$index]['content'])) {
2605
+			foreach ($this->_req_data['MTP_template_fields'][$index]['content'] as $field => $value) {
2606
+				$this->_req_data['MTP_template_fields'][$index]['content'][$field] = $value;
2607
+			}
2608
+		}
2609
+        
2610
+        
2611
+		$set_column_values = array(
2612
+			'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][$index]['MTP_ID']),
2613
+			'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2614
+			'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2615
+			'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2616
+			'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2617
+			'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][$index]['name']),
2618
+			'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2619
+			'MTP_content'        => $this->_req_data['MTP_template_fields'][$index]['content'],
2620
+			'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2621
+				? absint($this->_req_data['MTP_is_global'])
2622
+				: 0,
2623
+			'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2624
+				? absint($this->_req_data['MTP_is_override'])
2625
+				: 0,
2626
+			'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2627
+			'MTP_is_active'      => absint($this->_req_data['MTP_is_active'])
2628
+		);
2629
+        
2630
+        
2631
+		return $set_column_values;
2632
+	}
2633 2633
     
2634 2634
     
2635
-    protected function _insert_or_update_message_template($new = false)
2636
-    {
2637
-        
2638
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2639
-        $success  = 0;
2640
-        $override = false;
2641
-        
2642
-        //setup notices description
2643
-        $messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2644
-        
2645
-        //need the message type and messenger objects to be able to use the labels for the notices
2646
-        $messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2647
-        $messenger_label  = $messenger_object instanceof EE_messenger
2648
-            ? ucwords($messenger_object->label['singular'])
2649
-            : '';
2650
-        
2651
-        $message_type_slug   = ! empty($this->_req_data['MTP_message_type'])
2652
-            ? $this->_req_data['MTP_message_type']
2653
-            : '';
2654
-        $message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2655
-        
2656
-        $message_type_label = $message_type_object instanceof EE_message_type
2657
-            ? ucwords($message_type_object->label['singular'])
2658
-            : '';
2659
-        
2660
-        $context_slug = ! empty($this->_req_data['MTP_context'])
2661
-            ? $this->_req_data['MTP_context']
2662
-            : '';
2663
-        $context      = ucwords(str_replace('_', ' ', $context_slug));
2664
-        
2665
-        $item_desc = $messenger_label && $message_type_label
2666
-            ? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' '
2667
-            : '';
2668
-        $item_desc .= 'Message Template';
2669
-        $query_args  = array();
2670
-        $edit_array  = array();
2671
-        $action_desc = '';
2672
-        
2673
-        //if this is "new" then we need to generate the default contexts for the selected messenger/message_type for
2674
-        // user to edit.
2675
-        if ($new) {
2676
-            $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2677
-            if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2678
-                if (empty($edit_array)) {
2679
-                    $success = 0;
2680
-                } else {
2681
-                    $success    = 1;
2682
-                    $edit_array = $edit_array[0];
2683
-                    $query_args = array(
2684
-                        'id'      => $edit_array['GRP_ID'],
2685
-                        'context' => $edit_array['MTP_context'],
2686
-                        'action'  => 'edit_message_template'
2687
-                    );
2688
-                }
2689
-            }
2690
-            $action_desc = 'created';
2691
-        } else {
2692
-            $MTPG = EEM_Message_Template_Group::instance();
2693
-            $MTP  = EEM_Message_Template::instance();
2635
+	protected function _insert_or_update_message_template($new = false)
2636
+	{
2637
+        
2638
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2639
+		$success  = 0;
2640
+		$override = false;
2641
+        
2642
+		//setup notices description
2643
+		$messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2644
+        
2645
+		//need the message type and messenger objects to be able to use the labels for the notices
2646
+		$messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2647
+		$messenger_label  = $messenger_object instanceof EE_messenger
2648
+			? ucwords($messenger_object->label['singular'])
2649
+			: '';
2650
+        
2651
+		$message_type_slug   = ! empty($this->_req_data['MTP_message_type'])
2652
+			? $this->_req_data['MTP_message_type']
2653
+			: '';
2654
+		$message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2655
+        
2656
+		$message_type_label = $message_type_object instanceof EE_message_type
2657
+			? ucwords($message_type_object->label['singular'])
2658
+			: '';
2659
+        
2660
+		$context_slug = ! empty($this->_req_data['MTP_context'])
2661
+			? $this->_req_data['MTP_context']
2662
+			: '';
2663
+		$context      = ucwords(str_replace('_', ' ', $context_slug));
2664
+        
2665
+		$item_desc = $messenger_label && $message_type_label
2666
+			? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' '
2667
+			: '';
2668
+		$item_desc .= 'Message Template';
2669
+		$query_args  = array();
2670
+		$edit_array  = array();
2671
+		$action_desc = '';
2672
+        
2673
+		//if this is "new" then we need to generate the default contexts for the selected messenger/message_type for
2674
+		// user to edit.
2675
+		if ($new) {
2676
+			$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2677
+			if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2678
+				if (empty($edit_array)) {
2679
+					$success = 0;
2680
+				} else {
2681
+					$success    = 1;
2682
+					$edit_array = $edit_array[0];
2683
+					$query_args = array(
2684
+						'id'      => $edit_array['GRP_ID'],
2685
+						'context' => $edit_array['MTP_context'],
2686
+						'action'  => 'edit_message_template'
2687
+					);
2688
+				}
2689
+			}
2690
+			$action_desc = 'created';
2691
+		} else {
2692
+			$MTPG = EEM_Message_Template_Group::instance();
2693
+			$MTP  = EEM_Message_Template::instance();
2694 2694
             
2695 2695
             
2696
-            //run update for each template field in displayed context
2697
-            if ( ! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2698
-                EE_Error::add_error(
2699
-                    esc_html__(
2700
-                        'There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2701
-                        'event_espresso'
2702
-                    ),
2703
-                    __FILE__,
2704
-                    __FUNCTION__,
2705
-                    __LINE__
2706
-                );
2707
-                $success = 0;
2696
+			//run update for each template field in displayed context
2697
+			if ( ! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2698
+				EE_Error::add_error(
2699
+					esc_html__(
2700
+						'There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2701
+						'event_espresso'
2702
+					),
2703
+					__FILE__,
2704
+					__FUNCTION__,
2705
+					__LINE__
2706
+				);
2707
+				$success = 0;
2708 2708
                 
2709
-            } else {
2710
-                //first validate all fields!
2711
-                $validates = $MTPG->validate($this->_req_data['MTP_template_fields'], $context_slug, $messenger_slug,
2712
-                    $message_type_slug);
2709
+			} else {
2710
+				//first validate all fields!
2711
+				$validates = $MTPG->validate($this->_req_data['MTP_template_fields'], $context_slug, $messenger_slug,
2712
+					$message_type_slug);
2713 2713
                 
2714
-                //if $validate returned error messages (i.e. is_array()) then we need to process them and setup an
2715
-                // appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.
2716
-                //  WE need to make sure there is no actual error messages in validates.
2717
-                if (is_array($validates) && ! empty($validates)) {
2718
-                    //add the transient so when the form loads we know which fields to highlight
2719
-                    $this->_add_transient('edit_message_template', $validates);
2714
+				//if $validate returned error messages (i.e. is_array()) then we need to process them and setup an
2715
+				// appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.
2716
+				//  WE need to make sure there is no actual error messages in validates.
2717
+				if (is_array($validates) && ! empty($validates)) {
2718
+					//add the transient so when the form loads we know which fields to highlight
2719
+					$this->_add_transient('edit_message_template', $validates);
2720 2720
                     
2721
-                    $success = 0;
2721
+					$success = 0;
2722 2722
                     
2723
-                    //setup notices
2724
-                    foreach ($validates as $field => $error) {
2725
-                        if (isset($error['msg'])) {
2726
-                            EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2727
-                        }
2728
-                    }
2723
+					//setup notices
2724
+					foreach ($validates as $field => $error) {
2725
+						if (isset($error['msg'])) {
2726
+							EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2727
+						}
2728
+					}
2729 2729
                     
2730
-                } else {
2731
-                    $set_column_values = array();
2732
-                    foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2733
-                        $set_column_values = $this->_set_message_template_column_values($template_field);
2730
+				} else {
2731
+					$set_column_values = array();
2732
+					foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2733
+						$set_column_values = $this->_set_message_template_column_values($template_field);
2734 2734
                         
2735
-                        $where_cols_n_values = array(
2736
-                            'MTP_ID' => $this->_req_data['MTP_template_fields'][$template_field]['MTP_ID']
2737
-                        );
2738
-                        //if they aren't allowed to use all JS, restrict them to just posty-y tags
2739
-                        if (! current_user_can('unfiltered_html')){
2740
-                            if (is_array($set_column_values['MTP_content'])){
2741
-                                 foreach($set_column_values['MTP_content'] as $key => $value) {
2742
-                                     //remove slashes so wp_kses works properly (its wp_kses_stripslashes() function
2743
-                                     //only removes slashes from double-quotes, so attributes using single quotes always
2744
-                                     //appear invalid.) But currently the models expect slashed data, so after wp_kses
2745
-                                     //runs we need to re-slash the data. Sheesh. See
2746
-                                     //https://events.codebasehq.com/projects/event-espresso/tickets/11211#update-47321587
2747
-                                     $set_column_values['MTP_content'][$key] = addslashes(
2748
-                                             wp_kses(
2749
-                                                 stripslashes($value),
2750
-                                                 wp_kses_allowed_html('post')
2751
-                                             )
2752
-                                     );
2753
-                                 }
2754
-                            } else {
2755
-                                $set_column_values['MTP_content'] = wp_kses(
2756
-                                    $set_column_values['MTP_content'],
2757
-                                    wp_kses_allowed_html('post')
2758
-                                );
2759
-                            }
2760
-                        }
2761
-                        $message_template_fields = array(
2762
-                            'GRP_ID'             => $set_column_values['GRP_ID'],
2763
-                            'MTP_template_field' => $set_column_values['MTP_template_field'],
2764
-                            'MTP_context'        => $set_column_values['MTP_context'],
2765
-                            'MTP_content'        => $set_column_values['MTP_content']
2766
-                        );
2767
-                        if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2768
-                            if ($updated === false) {
2769
-                                EE_Error::add_error(
2770
-                                    sprintf(
2771
-                                        esc_html__('%s field was NOT updated for some reason', 'event_espresso'),
2772
-                                        $template_field
2773
-                                    ),
2774
-                                    __FILE__,
2775
-                                    __FUNCTION__,
2776
-                                    __LINE__
2777
-                                );
2778
-                            } else {
2779
-                                $success = 1;
2780
-                            }
2781
-                        } else {
2782
-                            //only do this logic if we don't have a MTP_ID for this field
2783
-                            if (empty($this->_req_data['MTP_template_fields'][$template_field]['MTP_ID'])) {
2784
-                                //this has already been through the template field validator and sanitized, so it will be
2785
-                                //safe to insert this field.  Why insert?  This typically happens when we introduce a new
2786
-                                //message template field in a messenger/message type and existing users don't have the
2787
-                                //default setup for it.
2788
-                                //@link https://events.codebasehq.com/projects/event-espresso/tickets/9465
2789
-                                $updated = $MTP->insert($message_template_fields);
2790
-                                if (! $updated || is_wp_error($updated)) {
2791
-                                    EE_Error::add_error(
2792
-                                        sprintf(
2793
-                                            esc_html__('%s field could not be updated.', 'event_espresso'),
2794
-                                            $template_field
2795
-                                        ),
2796
-                                        __FILE__,
2797
-                                        __FUNCTION__,
2798
-                                        __LINE__
2799
-                                    );
2800
-                                    $success = 0;
2801
-                                } else {
2802
-                                    $success = 1;
2803
-                                }
2804
-                            }
2805
-                        }
2806
-                        $action_desc = 'updated';
2807
-                    }
2735
+						$where_cols_n_values = array(
2736
+							'MTP_ID' => $this->_req_data['MTP_template_fields'][$template_field]['MTP_ID']
2737
+						);
2738
+						//if they aren't allowed to use all JS, restrict them to just posty-y tags
2739
+						if (! current_user_can('unfiltered_html')){
2740
+							if (is_array($set_column_values['MTP_content'])){
2741
+								 foreach($set_column_values['MTP_content'] as $key => $value) {
2742
+									 //remove slashes so wp_kses works properly (its wp_kses_stripslashes() function
2743
+									 //only removes slashes from double-quotes, so attributes using single quotes always
2744
+									 //appear invalid.) But currently the models expect slashed data, so after wp_kses
2745
+									 //runs we need to re-slash the data. Sheesh. See
2746
+									 //https://events.codebasehq.com/projects/event-espresso/tickets/11211#update-47321587
2747
+									 $set_column_values['MTP_content'][$key] = addslashes(
2748
+											 wp_kses(
2749
+												 stripslashes($value),
2750
+												 wp_kses_allowed_html('post')
2751
+											 )
2752
+									 );
2753
+								 }
2754
+							} else {
2755
+								$set_column_values['MTP_content'] = wp_kses(
2756
+									$set_column_values['MTP_content'],
2757
+									wp_kses_allowed_html('post')
2758
+								);
2759
+							}
2760
+						}
2761
+						$message_template_fields = array(
2762
+							'GRP_ID'             => $set_column_values['GRP_ID'],
2763
+							'MTP_template_field' => $set_column_values['MTP_template_field'],
2764
+							'MTP_context'        => $set_column_values['MTP_context'],
2765
+							'MTP_content'        => $set_column_values['MTP_content']
2766
+						);
2767
+						if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2768
+							if ($updated === false) {
2769
+								EE_Error::add_error(
2770
+									sprintf(
2771
+										esc_html__('%s field was NOT updated for some reason', 'event_espresso'),
2772
+										$template_field
2773
+									),
2774
+									__FILE__,
2775
+									__FUNCTION__,
2776
+									__LINE__
2777
+								);
2778
+							} else {
2779
+								$success = 1;
2780
+							}
2781
+						} else {
2782
+							//only do this logic if we don't have a MTP_ID for this field
2783
+							if (empty($this->_req_data['MTP_template_fields'][$template_field]['MTP_ID'])) {
2784
+								//this has already been through the template field validator and sanitized, so it will be
2785
+								//safe to insert this field.  Why insert?  This typically happens when we introduce a new
2786
+								//message template field in a messenger/message type and existing users don't have the
2787
+								//default setup for it.
2788
+								//@link https://events.codebasehq.com/projects/event-espresso/tickets/9465
2789
+								$updated = $MTP->insert($message_template_fields);
2790
+								if (! $updated || is_wp_error($updated)) {
2791
+									EE_Error::add_error(
2792
+										sprintf(
2793
+											esc_html__('%s field could not be updated.', 'event_espresso'),
2794
+											$template_field
2795
+										),
2796
+										__FILE__,
2797
+										__FUNCTION__,
2798
+										__LINE__
2799
+									);
2800
+									$success = 0;
2801
+								} else {
2802
+									$success = 1;
2803
+								}
2804
+							}
2805
+						}
2806
+						$action_desc = 'updated';
2807
+					}
2808 2808
                     
2809
-                    //we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2810
-                    $mtpg_fields = array(
2811
-                        'MTP_user_id'      => $set_column_values['MTP_user_id'],
2812
-                        'MTP_messenger'    => $set_column_values['MTP_messenger'],
2813
-                        'MTP_message_type' => $set_column_values['MTP_message_type'],
2814
-                        'MTP_is_global'    => $set_column_values['MTP_is_global'],
2815
-                        'MTP_is_override'  => $set_column_values['MTP_is_override'],
2816
-                        'MTP_deleted'      => $set_column_values['MTP_deleted'],
2817
-                        'MTP_is_active'    => $set_column_values['MTP_is_active'],
2818
-                        'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2819
-                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2820
-                            : '',
2821
-                        'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2822
-                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2823
-                            : ''
2824
-                    );
2809
+					//we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2810
+					$mtpg_fields = array(
2811
+						'MTP_user_id'      => $set_column_values['MTP_user_id'],
2812
+						'MTP_messenger'    => $set_column_values['MTP_messenger'],
2813
+						'MTP_message_type' => $set_column_values['MTP_message_type'],
2814
+						'MTP_is_global'    => $set_column_values['MTP_is_global'],
2815
+						'MTP_is_override'  => $set_column_values['MTP_is_override'],
2816
+						'MTP_deleted'      => $set_column_values['MTP_deleted'],
2817
+						'MTP_is_active'    => $set_column_values['MTP_is_active'],
2818
+						'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2819
+							? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2820
+							: '',
2821
+						'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2822
+							? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2823
+							: ''
2824
+					);
2825 2825
                     
2826
-                    $mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2827
-                    $updated    = $MTPG->update($mtpg_fields, array($mtpg_where));
2826
+					$mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2827
+					$updated    = $MTPG->update($mtpg_fields, array($mtpg_where));
2828 2828
                     
2829
-                    if ($updated === false) {
2830
-                        EE_Error::add_error(
2831
-                            sprintf(
2832
-                                esc_html__(
2833
-                                    'The Message Template Group (%d) was NOT updated for some reason',
2834
-                                    'event_espresso'
2835
-                                ),
2836
-                                $set_column_values['GRP_ID']
2837
-                            ),
2838
-                            __FILE__,
2839
-                            __FUNCTION__,
2840
-                            __LINE__
2841
-                        );
2842
-                    } else {
2843
-                        //k now we need to ensure the template_pack and template_variation fields are set.
2844
-                        $template_pack = ! empty($this->_req_data['MTP_template_pack'])
2845
-                            ? $this->_req_data['MTP_template_pack']
2846
-                            : 'default';
2829
+					if ($updated === false) {
2830
+						EE_Error::add_error(
2831
+							sprintf(
2832
+								esc_html__(
2833
+									'The Message Template Group (%d) was NOT updated for some reason',
2834
+									'event_espresso'
2835
+								),
2836
+								$set_column_values['GRP_ID']
2837
+							),
2838
+							__FILE__,
2839
+							__FUNCTION__,
2840
+							__LINE__
2841
+						);
2842
+					} else {
2843
+						//k now we need to ensure the template_pack and template_variation fields are set.
2844
+						$template_pack = ! empty($this->_req_data['MTP_template_pack'])
2845
+							? $this->_req_data['MTP_template_pack']
2846
+							: 'default';
2847 2847
                         
2848
-                        $template_variation = ! empty($this->_req_data['MTP_template_variation'])
2849
-                            ? $this->_req_data['MTP_template_variation']
2850
-                            : 'default';
2848
+						$template_variation = ! empty($this->_req_data['MTP_template_variation'])
2849
+							? $this->_req_data['MTP_template_variation']
2850
+							: 'default';
2851 2851
                         
2852
-                        $mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2853
-                        if ($mtpg_obj instanceof EE_Message_Template_Group) {
2854
-                            $mtpg_obj->set_template_pack_name($template_pack);
2855
-                            $mtpg_obj->set_template_pack_variation($template_variation);
2856
-                        }
2857
-                        $success = 1;
2858
-                    }
2859
-                }
2860
-            }
2852
+						$mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2853
+						if ($mtpg_obj instanceof EE_Message_Template_Group) {
2854
+							$mtpg_obj->set_template_pack_name($template_pack);
2855
+							$mtpg_obj->set_template_pack_variation($template_variation);
2856
+						}
2857
+						$success = 1;
2858
+					}
2859
+				}
2860
+			}
2861 2861
             
2862
-        }
2863
-        
2864
-        //we return things differently if doing ajax
2865
-        if (defined('DOING_AJAX') && DOING_AJAX) {
2866
-            $this->_template_args['success'] = $success;
2867
-            $this->_template_args['error']   = ! $success ? true : false;
2868
-            $this->_template_args['content'] = '';
2869
-            $this->_template_args['data']    = array(
2870
-                'grpID'        => $edit_array['GRP_ID'],
2871
-                'templateName' => $edit_array['template_name']
2872
-            );
2873
-            if ($success) {
2874
-                EE_Error::overwrite_success();
2875
-                EE_Error::add_success(
2876
-                    esc_html__(
2877
-                        '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.',
2878
-                        'event_espresso'
2879
-                    )
2880
-                );
2881
-            }
2862
+		}
2863
+        
2864
+		//we return things differently if doing ajax
2865
+		if (defined('DOING_AJAX') && DOING_AJAX) {
2866
+			$this->_template_args['success'] = $success;
2867
+			$this->_template_args['error']   = ! $success ? true : false;
2868
+			$this->_template_args['content'] = '';
2869
+			$this->_template_args['data']    = array(
2870
+				'grpID'        => $edit_array['GRP_ID'],
2871
+				'templateName' => $edit_array['template_name']
2872
+			);
2873
+			if ($success) {
2874
+				EE_Error::overwrite_success();
2875
+				EE_Error::add_success(
2876
+					esc_html__(
2877
+						'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.',
2878
+						'event_espresso'
2879
+					)
2880
+				);
2881
+			}
2882 2882
             
2883
-            $this->_return_json();
2884
-        }
2885
-        
2886
-        
2887
-        //was a test send triggered?
2888
-        if (isset($this->_req_data['test_button'])) {
2889
-            EE_Error::overwrite_success();
2890
-            $this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2891
-            $override = true;
2892
-        }
2893
-        
2894
-        if (empty($query_args)) {
2895
-            $query_args = array(
2896
-                'id'      => $this->_req_data['GRP_ID'],
2897
-                'context' => $context_slug,
2898
-                'action'  => 'edit_message_template'
2899
-            );
2900
-        }
2901
-        
2902
-        $this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2903
-    }
2883
+			$this->_return_json();
2884
+		}
2885
+        
2886
+        
2887
+		//was a test send triggered?
2888
+		if (isset($this->_req_data['test_button'])) {
2889
+			EE_Error::overwrite_success();
2890
+			$this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2891
+			$override = true;
2892
+		}
2893
+        
2894
+		if (empty($query_args)) {
2895
+			$query_args = array(
2896
+				'id'      => $this->_req_data['GRP_ID'],
2897
+				'context' => $context_slug,
2898
+				'action'  => 'edit_message_template'
2899
+			);
2900
+		}
2901
+        
2902
+		$this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2903
+	}
2904 2904
 
2905 2905
 
2906
-    /**
2907
-     * processes a test send request to do an actual messenger delivery test for the given message template being tested
2908
-     *
2909
-     * @param  string $context      what context being tested
2910
-     * @param  string $messenger    messenger being tested
2911
-     * @param  string $message_type message type being tested
2912
-     * @throws EE_Error
2913
-     * @throws InvalidArgumentException
2914
-     * @throws InvalidDataTypeException
2915
-     * @throws InvalidInterfaceException
2916
-     */
2917
-    protected function _do_test_send($context, $messenger, $message_type)
2918
-    {
2919
-        //set things up for preview
2920
-        $this->_req_data['messenger']    = $messenger;
2921
-        $this->_req_data['message_type'] = $message_type;
2922
-        $this->_req_data['context']      = $context;
2923
-        $this->_req_data['GRP_ID']       = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
2924
-        $active_messenger                = $this->_message_resource_manager->get_active_messenger($messenger);
2925
-        
2926
-        //let's save any existing fields that might be required by the messenger
2927
-        if (
2928
-            isset($this->_req_data['test_settings_fld'])
2929
-            && $active_messenger instanceof EE_messenger
2930
-            && apply_filters(
2931
-                'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
2932
-                true,
2933
-                $this->_req_data['test_settings_fld'],
2934
-                $active_messenger
2935
-            )
2936
-        ) {
2937
-            $active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
2938
-        }
2939
-        
2940
-        $success = $this->_preview_message(true);
2941
-        
2942
-        if ($success) {
2943
-            EE_Error::add_success(__('Test message sent', 'event_espresso'));
2944
-        } else {
2945
-            EE_Error::add_error(
2946
-                esc_html__('The test message was not sent', 'event_espresso'),
2947
-                __FILE__,
2948
-                __FUNCTION__,
2949
-                __LINE__
2950
-            );
2951
-        }
2952
-    }
2906
+	/**
2907
+	 * processes a test send request to do an actual messenger delivery test for the given message template being tested
2908
+	 *
2909
+	 * @param  string $context      what context being tested
2910
+	 * @param  string $messenger    messenger being tested
2911
+	 * @param  string $message_type message type being tested
2912
+	 * @throws EE_Error
2913
+	 * @throws InvalidArgumentException
2914
+	 * @throws InvalidDataTypeException
2915
+	 * @throws InvalidInterfaceException
2916
+	 */
2917
+	protected function _do_test_send($context, $messenger, $message_type)
2918
+	{
2919
+		//set things up for preview
2920
+		$this->_req_data['messenger']    = $messenger;
2921
+		$this->_req_data['message_type'] = $message_type;
2922
+		$this->_req_data['context']      = $context;
2923
+		$this->_req_data['GRP_ID']       = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
2924
+		$active_messenger                = $this->_message_resource_manager->get_active_messenger($messenger);
2925
+        
2926
+		//let's save any existing fields that might be required by the messenger
2927
+		if (
2928
+			isset($this->_req_data['test_settings_fld'])
2929
+			&& $active_messenger instanceof EE_messenger
2930
+			&& apply_filters(
2931
+				'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
2932
+				true,
2933
+				$this->_req_data['test_settings_fld'],
2934
+				$active_messenger
2935
+			)
2936
+		) {
2937
+			$active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
2938
+		}
2939
+        
2940
+		$success = $this->_preview_message(true);
2941
+        
2942
+		if ($success) {
2943
+			EE_Error::add_success(__('Test message sent', 'event_espresso'));
2944
+		} else {
2945
+			EE_Error::add_error(
2946
+				esc_html__('The test message was not sent', 'event_espresso'),
2947
+				__FILE__,
2948
+				__FUNCTION__,
2949
+				__LINE__
2950
+			);
2951
+		}
2952
+	}
2953 2953
     
2954 2954
     
2955
-    /**
2956
-     * _generate_new_templates
2957
-     * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
2958
-     * automatically create the defaults for the event.  The user would then be redirected to edit the default context
2959
-     * for the event.
2960
-     *
2961
-     *
2962
-     * @param  string $messenger     the messenger we are generating templates for
2963
-     * @param array   $message_types array of message types that the templates are generated for.
2964
-     * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
2965
-     *                               indicate the message_template_group being used as the base.
2966
-     *
2967
-     * @param bool    $global
2968
-     *
2969
-     * @return array|bool array of data required for the redirect to the correct edit page or bool if
2970
-     *                               encountering problems.
2971
-     * @throws EE_Error
2972
-     */
2973
-    protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
2974
-    {
2975
-        
2976
-        //if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we
2977
-        // just don't generate any templates.
2978
-        if (empty($message_types)) {
2979
-            return true;
2980
-        }
2981
-        
2982
-        return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
2983
-    }
2955
+	/**
2956
+	 * _generate_new_templates
2957
+	 * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
2958
+	 * automatically create the defaults for the event.  The user would then be redirected to edit the default context
2959
+	 * for the event.
2960
+	 *
2961
+	 *
2962
+	 * @param  string $messenger     the messenger we are generating templates for
2963
+	 * @param array   $message_types array of message types that the templates are generated for.
2964
+	 * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
2965
+	 *                               indicate the message_template_group being used as the base.
2966
+	 *
2967
+	 * @param bool    $global
2968
+	 *
2969
+	 * @return array|bool array of data required for the redirect to the correct edit page or bool if
2970
+	 *                               encountering problems.
2971
+	 * @throws EE_Error
2972
+	 */
2973
+	protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
2974
+	{
2975
+        
2976
+		//if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we
2977
+		// just don't generate any templates.
2978
+		if (empty($message_types)) {
2979
+			return true;
2980
+		}
2981
+        
2982
+		return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
2983
+	}
2984 2984
 
2985 2985
 
2986
-    /**
2987
-     * [_trash_or_restore_message_template]
2988
-     *
2989
-     * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
2990
-     * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
2991
-     *                        an individual context (FALSE).
2992
-     * @return void
2993
-     * @throws EE_Error
2994
-     * @throws InvalidArgumentException
2995
-     * @throws InvalidDataTypeException
2996
-     * @throws InvalidInterfaceException
2997
-     */
2998
-    protected function _trash_or_restore_message_template($trash = true, $all = false)
2999
-    {
3000
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3001
-        $MTP = EEM_Message_Template_Group::instance();
3002
-        
3003
-        $success = 1;
3004
-        
3005
-        //incoming GRP_IDs
3006
-        if ($all) {
3007
-            //Checkboxes
3008
-            if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3009
-                //if array has more than one element then success message should be plural.
3010
-                //todo: what about nonce?
3011
-                $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2986
+	/**
2987
+	 * [_trash_or_restore_message_template]
2988
+	 *
2989
+	 * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
2990
+	 * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
2991
+	 *                        an individual context (FALSE).
2992
+	 * @return void
2993
+	 * @throws EE_Error
2994
+	 * @throws InvalidArgumentException
2995
+	 * @throws InvalidDataTypeException
2996
+	 * @throws InvalidInterfaceException
2997
+	 */
2998
+	protected function _trash_or_restore_message_template($trash = true, $all = false)
2999
+	{
3000
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3001
+		$MTP = EEM_Message_Template_Group::instance();
3002
+        
3003
+		$success = 1;
3004
+        
3005
+		//incoming GRP_IDs
3006
+		if ($all) {
3007
+			//Checkboxes
3008
+			if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3009
+				//if array has more than one element then success message should be plural.
3010
+				//todo: what about nonce?
3011
+				$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3012 3012
                 
3013
-                //cycle through checkboxes
3014
-                while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3015
-                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3016
-                    if ( ! $trashed_or_restored) {
3017
-                        $success = 0;
3018
-                    }
3019
-                }
3020
-            } else {
3021
-                //grab single GRP_ID and handle
3022
-                $GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
3023
-                if ( ! empty($GRP_ID)) {
3024
-                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3025
-                    if ( ! $trashed_or_restored) {
3026
-                        $success = 0;
3027
-                    }
3028
-                } else {
3029
-                    $success = 0;
3030
-                }
3031
-            }
3013
+				//cycle through checkboxes
3014
+				while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3015
+					$trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3016
+					if ( ! $trashed_or_restored) {
3017
+						$success = 0;
3018
+					}
3019
+				}
3020
+			} else {
3021
+				//grab single GRP_ID and handle
3022
+				$GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
3023
+				if ( ! empty($GRP_ID)) {
3024
+					$trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3025
+					if ( ! $trashed_or_restored) {
3026
+						$success = 0;
3027
+					}
3028
+				} else {
3029
+					$success = 0;
3030
+				}
3031
+			}
3032 3032
             
3033
-        }
3033
+		}
3034 3034
         
3035
-        $action_desc = $trash
3036
-            ? esc_html__('moved to the trash', 'event_espresso')
3037
-            : esc_html__('restored', 'event_espresso');
3035
+		$action_desc = $trash
3036
+			? esc_html__('moved to the trash', 'event_espresso')
3037
+			: esc_html__('restored', 'event_espresso');
3038 3038
         
3039
-        $action_desc = ! empty($this->_req_data['template_switch']) ? esc_html__('switched') : $action_desc;
3039
+		$action_desc = ! empty($this->_req_data['template_switch']) ? esc_html__('switched') : $action_desc;
3040 3040
         
3041
-        $item_desc = $all ? _n('Message Template Group', 'Message Template Groups', $success,
3042
-            'event_espresso') : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
3041
+		$item_desc = $all ? _n('Message Template Group', 'Message Template Groups', $success,
3042
+			'event_espresso') : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
3043 3043
         
3044
-        $item_desc = ! empty($this->_req_data['template_switch']) ? _n('template', 'templates', $success,
3045
-            'event_espresso') : $item_desc;
3044
+		$item_desc = ! empty($this->_req_data['template_switch']) ? _n('template', 'templates', $success,
3045
+			'event_espresso') : $item_desc;
3046 3046
         
3047
-        $this->_redirect_after_action($success, $item_desc, $action_desc, array());
3047
+		$this->_redirect_after_action($success, $item_desc, $action_desc, array());
3048 3048
         
3049
-    }
3049
+	}
3050 3050
 
3051 3051
 
3052
-    /**
3053
-     * [_delete_message_template]
3054
-     * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
3055
-     *
3056
-     * @return void
3057
-     * @throws EE_Error
3058
-     * @throws InvalidArgumentException
3059
-     * @throws InvalidDataTypeException
3060
-     * @throws InvalidInterfaceException
3061
-     */
3062
-    protected function _delete_message_template()
3063
-    {
3064
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3065
-        
3066
-        //checkboxes
3067
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3068
-            //if array has more than one element then success message should be plural
3069
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3052
+	/**
3053
+	 * [_delete_message_template]
3054
+	 * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
3055
+	 *
3056
+	 * @return void
3057
+	 * @throws EE_Error
3058
+	 * @throws InvalidArgumentException
3059
+	 * @throws InvalidDataTypeException
3060
+	 * @throws InvalidInterfaceException
3061
+	 */
3062
+	protected function _delete_message_template()
3063
+	{
3064
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3065
+        
3066
+		//checkboxes
3067
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3068
+			//if array has more than one element then success message should be plural
3069
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3070 3070
             
3071
-            //cycle through bulk action checkboxes
3072
-            while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3073
-                $success = $this->_delete_mtp_permanently($GRP_ID);
3074
-            }
3075
-        } else {
3076
-            //grab single grp_id and delete
3077
-            $GRP_ID  = absint($this->_req_data['id']);
3078
-            $success = $this->_delete_mtp_permanently($GRP_ID);
3079
-        }
3080
-        
3081
-        $this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
3082
-        
3083
-    }
3071
+			//cycle through bulk action checkboxes
3072
+			while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3073
+				$success = $this->_delete_mtp_permanently($GRP_ID);
3074
+			}
3075
+		} else {
3076
+			//grab single grp_id and delete
3077
+			$GRP_ID  = absint($this->_req_data['id']);
3078
+			$success = $this->_delete_mtp_permanently($GRP_ID);
3079
+		}
3080
+        
3081
+		$this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
3082
+        
3083
+	}
3084 3084
 
3085 3085
 
3086
-    /**
3087
-     * helper for permanently deleting a mtP group and all related message_templates
3088
-     *
3089
-     * @param  int  $GRP_ID        The group being deleted
3090
-     * @param  bool $include_group whether to delete the Message Template Group as well.
3091
-     * @return bool boolean to indicate the success of the deletes or not.
3092
-     * @throws EE_Error
3093
-     * @throws InvalidArgumentException
3094
-     * @throws InvalidDataTypeException
3095
-     * @throws InvalidInterfaceException
3096
-     */
3097
-    private function _delete_mtp_permanently($GRP_ID, $include_group = true)
3098
-    {
3099
-        $success = 1;
3100
-        $MTPG    = EEM_Message_Template_Group::instance();
3101
-        //first let's GET this group
3102
-        $MTG = $MTPG->get_one_by_ID($GRP_ID);
3103
-        //then delete permanently all the related Message Templates
3104
-        $deleted = $MTG->delete_related_permanently('Message_Template');
3105
-        
3106
-        if ($deleted === 0) {
3107
-            $success = 0;
3108
-        }
3109
-        
3110
-        //now delete permanently this particular group
3111
-        
3112
-        if ($include_group && ! $MTG->delete_permanently()) {
3113
-            $success = 0;
3114
-        }
3115
-        
3116
-        return $success;
3117
-    }
3086
+	/**
3087
+	 * helper for permanently deleting a mtP group and all related message_templates
3088
+	 *
3089
+	 * @param  int  $GRP_ID        The group being deleted
3090
+	 * @param  bool $include_group whether to delete the Message Template Group as well.
3091
+	 * @return bool boolean to indicate the success of the deletes or not.
3092
+	 * @throws EE_Error
3093
+	 * @throws InvalidArgumentException
3094
+	 * @throws InvalidDataTypeException
3095
+	 * @throws InvalidInterfaceException
3096
+	 */
3097
+	private function _delete_mtp_permanently($GRP_ID, $include_group = true)
3098
+	{
3099
+		$success = 1;
3100
+		$MTPG    = EEM_Message_Template_Group::instance();
3101
+		//first let's GET this group
3102
+		$MTG = $MTPG->get_one_by_ID($GRP_ID);
3103
+		//then delete permanently all the related Message Templates
3104
+		$deleted = $MTG->delete_related_permanently('Message_Template');
3105
+        
3106
+		if ($deleted === 0) {
3107
+			$success = 0;
3108
+		}
3109
+        
3110
+		//now delete permanently this particular group
3111
+        
3112
+		if ($include_group && ! $MTG->delete_permanently()) {
3113
+			$success = 0;
3114
+		}
3115
+        
3116
+		return $success;
3117
+	}
3118 3118
     
3119 3119
     
3120
-    /**
3121
-     *    _learn_more_about_message_templates_link
3122
-     * @access protected
3123
-     * @return string
3124
-     */
3125
-    protected function _learn_more_about_message_templates_link()
3126
-    {
3127
-        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >'
3128
-               . esc_html__('learn more about how message templates works', 'event_espresso')
3129
-               . '</a>';
3130
-    }
3120
+	/**
3121
+	 *    _learn_more_about_message_templates_link
3122
+	 * @access protected
3123
+	 * @return string
3124
+	 */
3125
+	protected function _learn_more_about_message_templates_link()
3126
+	{
3127
+		return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >'
3128
+			   . esc_html__('learn more about how message templates works', 'event_espresso')
3129
+			   . '</a>';
3130
+	}
3131 3131
 
3132 3132
 
3133
-    /**
3134
-     * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
3135
-     * ajax and other routes.
3136
-     *
3137
-     * @return void
3138
-     * @throws DomainException
3139
-     */
3140
-    protected function _settings()
3141
-    {
3142
-        
3143
-        
3144
-        $this->_set_m_mt_settings();
3145
-        
3146
-        $selected_messenger = isset($this->_req_data['selected_messenger'])
3147
-            ? $this->_req_data['selected_messenger']
3148
-            : 'email';
3149
-        
3150
-        //let's setup the messenger tabs
3151
-        $this->_template_args['admin_page_header']         = EEH_Tabbed_Content::tab_text_links(
3152
-            $this->_m_mt_settings['messenger_tabs'],
3153
-            'messenger_links',
3154
-            '|',
3155
-            $selected_messenger
3156
-        );
3157
-        $this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
3158
-        $this->_template_args['after_admin_page_content']  = '</div><!-- end .ui-widget -->';
3159
-        
3160
-        $this->display_admin_page_with_sidebar();
3161
-        
3162
-    }
3133
+	/**
3134
+	 * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
3135
+	 * ajax and other routes.
3136
+	 *
3137
+	 * @return void
3138
+	 * @throws DomainException
3139
+	 */
3140
+	protected function _settings()
3141
+	{
3142
+        
3143
+        
3144
+		$this->_set_m_mt_settings();
3145
+        
3146
+		$selected_messenger = isset($this->_req_data['selected_messenger'])
3147
+			? $this->_req_data['selected_messenger']
3148
+			: 'email';
3149
+        
3150
+		//let's setup the messenger tabs
3151
+		$this->_template_args['admin_page_header']         = EEH_Tabbed_Content::tab_text_links(
3152
+			$this->_m_mt_settings['messenger_tabs'],
3153
+			'messenger_links',
3154
+			'|',
3155
+			$selected_messenger
3156
+		);
3157
+		$this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
3158
+		$this->_template_args['after_admin_page_content']  = '</div><!-- end .ui-widget -->';
3159
+        
3160
+		$this->display_admin_page_with_sidebar();
3161
+        
3162
+	}
3163 3163
 
3164 3164
 
3165
-    /**
3166
-     * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
3167
-     *
3168
-     * @access protected
3169
-     * @return void
3170
-     * @throws DomainException
3171
-     */
3172
-    protected function _set_m_mt_settings()
3173
-    {
3174
-        //first if this is already set then lets get out no need to regenerate data.
3175
-        if ( ! empty($this->_m_mt_settings)) {
3176
-            return;
3177
-        }
3178
-        
3179
-        //get all installed messengers and message_types
3180
-        /** @type EE_messenger[] $messengers */
3181
-        $messengers = $this->_message_resource_manager->installed_messengers();
3182
-        /** @type EE_message_type[] $message_types */
3183
-        $message_types = $this->_message_resource_manager->installed_message_types();
3184
-        
3185
-        
3186
-        //assemble the array for the _tab_text_links helper
3187
-        
3188
-        foreach ($messengers as $messenger) {
3189
-            $this->_m_mt_settings['messenger_tabs'][$messenger->name] = array(
3190
-                'label' => ucwords($messenger->label['singular']),
3191
-                'class' => $this->_message_resource_manager->is_messenger_active($messenger->name)
3192
-                    ? 'messenger-active'
3193
-                    : '',
3194
-                'href'  => $messenger->name,
3195
-                'title' => esc_html__('Modify this Messenger', 'event_espresso'),
3196
-                'slug'  => $messenger->name,
3197
-                'obj'   => $messenger
3198
-            );
3165
+	/**
3166
+	 * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
3167
+	 *
3168
+	 * @access protected
3169
+	 * @return void
3170
+	 * @throws DomainException
3171
+	 */
3172
+	protected function _set_m_mt_settings()
3173
+	{
3174
+		//first if this is already set then lets get out no need to regenerate data.
3175
+		if ( ! empty($this->_m_mt_settings)) {
3176
+			return;
3177
+		}
3178
+        
3179
+		//get all installed messengers and message_types
3180
+		/** @type EE_messenger[] $messengers */
3181
+		$messengers = $this->_message_resource_manager->installed_messengers();
3182
+		/** @type EE_message_type[] $message_types */
3183
+		$message_types = $this->_message_resource_manager->installed_message_types();
3184
+        
3185
+        
3186
+		//assemble the array for the _tab_text_links helper
3187
+        
3188
+		foreach ($messengers as $messenger) {
3189
+			$this->_m_mt_settings['messenger_tabs'][$messenger->name] = array(
3190
+				'label' => ucwords($messenger->label['singular']),
3191
+				'class' => $this->_message_resource_manager->is_messenger_active($messenger->name)
3192
+					? 'messenger-active'
3193
+					: '',
3194
+				'href'  => $messenger->name,
3195
+				'title' => esc_html__('Modify this Messenger', 'event_espresso'),
3196
+				'slug'  => $messenger->name,
3197
+				'obj'   => $messenger
3198
+			);
3199 3199
             
3200 3200
             
3201
-            $message_types_for_messenger = $messenger->get_valid_message_types();
3201
+			$message_types_for_messenger = $messenger->get_valid_message_types();
3202 3202
             
3203
-            foreach ($message_types as $message_type) {
3204
-                //first we need to verify that this message type is valid with this messenger. Cause if it isn't then
3205
-                // it shouldn't show in either the inactive OR active metabox.
3206
-                if ( ! in_array($message_type->name, $message_types_for_messenger, true)) {
3207
-                    continue;
3208
-                }
3203
+			foreach ($message_types as $message_type) {
3204
+				//first we need to verify that this message type is valid with this messenger. Cause if it isn't then
3205
+				// it shouldn't show in either the inactive OR active metabox.
3206
+				if ( ! in_array($message_type->name, $message_types_for_messenger, true)) {
3207
+					continue;
3208
+				}
3209 3209
                 
3210
-                $a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger(
3211
-                    $messenger->name,
3212
-                    $message_type->name
3213
-                )
3214
-                    ? 'active'
3215
-                    : 'inactive';
3210
+				$a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger(
3211
+					$messenger->name,
3212
+					$message_type->name
3213
+				)
3214
+					? 'active'
3215
+					: 'inactive';
3216 3216
                 
3217
-                $this->_m_mt_settings['message_type_tabs'][$messenger->name][$a_or_i][$message_type->name] = array(
3218
-                    'label'    => ucwords($message_type->label['singular']),
3219
-                    'class'    => 'message-type-' . $a_or_i,
3220
-                    'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
3221
-                    'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
3222
-                    'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
3223
-                    'title'    => $a_or_i === 'active'
3224
-                        ? esc_html__('Drag this message type to the Inactive window to deactivate', 'event_espresso')
3225
-                        : esc_html__('Drag this message type to the messenger to activate', 'event_espresso'),
3226
-                    'content'  => $a_or_i === 'active'
3227
-                        ? $this->_message_type_settings_content($message_type, $messenger, true)
3228
-                        : $this->_message_type_settings_content($message_type, $messenger),
3229
-                    'slug'     => $message_type->name,
3230
-                    'active'   => $a_or_i === 'active',
3231
-                    'obj'      => $message_type
3232
-                );
3233
-            }
3234
-        }
3235
-    }
3217
+				$this->_m_mt_settings['message_type_tabs'][$messenger->name][$a_or_i][$message_type->name] = array(
3218
+					'label'    => ucwords($message_type->label['singular']),
3219
+					'class'    => 'message-type-' . $a_or_i,
3220
+					'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
3221
+					'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
3222
+					'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
3223
+					'title'    => $a_or_i === 'active'
3224
+						? esc_html__('Drag this message type to the Inactive window to deactivate', 'event_espresso')
3225
+						: esc_html__('Drag this message type to the messenger to activate', 'event_espresso'),
3226
+					'content'  => $a_or_i === 'active'
3227
+						? $this->_message_type_settings_content($message_type, $messenger, true)
3228
+						: $this->_message_type_settings_content($message_type, $messenger),
3229
+					'slug'     => $message_type->name,
3230
+					'active'   => $a_or_i === 'active',
3231
+					'obj'      => $message_type
3232
+				);
3233
+			}
3234
+		}
3235
+	}
3236 3236
 
3237 3237
 
3238
-    /**
3239
-     * This just prepares the content for the message type settings
3240
-     *
3241
-     * @param  EE_message_type  $message_type The message type object
3242
-     * @param  EE_messenger  $messenger    The messenger object
3243
-     * @param  boolean $active       Whether the message type is active or not
3244
-     * @return string html output for the content
3245
-     * @throws DomainException
3246
-     */
3247
-    protected function _message_type_settings_content($message_type, $messenger, $active = false)
3248
-    {
3249
-        //get message type fields
3250
-        $fields                                         = $message_type->get_admin_settings_fields();
3251
-        $settings_template_args['template_form_fields'] = '';
3252
-        
3253
-        if ( ! empty($fields) && $active) {
3238
+	/**
3239
+	 * This just prepares the content for the message type settings
3240
+	 *
3241
+	 * @param  EE_message_type  $message_type The message type object
3242
+	 * @param  EE_messenger  $messenger    The messenger object
3243
+	 * @param  boolean $active       Whether the message type is active or not
3244
+	 * @return string html output for the content
3245
+	 * @throws DomainException
3246
+	 */
3247
+	protected function _message_type_settings_content($message_type, $messenger, $active = false)
3248
+	{
3249
+		//get message type fields
3250
+		$fields                                         = $message_type->get_admin_settings_fields();
3251
+		$settings_template_args['template_form_fields'] = '';
3252
+        
3253
+		if ( ! empty($fields) && $active) {
3254 3254
             
3255
-            $existing_settings = $message_type->get_existing_admin_settings($messenger->name);
3255
+			$existing_settings = $message_type->get_existing_admin_settings($messenger->name);
3256 3256
             
3257
-            foreach ($fields as $fldname => $fldprops) {
3258
-                $field_id                       = $messenger->name . '-' . $message_type->name . '-' . $fldname;
3259
-                $template_form_field[$field_id] = array(
3260
-                    'name'       => 'message_type_settings[' . $fldname . ']',
3261
-                    'label'      => $fldprops['label'],
3262
-                    'input'      => $fldprops['field_type'],
3263
-                    'type'       => $fldprops['value_type'],
3264
-                    'required'   => $fldprops['required'],
3265
-                    'validation' => $fldprops['validation'],
3266
-                    'value'      => isset($existing_settings[$fldname])
3267
-                        ? $existing_settings[$fldname]
3268
-                        : $fldprops['default'],
3269
-                    'options'    => isset($fldprops['options'])
3270
-                        ? $fldprops['options']
3271
-                        : array(),
3272
-                    'default'    => isset($existing_settings[$fldname])
3273
-                        ? $existing_settings[$fldname]
3274
-                        : $fldprops['default'],
3275
-                    'css_class'  => 'no-drag',
3276
-                    'format'     => $fldprops['format']
3277
-                );
3278
-            }
3257
+			foreach ($fields as $fldname => $fldprops) {
3258
+				$field_id                       = $messenger->name . '-' . $message_type->name . '-' . $fldname;
3259
+				$template_form_field[$field_id] = array(
3260
+					'name'       => 'message_type_settings[' . $fldname . ']',
3261
+					'label'      => $fldprops['label'],
3262
+					'input'      => $fldprops['field_type'],
3263
+					'type'       => $fldprops['value_type'],
3264
+					'required'   => $fldprops['required'],
3265
+					'validation' => $fldprops['validation'],
3266
+					'value'      => isset($existing_settings[$fldname])
3267
+						? $existing_settings[$fldname]
3268
+						: $fldprops['default'],
3269
+					'options'    => isset($fldprops['options'])
3270
+						? $fldprops['options']
3271
+						: array(),
3272
+					'default'    => isset($existing_settings[$fldname])
3273
+						? $existing_settings[$fldname]
3274
+						: $fldprops['default'],
3275
+					'css_class'  => 'no-drag',
3276
+					'format'     => $fldprops['format']
3277
+				);
3278
+			}
3279 3279
             
3280 3280
             
3281
-            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3282
-                ? $this->_generate_admin_form_fields(
3283
-                    $template_form_field,
3284
-                    'string',
3285
-                    'ee_mt_activate_form'
3286
-                )
3287
-                : '';
3288
-        }
3289
-        
3290
-        $settings_template_args['description'] = $message_type->description;
3291
-        //we also need some hidden fields
3292
-        $settings_template_args['hidden_fields'] = array(
3293
-            'message_type_settings[messenger]'    => array(
3294
-                'type'  => 'hidden',
3295
-                'value' => $messenger->name
3296
-            ),
3297
-            'message_type_settings[message_type]' => array(
3298
-                'type'  => 'hidden',
3299
-                'value' => $message_type->name
3300
-            ),
3301
-            'type'                                => array(
3302
-                'type'  => 'hidden',
3303
-                'value' => 'message_type'
3304
-            )
3305
-        );
3306
-        
3307
-        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3308
-            $settings_template_args['hidden_fields'],
3309
-            'array'
3310
-        );
3311
-        $settings_template_args['show_form']     = empty($settings_template_args['template_form_fields'])
3312
-            ? ' hidden'
3313
-            : '';
3314
-        
3315
-        
3316
-        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
3317
-        $content  = EEH_Template::display_template($template, $settings_template_args, true);
3318
-        
3319
-        return $content;
3320
-    }
3281
+			$settings_template_args['template_form_fields'] = ! empty($template_form_field)
3282
+				? $this->_generate_admin_form_fields(
3283
+					$template_form_field,
3284
+					'string',
3285
+					'ee_mt_activate_form'
3286
+				)
3287
+				: '';
3288
+		}
3289
+        
3290
+		$settings_template_args['description'] = $message_type->description;
3291
+		//we also need some hidden fields
3292
+		$settings_template_args['hidden_fields'] = array(
3293
+			'message_type_settings[messenger]'    => array(
3294
+				'type'  => 'hidden',
3295
+				'value' => $messenger->name
3296
+			),
3297
+			'message_type_settings[message_type]' => array(
3298
+				'type'  => 'hidden',
3299
+				'value' => $message_type->name
3300
+			),
3301
+			'type'                                => array(
3302
+				'type'  => 'hidden',
3303
+				'value' => 'message_type'
3304
+			)
3305
+		);
3306
+        
3307
+		$settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3308
+			$settings_template_args['hidden_fields'],
3309
+			'array'
3310
+		);
3311
+		$settings_template_args['show_form']     = empty($settings_template_args['template_form_fields'])
3312
+			? ' hidden'
3313
+			: '';
3314
+        
3315
+        
3316
+		$template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
3317
+		$content  = EEH_Template::display_template($template, $settings_template_args, true);
3318
+        
3319
+		return $content;
3320
+	}
3321 3321
 
3322 3322
 
3323
-    /**
3324
-     * Generate all the metaboxes for the message types and register them for the messages settings page.
3325
-     *
3326
-     * @access protected
3327
-     * @return void
3328
-     * @throws DomainException
3329
-     */
3330
-    protected function _messages_settings_metaboxes()
3331
-    {
3332
-        $this->_set_m_mt_settings();
3333
-        $m_boxes         = $mt_boxes = array();
3334
-        $m_template_args = $mt_template_args = array();
3335
-        
3336
-        $selected_messenger = isset($this->_req_data['selected_messenger'])
3337
-            ? $this->_req_data['selected_messenger']
3338
-            : 'email';
3339
-        
3340
-        if (isset($this->_m_mt_settings['messenger_tabs'])) {
3341
-            foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
3342
-                $hide_on_message  = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
3343
-                $hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
3344
-                //messenger meta boxes
3345
-                $active                                 = $selected_messenger === $messenger;
3346
-                $active_mt_tabs                         = isset(
3347
-                    $this->_m_mt_settings['message_type_tabs'][$messenger]['active']
3348
-                )
3349
-                    ? $this->_m_mt_settings['message_type_tabs'][$messenger]['active']
3350
-                    : '';
3351
-                $m_boxes[$messenger . '_a_box']         = sprintf(
3352
-                    esc_html__('%s Settings', 'event_espresso'),
3353
-                    $tab_array['label']
3354
-                );
3355
-                $m_template_args[$messenger . '_a_box'] = array(
3356
-                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3357
-                    'inactive_message_types' => isset(
3358
-                        $this->_m_mt_settings['message_type_tabs'][$messenger]['inactive']
3359
-                    )
3360
-                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
3361
-                        : '',
3362
-                    'content'                => $this->_get_messenger_box_content($tab_array['obj']),
3363
-                    'hidden'                 => $active ? '' : ' hidden',
3364
-                    'hide_on_message'        => $hide_on_message,
3365
-                    'messenger'              => $messenger,
3366
-                    'active'                 => $active
3367
-                );
3368
-                // message type meta boxes
3369
-                // (which is really just the inactive container for each messenger
3370
-                // showing inactive message types for that messenger)
3371
-                $mt_boxes[$messenger . '_i_box']         = esc_html__('Inactive Message Types', 'event_espresso');
3372
-                $mt_template_args[$messenger . '_i_box'] = array(
3373
-                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3374
-                    'inactive_message_types' => isset(
3375
-                        $this->_m_mt_settings['message_type_tabs'][$messenger]['inactive']
3376
-                    )
3377
-                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
3378
-                        : '',
3379
-                    'hidden'                 => $active ? '' : ' hidden',
3380
-                    'hide_on_message'        => $hide_on_message,
3381
-                    'hide_off_message'       => $hide_off_message,
3382
-                    'messenger'              => $messenger,
3383
-                    'active'                 => $active
3384
-                );
3385
-            }
3386
-        }
3387
-        
3388
-        
3389
-        //register messenger metaboxes
3390
-        $m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
3391
-        foreach ($m_boxes as $box => $label) {
3392
-            $callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[$box]);
3393
-            $msgr          = str_replace('_a_box', '', $box);
3394
-            add_meta_box(
3395
-                'espresso_' . $msgr . '_settings',
3396
-                $label,
3397
-                function ($post, $metabox) {
3398
-                    echo EEH_Template::display_template(
3399
-                            $metabox["args"]["template_path"],
3400
-                            $metabox["args"]["template_args"],
3401
-                            true
3402
-                    );
3403
-                },
3404
-                $this->_current_screen->id,
3405
-                'normal',
3406
-                'high',
3407
-                $callback_args
3408
-            );
3409
-        }
3410
-        
3411
-        //register message type metaboxes
3412
-        $mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
3413
-        foreach ($mt_boxes as $box => $label) {
3414
-            $callback_args = array(
3415
-                'template_path' => $mt_template_path,
3416
-                'template_args' => $mt_template_args[$box]
3417
-            );
3418
-            $mt            = str_replace('_i_box', '', $box);
3419
-            add_meta_box(
3420
-                'espresso_' . $mt . '_inactive_mts',
3421
-                $label,
3422
-                function ($post, $metabox) {
3423
-                    echo EEH_Template::display_template(
3424
-                            $metabox["args"]["template_path"],
3425
-                            $metabox["args"]["template_args"],
3426
-                            true
3427
-                    );
3428
-                },
3429
-                $this->_current_screen->id,
3430
-                'side',
3431
-                'high',
3432
-                $callback_args
3433
-            );
3434
-        }
3435
-        
3436
-        //register metabox for global messages settings but only when on the main site.  On single site installs this
3437
-        // will always result in the metabox showing, on multisite installs the metabox will only show on the main site.
3438
-        if (is_main_site()) {
3439
-            add_meta_box(
3440
-                'espresso_global_message_settings',
3441
-                esc_html__('Global Message Settings', 'event_espresso'),
3442
-                array($this, 'global_messages_settings_metabox_content'),
3443
-                $this->_current_screen->id,
3444
-                'normal',
3445
-                'low',
3446
-                array()
3447
-            );
3448
-        }
3449
-        
3450
-    }
3323
+	/**
3324
+	 * Generate all the metaboxes for the message types and register them for the messages settings page.
3325
+	 *
3326
+	 * @access protected
3327
+	 * @return void
3328
+	 * @throws DomainException
3329
+	 */
3330
+	protected function _messages_settings_metaboxes()
3331
+	{
3332
+		$this->_set_m_mt_settings();
3333
+		$m_boxes         = $mt_boxes = array();
3334
+		$m_template_args = $mt_template_args = array();
3335
+        
3336
+		$selected_messenger = isset($this->_req_data['selected_messenger'])
3337
+			? $this->_req_data['selected_messenger']
3338
+			: 'email';
3339
+        
3340
+		if (isset($this->_m_mt_settings['messenger_tabs'])) {
3341
+			foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
3342
+				$hide_on_message  = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
3343
+				$hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
3344
+				//messenger meta boxes
3345
+				$active                                 = $selected_messenger === $messenger;
3346
+				$active_mt_tabs                         = isset(
3347
+					$this->_m_mt_settings['message_type_tabs'][$messenger]['active']
3348
+				)
3349
+					? $this->_m_mt_settings['message_type_tabs'][$messenger]['active']
3350
+					: '';
3351
+				$m_boxes[$messenger . '_a_box']         = sprintf(
3352
+					esc_html__('%s Settings', 'event_espresso'),
3353
+					$tab_array['label']
3354
+				);
3355
+				$m_template_args[$messenger . '_a_box'] = array(
3356
+					'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3357
+					'inactive_message_types' => isset(
3358
+						$this->_m_mt_settings['message_type_tabs'][$messenger]['inactive']
3359
+					)
3360
+						? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
3361
+						: '',
3362
+					'content'                => $this->_get_messenger_box_content($tab_array['obj']),
3363
+					'hidden'                 => $active ? '' : ' hidden',
3364
+					'hide_on_message'        => $hide_on_message,
3365
+					'messenger'              => $messenger,
3366
+					'active'                 => $active
3367
+				);
3368
+				// message type meta boxes
3369
+				// (which is really just the inactive container for each messenger
3370
+				// showing inactive message types for that messenger)
3371
+				$mt_boxes[$messenger . '_i_box']         = esc_html__('Inactive Message Types', 'event_espresso');
3372
+				$mt_template_args[$messenger . '_i_box'] = array(
3373
+					'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3374
+					'inactive_message_types' => isset(
3375
+						$this->_m_mt_settings['message_type_tabs'][$messenger]['inactive']
3376
+					)
3377
+						? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
3378
+						: '',
3379
+					'hidden'                 => $active ? '' : ' hidden',
3380
+					'hide_on_message'        => $hide_on_message,
3381
+					'hide_off_message'       => $hide_off_message,
3382
+					'messenger'              => $messenger,
3383
+					'active'                 => $active
3384
+				);
3385
+			}
3386
+		}
3387
+        
3388
+        
3389
+		//register messenger metaboxes
3390
+		$m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
3391
+		foreach ($m_boxes as $box => $label) {
3392
+			$callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[$box]);
3393
+			$msgr          = str_replace('_a_box', '', $box);
3394
+			add_meta_box(
3395
+				'espresso_' . $msgr . '_settings',
3396
+				$label,
3397
+				function ($post, $metabox) {
3398
+					echo EEH_Template::display_template(
3399
+							$metabox["args"]["template_path"],
3400
+							$metabox["args"]["template_args"],
3401
+							true
3402
+					);
3403
+				},
3404
+				$this->_current_screen->id,
3405
+				'normal',
3406
+				'high',
3407
+				$callback_args
3408
+			);
3409
+		}
3410
+        
3411
+		//register message type metaboxes
3412
+		$mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
3413
+		foreach ($mt_boxes as $box => $label) {
3414
+			$callback_args = array(
3415
+				'template_path' => $mt_template_path,
3416
+				'template_args' => $mt_template_args[$box]
3417
+			);
3418
+			$mt            = str_replace('_i_box', '', $box);
3419
+			add_meta_box(
3420
+				'espresso_' . $mt . '_inactive_mts',
3421
+				$label,
3422
+				function ($post, $metabox) {
3423
+					echo EEH_Template::display_template(
3424
+							$metabox["args"]["template_path"],
3425
+							$metabox["args"]["template_args"],
3426
+							true
3427
+					);
3428
+				},
3429
+				$this->_current_screen->id,
3430
+				'side',
3431
+				'high',
3432
+				$callback_args
3433
+			);
3434
+		}
3435
+        
3436
+		//register metabox for global messages settings but only when on the main site.  On single site installs this
3437
+		// will always result in the metabox showing, on multisite installs the metabox will only show on the main site.
3438
+		if (is_main_site()) {
3439
+			add_meta_box(
3440
+				'espresso_global_message_settings',
3441
+				esc_html__('Global Message Settings', 'event_espresso'),
3442
+				array($this, 'global_messages_settings_metabox_content'),
3443
+				$this->_current_screen->id,
3444
+				'normal',
3445
+				'low',
3446
+				array()
3447
+			);
3448
+		}
3449
+        
3450
+	}
3451 3451
 
3452 3452
 
3453
-    /**
3454
-     *  This generates the content for the global messages settings metabox.
3455
-     *
3456
-     * @return string
3457
-     * @throws EE_Error
3458
-     * @throws InvalidArgumentException
3459
-     * @throws ReflectionException
3460
-     * @throws InvalidDataTypeException
3461
-     * @throws InvalidInterfaceException
3462
-     */
3463
-    public function global_messages_settings_metabox_content()
3464
-    {
3465
-        $form = $this->_generate_global_settings_form();
3466
-        echo $form->form_open(
3467
-                $this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
3468
-                'POST'
3469
-            )
3470
-             . $form->get_html()
3471
-             . $form->form_close();
3472
-    }
3453
+	/**
3454
+	 *  This generates the content for the global messages settings metabox.
3455
+	 *
3456
+	 * @return string
3457
+	 * @throws EE_Error
3458
+	 * @throws InvalidArgumentException
3459
+	 * @throws ReflectionException
3460
+	 * @throws InvalidDataTypeException
3461
+	 * @throws InvalidInterfaceException
3462
+	 */
3463
+	public function global_messages_settings_metabox_content()
3464
+	{
3465
+		$form = $this->_generate_global_settings_form();
3466
+		echo $form->form_open(
3467
+				$this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
3468
+				'POST'
3469
+			)
3470
+			 . $form->get_html()
3471
+			 . $form->form_close();
3472
+	}
3473 3473
 
3474 3474
 
3475
-    /**
3476
-     * This generates and returns the form object for the global messages settings.
3477
-     *
3478
-     * @return EE_Form_Section_Proper
3479
-     * @throws EE_Error
3480
-     * @throws InvalidArgumentException
3481
-     * @throws ReflectionException
3482
-     * @throws InvalidDataTypeException
3483
-     * @throws InvalidInterfaceException
3484
-     */
3485
-    protected function _generate_global_settings_form()
3486
-    {
3487
-        EE_Registry::instance()->load_helper('HTML');
3488
-        /** @var EE_Network_Core_Config $network_config */
3489
-        $network_config = EE_Registry::instance()->NET_CFG->core;
3490
-        
3491
-        return new EE_Form_Section_Proper(
3492
-            array(
3493
-                'name'            => 'global_messages_settings',
3494
-                'html_id'         => 'global_messages_settings',
3495
-                'html_class'      => 'form-table',
3496
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3497
-                'subsections'     => apply_filters(
3498
-                    'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3499
-                    array(
3500
-                        'do_messages_on_same_request' => new EE_Select_Input(
3501
-                            array(
3502
-                                true  => esc_html__("On the same request", "event_espresso"),
3503
-                                false => esc_html__("On a separate request", "event_espresso")
3504
-                            ),
3505
-                            array(
3506
-                                'default'         => $network_config->do_messages_on_same_request,
3507
-                                'html_label_text' => esc_html__(
3508
-                                    'Generate and send all messages:',
3509
-                                    'event_espresso'
3510
-                                ),
3511
-                                'html_help_text'  => esc_html__(
3512
-                                    '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.',
3513
-                                    'event_espresso'
3514
-                                ),
3515
-                            )
3516
-                        ),
3517
-                        'delete_threshold' => new EE_Select_Input(
3518
-                            array(
3519
-                                0 => esc_html__('Forever', 'event_espresso'),
3520
-                                3 => esc_html__('3 Months', 'event_espresso'),
3521
-                                6 => esc_html__('6 Months', 'event_espresso'),
3522
-                                9 => esc_html__('9 Months', 'event_espresso'),
3523
-                                12 => esc_html__('12 Months', 'event_espresso'),
3524
-                                24 => esc_html__('24 Months', 'event_espresso'),
3525
-                                36 => esc_html__('36 Months', 'event_espresso')
3526
-                            ),
3527
-                            array(
3528
-                                'default' => EE_Registry::instance()->CFG->messages->delete_threshold,
3529
-                                'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3530
-                                'html_help_text' => esc_html__(
3531
-                                    'You can control how long a record of processed messages is kept via this option.',
3532
-                                    'event_espresso'
3533
-                                ),
3534
-                            )
3535
-                        ),
3536
-                        'update_settings'             => new EE_Submit_Input(
3537
-                            array(
3538
-                                'default'         => esc_html__('Update', 'event_espresso'),
3539
-                                'html_label_text' => '&nbsp'
3540
-                            )
3541
-                        )
3542
-                    )
3543
-                )
3544
-            )
3545
-        );
3546
-    }
3475
+	/**
3476
+	 * This generates and returns the form object for the global messages settings.
3477
+	 *
3478
+	 * @return EE_Form_Section_Proper
3479
+	 * @throws EE_Error
3480
+	 * @throws InvalidArgumentException
3481
+	 * @throws ReflectionException
3482
+	 * @throws InvalidDataTypeException
3483
+	 * @throws InvalidInterfaceException
3484
+	 */
3485
+	protected function _generate_global_settings_form()
3486
+	{
3487
+		EE_Registry::instance()->load_helper('HTML');
3488
+		/** @var EE_Network_Core_Config $network_config */
3489
+		$network_config = EE_Registry::instance()->NET_CFG->core;
3490
+        
3491
+		return new EE_Form_Section_Proper(
3492
+			array(
3493
+				'name'            => 'global_messages_settings',
3494
+				'html_id'         => 'global_messages_settings',
3495
+				'html_class'      => 'form-table',
3496
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3497
+				'subsections'     => apply_filters(
3498
+					'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3499
+					array(
3500
+						'do_messages_on_same_request' => new EE_Select_Input(
3501
+							array(
3502
+								true  => esc_html__("On the same request", "event_espresso"),
3503
+								false => esc_html__("On a separate request", "event_espresso")
3504
+							),
3505
+							array(
3506
+								'default'         => $network_config->do_messages_on_same_request,
3507
+								'html_label_text' => esc_html__(
3508
+									'Generate and send all messages:',
3509
+									'event_espresso'
3510
+								),
3511
+								'html_help_text'  => esc_html__(
3512
+									'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.',
3513
+									'event_espresso'
3514
+								),
3515
+							)
3516
+						),
3517
+						'delete_threshold' => new EE_Select_Input(
3518
+							array(
3519
+								0 => esc_html__('Forever', 'event_espresso'),
3520
+								3 => esc_html__('3 Months', 'event_espresso'),
3521
+								6 => esc_html__('6 Months', 'event_espresso'),
3522
+								9 => esc_html__('9 Months', 'event_espresso'),
3523
+								12 => esc_html__('12 Months', 'event_espresso'),
3524
+								24 => esc_html__('24 Months', 'event_espresso'),
3525
+								36 => esc_html__('36 Months', 'event_espresso')
3526
+							),
3527
+							array(
3528
+								'default' => EE_Registry::instance()->CFG->messages->delete_threshold,
3529
+								'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3530
+								'html_help_text' => esc_html__(
3531
+									'You can control how long a record of processed messages is kept via this option.',
3532
+									'event_espresso'
3533
+								),
3534
+							)
3535
+						),
3536
+						'update_settings'             => new EE_Submit_Input(
3537
+							array(
3538
+								'default'         => esc_html__('Update', 'event_espresso'),
3539
+								'html_label_text' => '&nbsp'
3540
+							)
3541
+						)
3542
+					)
3543
+				)
3544
+			)
3545
+		);
3546
+	}
3547 3547
 
3548 3548
 
3549
-    /**
3550
-     * This handles updating the global settings set on the admin page.
3551
-     *
3552
-     * @throws EE_Error
3553
-     * @throws InvalidDataTypeException
3554
-     * @throws InvalidInterfaceException
3555
-     * @throws InvalidArgumentException
3556
-     * @throws ReflectionException
3557
-     */
3558
-    protected function _update_global_settings()
3559
-    {
3560
-        /** @var EE_Network_Core_Config $network_config */
3561
-        $network_config = EE_Registry::instance()->NET_CFG->core;
3562
-        $messages_config = EE_Registry::instance()->CFG->messages;
3563
-        $form           = $this->_generate_global_settings_form();
3564
-        if ($form->was_submitted()) {
3565
-            $form->receive_form_submission();
3566
-            if ($form->is_valid()) {
3567
-                $valid_data = $form->valid_data();
3568
-                foreach ($valid_data as $property => $value) {
3569
-                    $setter = 'set_' . $property;
3570
-                    if (method_exists($network_config, $setter)) {
3571
-                        $network_config->{$setter}($value);
3572
-                    } else if (
3573
-                        property_exists($network_config, $property)
3574
-                        && $network_config->{$property} !== $value
3575
-                    ) {
3576
-                        $network_config->{$property} = $value;
3577
-                    } else if (
3578
-                        property_exists($messages_config, $property)
3579
-                        && $messages_config->{$property} !== $value
3580
-                    ) {
3581
-                        $messages_config->{$property} = $value;
3582
-                    }
3583
-                }
3584
-                //only update if the form submission was valid!
3585
-                EE_Registry::instance()->NET_CFG->update_config(true, false);
3586
-                EE_Registry::instance()->CFG->update_espresso_config();
3587
-                EE_Error::overwrite_success();
3588
-                EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3589
-            }
3590
-        }
3591
-        $this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3592
-    }
3549
+	/**
3550
+	 * This handles updating the global settings set on the admin page.
3551
+	 *
3552
+	 * @throws EE_Error
3553
+	 * @throws InvalidDataTypeException
3554
+	 * @throws InvalidInterfaceException
3555
+	 * @throws InvalidArgumentException
3556
+	 * @throws ReflectionException
3557
+	 */
3558
+	protected function _update_global_settings()
3559
+	{
3560
+		/** @var EE_Network_Core_Config $network_config */
3561
+		$network_config = EE_Registry::instance()->NET_CFG->core;
3562
+		$messages_config = EE_Registry::instance()->CFG->messages;
3563
+		$form           = $this->_generate_global_settings_form();
3564
+		if ($form->was_submitted()) {
3565
+			$form->receive_form_submission();
3566
+			if ($form->is_valid()) {
3567
+				$valid_data = $form->valid_data();
3568
+				foreach ($valid_data as $property => $value) {
3569
+					$setter = 'set_' . $property;
3570
+					if (method_exists($network_config, $setter)) {
3571
+						$network_config->{$setter}($value);
3572
+					} else if (
3573
+						property_exists($network_config, $property)
3574
+						&& $network_config->{$property} !== $value
3575
+					) {
3576
+						$network_config->{$property} = $value;
3577
+					} else if (
3578
+						property_exists($messages_config, $property)
3579
+						&& $messages_config->{$property} !== $value
3580
+					) {
3581
+						$messages_config->{$property} = $value;
3582
+					}
3583
+				}
3584
+				//only update if the form submission was valid!
3585
+				EE_Registry::instance()->NET_CFG->update_config(true, false);
3586
+				EE_Registry::instance()->CFG->update_espresso_config();
3587
+				EE_Error::overwrite_success();
3588
+				EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3589
+			}
3590
+		}
3591
+		$this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3592
+	}
3593 3593
 
3594 3594
 
3595
-    /**
3596
-     * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3597
-     *
3598
-     * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3599
-     * @return string html formatted tabs
3600
-     * @throws DomainException
3601
-     */
3602
-    protected function _get_mt_tabs($tab_array)
3603
-    {
3604
-        $tab_array = (array)$tab_array;
3605
-        $template  = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3606
-        $tabs      = '';
3607
-        
3608
-        foreach ($tab_array as $tab) {
3609
-            $tabs .= EEH_Template::display_template($template, $tab, true);
3610
-        }
3611
-        
3612
-        return $tabs;
3613
-    }
3595
+	/**
3596
+	 * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3597
+	 *
3598
+	 * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3599
+	 * @return string html formatted tabs
3600
+	 * @throws DomainException
3601
+	 */
3602
+	protected function _get_mt_tabs($tab_array)
3603
+	{
3604
+		$tab_array = (array)$tab_array;
3605
+		$template  = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3606
+		$tabs      = '';
3607
+        
3608
+		foreach ($tab_array as $tab) {
3609
+			$tabs .= EEH_Template::display_template($template, $tab, true);
3610
+		}
3611
+        
3612
+		return $tabs;
3613
+	}
3614 3614
 
3615 3615
 
3616
-    /**
3617
-     * This prepares the content of the messenger meta box admin settings
3618
-     *
3619
-     * @param  EE_messenger $messenger The messenger we're setting up content for
3620
-     * @return string html formatted content
3621
-     * @throws DomainException
3622
-     */
3623
-    protected function _get_messenger_box_content(EE_messenger $messenger)
3624
-    {
3616
+	/**
3617
+	 * This prepares the content of the messenger meta box admin settings
3618
+	 *
3619
+	 * @param  EE_messenger $messenger The messenger we're setting up content for
3620
+	 * @return string html formatted content
3621
+	 * @throws DomainException
3622
+	 */
3623
+	protected function _get_messenger_box_content(EE_messenger $messenger)
3624
+	{
3625 3625
         
3626
-        $fields                                         = $messenger->get_admin_settings_fields();
3627
-        $settings_template_args['template_form_fields'] = '';
3626
+		$fields                                         = $messenger->get_admin_settings_fields();
3627
+		$settings_template_args['template_form_fields'] = '';
3628 3628
         
3629
-        //is $messenger active?
3630
-        $settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3629
+		//is $messenger active?
3630
+		$settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3631 3631
         
3632 3632
         
3633
-        if ( ! empty($fields)) {
3633
+		if ( ! empty($fields)) {
3634 3634
             
3635
-            $existing_settings = $messenger->get_existing_admin_settings();
3635
+			$existing_settings = $messenger->get_existing_admin_settings();
3636 3636
             
3637
-            foreach ($fields as $fldname => $fldprops) {
3638
-                $field_id                       = $messenger->name . '-' . $fldname;
3639
-                $template_form_field[$field_id] = array(
3640
-                    'name'       => 'messenger_settings[' . $field_id . ']',
3641
-                    'label'      => $fldprops['label'],
3642
-                    'input'      => $fldprops['field_type'],
3643
-                    'type'       => $fldprops['value_type'],
3644
-                    'required'   => $fldprops['required'],
3645
-                    'validation' => $fldprops['validation'],
3646
-                    'value'      => isset($existing_settings[$field_id])
3647
-                        ? $existing_settings[$field_id]
3648
-                        : $fldprops['default'],
3649
-                    'css_class'  => '',
3650
-                    'format'     => $fldprops['format']
3651
-                );
3652
-            }
3637
+			foreach ($fields as $fldname => $fldprops) {
3638
+				$field_id                       = $messenger->name . '-' . $fldname;
3639
+				$template_form_field[$field_id] = array(
3640
+					'name'       => 'messenger_settings[' . $field_id . ']',
3641
+					'label'      => $fldprops['label'],
3642
+					'input'      => $fldprops['field_type'],
3643
+					'type'       => $fldprops['value_type'],
3644
+					'required'   => $fldprops['required'],
3645
+					'validation' => $fldprops['validation'],
3646
+					'value'      => isset($existing_settings[$field_id])
3647
+						? $existing_settings[$field_id]
3648
+						: $fldprops['default'],
3649
+					'css_class'  => '',
3650
+					'format'     => $fldprops['format']
3651
+				);
3652
+			}
3653 3653
             
3654 3654
             
3655
-            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3656
-                ? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3657
-                : '';
3658
-        }
3659
-        
3660
-        //we also need some hidden fields
3661
-        $settings_template_args['hidden_fields'] = array(
3662
-            'messenger_settings[messenger]' => array(
3663
-                'type'  => 'hidden',
3664
-                'value' => $messenger->name
3665
-            ),
3666
-            'type'                          => array(
3667
-                'type'  => 'hidden',
3668
-                'value' => 'messenger'
3669
-            )
3670
-        );
3671
-        
3672
-        //make sure any active message types that are existing are included in the hidden fields
3673
-        if (isset($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'])) {
3674
-            foreach ($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'] as $mt => $values) {
3675
-                $settings_template_args['hidden_fields']['messenger_settings[message_types][' . $mt . ']'] = array(
3676
-                    'type'  => 'hidden',
3677
-                    'value' => $mt
3678
-                );
3679
-            }
3680
-        }
3681
-        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3682
-            $settings_template_args['hidden_fields'],
3683
-            'array'
3684
-        );
3685
-        $active = $this->_message_resource_manager->is_messenger_active($messenger->name);
3686
-        
3687
-        $settings_template_args['messenger']           = $messenger->name;
3688
-        $settings_template_args['description']         = $messenger->description;
3689
-        $settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3690
-        
3691
-        
3692
-        $settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active(
3693
-            $messenger->name
3694
-        )
3695
-            ? $settings_template_args['show_hide_edit_form']
3696
-            : ' hidden';
3697
-        
3698
-        $settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3699
-            ? ' hidden'
3700
-            : $settings_template_args['show_hide_edit_form'];
3701
-        
3702
-        
3703
-        $settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3704
-        $settings_template_args['nonce']         = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3705
-        $settings_template_args['on_off_status'] = $active ? true : false;
3706
-        $template                                = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3707
-        $content                                 = EEH_Template::display_template(
3708
-            $template,
3709
-            $settings_template_args,
3710
-            true
3711
-        );
3712
-        
3713
-        return $content;
3714
-    }
3655
+			$settings_template_args['template_form_fields'] = ! empty($template_form_field)
3656
+				? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3657
+				: '';
3658
+		}
3659
+        
3660
+		//we also need some hidden fields
3661
+		$settings_template_args['hidden_fields'] = array(
3662
+			'messenger_settings[messenger]' => array(
3663
+				'type'  => 'hidden',
3664
+				'value' => $messenger->name
3665
+			),
3666
+			'type'                          => array(
3667
+				'type'  => 'hidden',
3668
+				'value' => 'messenger'
3669
+			)
3670
+		);
3671
+        
3672
+		//make sure any active message types that are existing are included in the hidden fields
3673
+		if (isset($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'])) {
3674
+			foreach ($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'] as $mt => $values) {
3675
+				$settings_template_args['hidden_fields']['messenger_settings[message_types][' . $mt . ']'] = array(
3676
+					'type'  => 'hidden',
3677
+					'value' => $mt
3678
+				);
3679
+			}
3680
+		}
3681
+		$settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3682
+			$settings_template_args['hidden_fields'],
3683
+			'array'
3684
+		);
3685
+		$active = $this->_message_resource_manager->is_messenger_active($messenger->name);
3686
+        
3687
+		$settings_template_args['messenger']           = $messenger->name;
3688
+		$settings_template_args['description']         = $messenger->description;
3689
+		$settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3690
+        
3691
+        
3692
+		$settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active(
3693
+			$messenger->name
3694
+		)
3695
+			? $settings_template_args['show_hide_edit_form']
3696
+			: ' hidden';
3697
+        
3698
+		$settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3699
+			? ' hidden'
3700
+			: $settings_template_args['show_hide_edit_form'];
3701
+        
3702
+        
3703
+		$settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3704
+		$settings_template_args['nonce']         = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3705
+		$settings_template_args['on_off_status'] = $active ? true : false;
3706
+		$template                                = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3707
+		$content                                 = EEH_Template::display_template(
3708
+			$template,
3709
+			$settings_template_args,
3710
+			true
3711
+		);
3712
+        
3713
+		return $content;
3714
+	}
3715 3715
 
3716 3716
 
3717
-    /**
3718
-     * used by ajax on the messages settings page to activate|deactivate the messenger
3719
-     *
3720
-     * @throws DomainException
3721
-     * @throws EE_Error
3722
-     * @throws InvalidDataTypeException
3723
-     * @throws InvalidInterfaceException
3724
-     * @throws InvalidArgumentException
3725
-     * @throws ReflectionException
3726
-     */
3727
-    public function activate_messenger_toggle()
3728
-    {
3729
-        $success = true;
3730
-        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3731
-        //let's check that we have required data
3732
-        if ( ! isset($this->_req_data['messenger'])) {
3733
-            EE_Error::add_error(
3734
-                esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3735
-                __FILE__,
3736
-                __FUNCTION__,
3737
-                __LINE__
3738
-            );
3739
-            $success = false;
3740
-        }
3741
-        
3742
-        //do a nonce check here since we're not arriving via a normal route
3743
-        $nonce     = isset($this->_req_data['activate_nonce'])
3744
-            ? sanitize_text_field($this->_req_data['activate_nonce'])
3745
-            : '';
3746
-        $nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3747
-        
3748
-        $this->_verify_nonce($nonce, $nonce_ref);
3749
-        
3750
-        
3751
-        if ( ! isset($this->_req_data['status'])) {
3752
-            EE_Error::add_error(
3753
-                esc_html__(
3754
-                    'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3755
-                    'event_espresso'
3756
-                ),
3757
-                __FILE__,
3758
-                __FUNCTION__,
3759
-                __LINE__
3760
-            );
3761
-            $success = false;
3762
-        }
3763
-        
3764
-        //do check to verify we have a valid status.
3765
-        $status = $this->_req_data['status'];
3766
-        
3767
-        if ($status !== 'off' && $status !== 'on') {
3768
-            EE_Error::add_error(
3769
-                sprintf(
3770
-                    esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3771
-                    $this->_req_data['status']
3772
-                ),
3773
-                __FILE__,
3774
-                __FUNCTION__,
3775
-                __LINE__
3776
-            );
3777
-            $success = false;
3778
-        }
3779
-        
3780
-        if ($success) {
3781
-            //made it here?  Stop dawdling then!!
3782
-            $success = $status === 'off'
3783
-                ? $this->_deactivate_messenger($this->_req_data['messenger'])
3784
-                : $this->_activate_messenger($this->_req_data['messenger']);
3785
-        }
3786
-        
3787
-        $this->_template_args['success'] = $success;
3788
-        
3789
-        //no special instructions so let's just do the json return (which should automatically do all the special stuff).
3790
-        $this->_return_json();
3791
-        
3792
-    }
3717
+	/**
3718
+	 * used by ajax on the messages settings page to activate|deactivate the messenger
3719
+	 *
3720
+	 * @throws DomainException
3721
+	 * @throws EE_Error
3722
+	 * @throws InvalidDataTypeException
3723
+	 * @throws InvalidInterfaceException
3724
+	 * @throws InvalidArgumentException
3725
+	 * @throws ReflectionException
3726
+	 */
3727
+	public function activate_messenger_toggle()
3728
+	{
3729
+		$success = true;
3730
+		$this->_prep_default_response_for_messenger_or_message_type_toggle();
3731
+		//let's check that we have required data
3732
+		if ( ! isset($this->_req_data['messenger'])) {
3733
+			EE_Error::add_error(
3734
+				esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3735
+				__FILE__,
3736
+				__FUNCTION__,
3737
+				__LINE__
3738
+			);
3739
+			$success = false;
3740
+		}
3741
+        
3742
+		//do a nonce check here since we're not arriving via a normal route
3743
+		$nonce     = isset($this->_req_data['activate_nonce'])
3744
+			? sanitize_text_field($this->_req_data['activate_nonce'])
3745
+			: '';
3746
+		$nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3747
+        
3748
+		$this->_verify_nonce($nonce, $nonce_ref);
3749
+        
3750
+        
3751
+		if ( ! isset($this->_req_data['status'])) {
3752
+			EE_Error::add_error(
3753
+				esc_html__(
3754
+					'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3755
+					'event_espresso'
3756
+				),
3757
+				__FILE__,
3758
+				__FUNCTION__,
3759
+				__LINE__
3760
+			);
3761
+			$success = false;
3762
+		}
3763
+        
3764
+		//do check to verify we have a valid status.
3765
+		$status = $this->_req_data['status'];
3766
+        
3767
+		if ($status !== 'off' && $status !== 'on') {
3768
+			EE_Error::add_error(
3769
+				sprintf(
3770
+					esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3771
+					$this->_req_data['status']
3772
+				),
3773
+				__FILE__,
3774
+				__FUNCTION__,
3775
+				__LINE__
3776
+			);
3777
+			$success = false;
3778
+		}
3779
+        
3780
+		if ($success) {
3781
+			//made it here?  Stop dawdling then!!
3782
+			$success = $status === 'off'
3783
+				? $this->_deactivate_messenger($this->_req_data['messenger'])
3784
+				: $this->_activate_messenger($this->_req_data['messenger']);
3785
+		}
3786
+        
3787
+		$this->_template_args['success'] = $success;
3788
+        
3789
+		//no special instructions so let's just do the json return (which should automatically do all the special stuff).
3790
+		$this->_return_json();
3791
+        
3792
+	}
3793 3793
 
3794 3794
 
3795
-    /**
3796
-     * used by ajax from the messages settings page to activate|deactivate a message type
3797
-     *
3798
-     * @throws DomainException
3799
-     * @throws EE_Error
3800
-     * @throws ReflectionException
3801
-     * @throws InvalidDataTypeException
3802
-     * @throws InvalidInterfaceException
3803
-     * @throws InvalidArgumentException
3804
-     */
3805
-    public function activate_mt_toggle()
3806
-    {
3807
-        $success = true;
3808
-        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3809
-        
3810
-        //let's make sure we have the necessary data
3811
-        if ( ! isset($this->_req_data['message_type'])) {
3812
-            EE_Error::add_error(
3813
-                esc_html__('Message Type name needed to toggle activation. None given', 'event_espresso'),
3814
-                __FILE__,
3815
-                __FUNCTION__,
3816
-                __LINE__
3817
-            );
3818
-            $success = false;
3819
-        }
3820
-        
3821
-        if ( ! isset($this->_req_data['messenger'])) {
3822
-            EE_Error::add_error(
3823
-                esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3824
-                __FILE__,
3825
-                __FUNCTION__,
3826
-                __LINE__
3827
-            );
3828
-            $success = false;
3829
-        }
3830
-        
3831
-        if ( ! isset($this->_req_data['status'])) {
3832
-            EE_Error::add_error(
3833
-                esc_html__('Messenger status needed to know whether activation or deactivation is happening. No status is given',
3834
-                    'event_espresso'),
3835
-                __FILE__,
3836
-                __FUNCTION__,
3837
-                __LINE__
3838
-            );
3839
-            $success = false;
3840
-        }
3841
-        
3842
-        
3843
-        //do check to verify we have a valid status.
3844
-        $status = $this->_req_data['status'];
3845
-        
3846
-        if ($status !== 'activate' && $status !== 'deactivate') {
3847
-            EE_Error::add_error(
3848
-                sprintf(
3849
-                    esc_html__('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3850
-                    $this->_req_data['status']
3851
-                ),
3852
-                __FILE__,
3853
-                __FUNCTION__,
3854
-                __LINE__
3855
-            );
3856
-            $success = false;
3857
-        }
3858
-        
3859
-        
3860
-        //do a nonce check here since we're not arriving via a normal route
3861
-        $nonce     = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3862
-        $nonce_ref = $this->_req_data['message_type'] . '_nonce';
3863
-        
3864
-        $this->_verify_nonce($nonce, $nonce_ref);
3865
-        
3866
-        if ($success) {
3867
-            //made it here? um, what are you waiting for then?
3868
-            $success = $status === 'deactivate'
3869
-                ? $this->_deactivate_message_type_for_messenger(
3870
-                    $this->_req_data['messenger'],
3871
-                    $this->_req_data['message_type']
3872
-                )
3873
-                : $this->_activate_message_type_for_messenger(
3874
-                    $this->_req_data['messenger'],
3875
-                    $this->_req_data['message_type']
3876
-                );
3877
-        }
3878
-        
3879
-        $this->_template_args['success'] = $success;
3880
-        $this->_return_json();
3881
-    }
3795
+	/**
3796
+	 * used by ajax from the messages settings page to activate|deactivate a message type
3797
+	 *
3798
+	 * @throws DomainException
3799
+	 * @throws EE_Error
3800
+	 * @throws ReflectionException
3801
+	 * @throws InvalidDataTypeException
3802
+	 * @throws InvalidInterfaceException
3803
+	 * @throws InvalidArgumentException
3804
+	 */
3805
+	public function activate_mt_toggle()
3806
+	{
3807
+		$success = true;
3808
+		$this->_prep_default_response_for_messenger_or_message_type_toggle();
3809
+        
3810
+		//let's make sure we have the necessary data
3811
+		if ( ! isset($this->_req_data['message_type'])) {
3812
+			EE_Error::add_error(
3813
+				esc_html__('Message Type name needed to toggle activation. None given', 'event_espresso'),
3814
+				__FILE__,
3815
+				__FUNCTION__,
3816
+				__LINE__
3817
+			);
3818
+			$success = false;
3819
+		}
3820
+        
3821
+		if ( ! isset($this->_req_data['messenger'])) {
3822
+			EE_Error::add_error(
3823
+				esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3824
+				__FILE__,
3825
+				__FUNCTION__,
3826
+				__LINE__
3827
+			);
3828
+			$success = false;
3829
+		}
3830
+        
3831
+		if ( ! isset($this->_req_data['status'])) {
3832
+			EE_Error::add_error(
3833
+				esc_html__('Messenger status needed to know whether activation or deactivation is happening. No status is given',
3834
+					'event_espresso'),
3835
+				__FILE__,
3836
+				__FUNCTION__,
3837
+				__LINE__
3838
+			);
3839
+			$success = false;
3840
+		}
3841
+        
3842
+        
3843
+		//do check to verify we have a valid status.
3844
+		$status = $this->_req_data['status'];
3845
+        
3846
+		if ($status !== 'activate' && $status !== 'deactivate') {
3847
+			EE_Error::add_error(
3848
+				sprintf(
3849
+					esc_html__('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3850
+					$this->_req_data['status']
3851
+				),
3852
+				__FILE__,
3853
+				__FUNCTION__,
3854
+				__LINE__
3855
+			);
3856
+			$success = false;
3857
+		}
3858
+        
3859
+        
3860
+		//do a nonce check here since we're not arriving via a normal route
3861
+		$nonce     = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3862
+		$nonce_ref = $this->_req_data['message_type'] . '_nonce';
3863
+        
3864
+		$this->_verify_nonce($nonce, $nonce_ref);
3865
+        
3866
+		if ($success) {
3867
+			//made it here? um, what are you waiting for then?
3868
+			$success = $status === 'deactivate'
3869
+				? $this->_deactivate_message_type_for_messenger(
3870
+					$this->_req_data['messenger'],
3871
+					$this->_req_data['message_type']
3872
+				)
3873
+				: $this->_activate_message_type_for_messenger(
3874
+					$this->_req_data['messenger'],
3875
+					$this->_req_data['message_type']
3876
+				);
3877
+		}
3878
+        
3879
+		$this->_template_args['success'] = $success;
3880
+		$this->_return_json();
3881
+	}
3882 3882
 
3883 3883
 
3884
-    /**
3885
-     * Takes care of processing activating a messenger and preparing the appropriate response.
3886
-     *
3887
-     * @param string $messenger_name The name of the messenger being activated
3888
-     * @return bool
3889
-     * @throws DomainException
3890
-     * @throws EE_Error
3891
-     * @throws InvalidArgumentException
3892
-     * @throws ReflectionException
3893
-     * @throws InvalidDataTypeException
3894
-     * @throws InvalidInterfaceException
3895
-     */
3896
-    protected function _activate_messenger($messenger_name)
3897
-    {
3898
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3899
-        $active_messenger          = $this->_message_resource_manager->get_messenger($messenger_name);
3900
-        $message_types_to_activate = $active_messenger instanceof EE_Messenger
3901
-            ? $active_messenger->get_default_message_types()
3902
-            : array();
3903
-        
3904
-        //ensure is active
3905
-        $this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
3906
-        
3907
-        //set response_data for reload
3908
-        foreach ($message_types_to_activate as $message_type_name) {
3909
-            /** @var EE_message_type $message_type */
3910
-            $message_type = $this->_message_resource_manager->get_message_type($message_type_name);
3911
-            if ($this->_message_resource_manager->is_message_type_active_for_messenger(
3912
-                    $messenger_name,
3913
-                    $message_type_name
3914
-                )
3915
-                && $message_type instanceof EE_message_type
3916
-            ) {
3917
-                $this->_template_args['data']['active_mts'][] = $message_type_name;
3918
-                if ($message_type->get_admin_settings_fields()) {
3919
-                    $this->_template_args['data']['mt_reload'][] = $message_type_name;
3920
-                }
3921
-            }
3922
-        }
3923
-        
3924
-        //add success message for activating messenger
3925
-        return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
3926
-        
3927
-    }
3884
+	/**
3885
+	 * Takes care of processing activating a messenger and preparing the appropriate response.
3886
+	 *
3887
+	 * @param string $messenger_name The name of the messenger being activated
3888
+	 * @return bool
3889
+	 * @throws DomainException
3890
+	 * @throws EE_Error
3891
+	 * @throws InvalidArgumentException
3892
+	 * @throws ReflectionException
3893
+	 * @throws InvalidDataTypeException
3894
+	 * @throws InvalidInterfaceException
3895
+	 */
3896
+	protected function _activate_messenger($messenger_name)
3897
+	{
3898
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3899
+		$active_messenger          = $this->_message_resource_manager->get_messenger($messenger_name);
3900
+		$message_types_to_activate = $active_messenger instanceof EE_Messenger
3901
+			? $active_messenger->get_default_message_types()
3902
+			: array();
3903
+        
3904
+		//ensure is active
3905
+		$this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
3906
+        
3907
+		//set response_data for reload
3908
+		foreach ($message_types_to_activate as $message_type_name) {
3909
+			/** @var EE_message_type $message_type */
3910
+			$message_type = $this->_message_resource_manager->get_message_type($message_type_name);
3911
+			if ($this->_message_resource_manager->is_message_type_active_for_messenger(
3912
+					$messenger_name,
3913
+					$message_type_name
3914
+				)
3915
+				&& $message_type instanceof EE_message_type
3916
+			) {
3917
+				$this->_template_args['data']['active_mts'][] = $message_type_name;
3918
+				if ($message_type->get_admin_settings_fields()) {
3919
+					$this->_template_args['data']['mt_reload'][] = $message_type_name;
3920
+				}
3921
+			}
3922
+		}
3923
+        
3924
+		//add success message for activating messenger
3925
+		return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
3926
+        
3927
+	}
3928 3928
 
3929 3929
 
3930
-    /**
3931
-     * Takes care of processing deactivating a messenger and preparing the appropriate response.
3932
-     *
3933
-     * @param string $messenger_name The name of the messenger being activated
3934
-     * @return bool
3935
-     * @throws DomainException
3936
-     * @throws EE_Error
3937
-     * @throws InvalidArgumentException
3938
-     * @throws ReflectionException
3939
-     * @throws InvalidDataTypeException
3940
-     * @throws InvalidInterfaceException
3941
-     */
3942
-    protected function _deactivate_messenger($messenger_name)
3943
-    {
3944
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3945
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3946
-        $this->_message_resource_manager->deactivate_messenger($messenger_name);
3947
-        
3948
-        return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
3949
-    }
3930
+	/**
3931
+	 * Takes care of processing deactivating a messenger and preparing the appropriate response.
3932
+	 *
3933
+	 * @param string $messenger_name The name of the messenger being activated
3934
+	 * @return bool
3935
+	 * @throws DomainException
3936
+	 * @throws EE_Error
3937
+	 * @throws InvalidArgumentException
3938
+	 * @throws ReflectionException
3939
+	 * @throws InvalidDataTypeException
3940
+	 * @throws InvalidInterfaceException
3941
+	 */
3942
+	protected function _deactivate_messenger($messenger_name)
3943
+	{
3944
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3945
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3946
+		$this->_message_resource_manager->deactivate_messenger($messenger_name);
3947
+        
3948
+		return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
3949
+	}
3950 3950
 
3951 3951
 
3952
-    /**
3953
-     * Takes care of processing activating a message type for a messenger and preparing the appropriate response.
3954
-     *
3955
-     * @param string $messenger_name    The name of the messenger the message type is being activated for.
3956
-     * @param string $message_type_name The name of the message type being activated for the messenger
3957
-     * @return bool
3958
-     * @throws DomainException
3959
-     * @throws EE_Error
3960
-     * @throws InvalidArgumentException
3961
-     * @throws ReflectionException
3962
-     * @throws InvalidDataTypeException
3963
-     * @throws InvalidInterfaceException
3964
-     */
3965
-    protected function _activate_message_type_for_messenger($messenger_name, $message_type_name)
3966
-    {
3967
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3968
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3969
-        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
3970
-        $message_type_to_activate = $this->_message_resource_manager->get_message_type($message_type_name);
3971
-        
3972
-        //ensure is active
3973
-        $this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
3974
-        
3975
-        //set response for load
3976
-        if ($this->_message_resource_manager->is_message_type_active_for_messenger($messenger_name,
3977
-            $message_type_name)
3978
-        ) {
3979
-            $this->_template_args['data']['active_mts'][] = $message_type_name;
3980
-            if ($message_type_to_activate->get_admin_settings_fields()) {
3981
-                $this->_template_args['data']['mt_reload'][] = $message_type_name;
3982
-            }
3983
-        }
3984
-        
3985
-        return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger,
3986
-            $message_type_to_activate);
3987
-    }
3952
+	/**
3953
+	 * Takes care of processing activating a message type for a messenger and preparing the appropriate response.
3954
+	 *
3955
+	 * @param string $messenger_name    The name of the messenger the message type is being activated for.
3956
+	 * @param string $message_type_name The name of the message type being activated for the messenger
3957
+	 * @return bool
3958
+	 * @throws DomainException
3959
+	 * @throws EE_Error
3960
+	 * @throws InvalidArgumentException
3961
+	 * @throws ReflectionException
3962
+	 * @throws InvalidDataTypeException
3963
+	 * @throws InvalidInterfaceException
3964
+	 */
3965
+	protected function _activate_message_type_for_messenger($messenger_name, $message_type_name)
3966
+	{
3967
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3968
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3969
+		/** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
3970
+		$message_type_to_activate = $this->_message_resource_manager->get_message_type($message_type_name);
3971
+        
3972
+		//ensure is active
3973
+		$this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
3974
+        
3975
+		//set response for load
3976
+		if ($this->_message_resource_manager->is_message_type_active_for_messenger($messenger_name,
3977
+			$message_type_name)
3978
+		) {
3979
+			$this->_template_args['data']['active_mts'][] = $message_type_name;
3980
+			if ($message_type_to_activate->get_admin_settings_fields()) {
3981
+				$this->_template_args['data']['mt_reload'][] = $message_type_name;
3982
+			}
3983
+		}
3984
+        
3985
+		return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger,
3986
+			$message_type_to_activate);
3987
+	}
3988 3988
 
3989 3989
 
3990
-    /**
3991
-     * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
3992
-     *
3993
-     * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
3994
-     * @param string $message_type_name The name of the message type being deactivated for the messenger
3995
-     * @return bool
3996
-     * @throws DomainException
3997
-     * @throws EE_Error
3998
-     * @throws InvalidArgumentException
3999
-     * @throws ReflectionException
4000
-     * @throws InvalidDataTypeException
4001
-     * @throws InvalidInterfaceException
4002
-     */
4003
-    protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
4004
-    {
4005
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4006
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4007
-        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4008
-        $message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
4009
-        $this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
4010
-        
4011
-        return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger,
4012
-            $message_type_to_deactivate);
4013
-    }
3990
+	/**
3991
+	 * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
3992
+	 *
3993
+	 * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
3994
+	 * @param string $message_type_name The name of the message type being deactivated for the messenger
3995
+	 * @return bool
3996
+	 * @throws DomainException
3997
+	 * @throws EE_Error
3998
+	 * @throws InvalidArgumentException
3999
+	 * @throws ReflectionException
4000
+	 * @throws InvalidDataTypeException
4001
+	 * @throws InvalidInterfaceException
4002
+	 */
4003
+	protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
4004
+	{
4005
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4006
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4007
+		/** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4008
+		$message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
4009
+		$this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
4010
+        
4011
+		return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger,
4012
+			$message_type_to_deactivate);
4013
+	}
4014 4014
     
4015 4015
     
4016
-    /**
4017
-     * This just initializes the defaults for activating messenger and message type responses.
4018
-     */
4019
-    protected function _prep_default_response_for_messenger_or_message_type_toggle()
4020
-    {
4021
-        $this->_template_args['data']['active_mts'] = array();
4022
-        $this->_template_args['data']['mt_reload']  = array();
4023
-    }
4016
+	/**
4017
+	 * This just initializes the defaults for activating messenger and message type responses.
4018
+	 */
4019
+	protected function _prep_default_response_for_messenger_or_message_type_toggle()
4020
+	{
4021
+		$this->_template_args['data']['active_mts'] = array();
4022
+		$this->_template_args['data']['mt_reload']  = array();
4023
+	}
4024 4024
 
4025 4025
 
4026
-    /**
4027
-     * Setup appropriate response for activating a messenger and/or message types
4028
-     *
4029
-     * @param EE_messenger         $messenger
4030
-     * @param EE_message_type|null $message_type
4031
-     * @return bool
4032
-     * @throws DomainException
4033
-     * @throws EE_Error
4034
-     * @throws InvalidArgumentException
4035
-     * @throws ReflectionException
4036
-     * @throws InvalidDataTypeException
4037
-     * @throws InvalidInterfaceException
4038
-     */
4039
-    protected function _setup_response_message_for_activating_messenger_with_message_types(
4040
-        $messenger,
4041
-        EE_Message_Type $message_type = null
4042
-    ) {
4043
-        //if $messenger isn't a valid messenger object then get out.
4044
-        if ( ! $messenger instanceof EE_Messenger) {
4045
-            EE_Error::add_error(
4046
-                esc_html__('The messenger being activated is not a valid messenger', 'event_espresso'),
4047
-                __FILE__,
4048
-                __FUNCTION__,
4049
-                __LINE__
4050
-            );
4026
+	/**
4027
+	 * Setup appropriate response for activating a messenger and/or message types
4028
+	 *
4029
+	 * @param EE_messenger         $messenger
4030
+	 * @param EE_message_type|null $message_type
4031
+	 * @return bool
4032
+	 * @throws DomainException
4033
+	 * @throws EE_Error
4034
+	 * @throws InvalidArgumentException
4035
+	 * @throws ReflectionException
4036
+	 * @throws InvalidDataTypeException
4037
+	 * @throws InvalidInterfaceException
4038
+	 */
4039
+	protected function _setup_response_message_for_activating_messenger_with_message_types(
4040
+		$messenger,
4041
+		EE_Message_Type $message_type = null
4042
+	) {
4043
+		//if $messenger isn't a valid messenger object then get out.
4044
+		if ( ! $messenger instanceof EE_Messenger) {
4045
+			EE_Error::add_error(
4046
+				esc_html__('The messenger being activated is not a valid messenger', 'event_espresso'),
4047
+				__FILE__,
4048
+				__FUNCTION__,
4049
+				__LINE__
4050
+			);
4051 4051
             
4052
-            return false;
4053
-        }
4054
-        //activated
4055
-        if ($this->_template_args['data']['active_mts']) {
4056
-            EE_Error::overwrite_success();
4057
-            //activated a message type with the messenger
4058
-            if ($message_type instanceof EE_message_type) {
4059
-                EE_Error::add_success(
4060
-                    sprintf(
4061
-                        esc_html__('%s message type has been successfully activated with the %s messenger', 'event_espresso'),
4062
-                        ucwords($message_type->label['singular']),
4063
-                        ucwords($messenger->label['singular'])
4064
-                    )
4065
-                );
4052
+			return false;
4053
+		}
4054
+		//activated
4055
+		if ($this->_template_args['data']['active_mts']) {
4056
+			EE_Error::overwrite_success();
4057
+			//activated a message type with the messenger
4058
+			if ($message_type instanceof EE_message_type) {
4059
+				EE_Error::add_success(
4060
+					sprintf(
4061
+						esc_html__('%s message type has been successfully activated with the %s messenger', 'event_espresso'),
4062
+						ucwords($message_type->label['singular']),
4063
+						ucwords($messenger->label['singular'])
4064
+					)
4065
+				);
4066 4066
                 
4067
-                //if message type was invoice then let's make sure we activate the invoice payment method.
4068
-                if ($message_type->name === 'invoice') {
4069
-                    EE_Registry::instance()->load_lib('Payment_Method_Manager');
4070
-                    $pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
4071
-                    if ($pm instanceof EE_Payment_Method) {
4072
-                        EE_Error::add_attention(
4073
-                            esc_html__(
4074
-                                '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.',
4075
-                                'event_espresso'
4076
-                            )
4077
-                        );
4078
-                    }
4079
-                }
4080
-                //just toggles the entire messenger
4081
-            } else {
4082
-                EE_Error::add_success(
4083
-                    sprintf(
4084
-                        esc_html__('%s messenger has been successfully activated', 'event_espresso'),
4085
-                        ucwords($messenger->label['singular'])
4086
-                    )
4087
-                );
4088
-            }
4067
+				//if message type was invoice then let's make sure we activate the invoice payment method.
4068
+				if ($message_type->name === 'invoice') {
4069
+					EE_Registry::instance()->load_lib('Payment_Method_Manager');
4070
+					$pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
4071
+					if ($pm instanceof EE_Payment_Method) {
4072
+						EE_Error::add_attention(
4073
+							esc_html__(
4074
+								'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.',
4075
+								'event_espresso'
4076
+							)
4077
+						);
4078
+					}
4079
+				}
4080
+				//just toggles the entire messenger
4081
+			} else {
4082
+				EE_Error::add_success(
4083
+					sprintf(
4084
+						esc_html__('%s messenger has been successfully activated', 'event_espresso'),
4085
+						ucwords($messenger->label['singular'])
4086
+					)
4087
+				);
4088
+			}
4089 4089
             
4090
-            return true;
4090
+			return true;
4091 4091
             
4092
-            //possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
4093
-            //message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
4094
-            //in which case we just give a success message for the messenger being successfully activated.
4095
-        } else {
4096
-            if ( ! $messenger->get_default_message_types()) {
4097
-                //messenger doesn't have any default message types so still a success.
4098
-                EE_Error::add_success(
4099
-                    sprintf(
4100
-                        esc_html__('%s messenger was successfully activated.', 'event_espresso'),
4101
-                        ucwords($messenger->label['singular'])
4102
-                    )
4103
-                );
4092
+			//possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
4093
+			//message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
4094
+			//in which case we just give a success message for the messenger being successfully activated.
4095
+		} else {
4096
+			if ( ! $messenger->get_default_message_types()) {
4097
+				//messenger doesn't have any default message types so still a success.
4098
+				EE_Error::add_success(
4099
+					sprintf(
4100
+						esc_html__('%s messenger was successfully activated.', 'event_espresso'),
4101
+						ucwords($messenger->label['singular'])
4102
+					)
4103
+				);
4104 4104
                 
4105
-                return true;
4106
-            } else {
4107
-                EE_Error::add_error(
4108
-                    $message_type instanceof EE_message_type
4109
-                        ? sprintf(
4110
-                        esc_html__('%s message type was not successfully activated with the %s messenger', 'event_espresso'),
4111
-                        ucwords($message_type->label['singular']),
4112
-                        ucwords($messenger->label['singular'])
4113
-                    )
4114
-                        : sprintf(
4115
-                        esc_html__('%s messenger was not successfully activated', 'event_espresso'),
4116
-                        ucwords($messenger->label['singular'])
4117
-                    ),
4118
-                    __FILE__,
4119
-                    __FUNCTION__,
4120
-                    __LINE__
4121
-                );
4105
+				return true;
4106
+			} else {
4107
+				EE_Error::add_error(
4108
+					$message_type instanceof EE_message_type
4109
+						? sprintf(
4110
+						esc_html__('%s message type was not successfully activated with the %s messenger', 'event_espresso'),
4111
+						ucwords($message_type->label['singular']),
4112
+						ucwords($messenger->label['singular'])
4113
+					)
4114
+						: sprintf(
4115
+						esc_html__('%s messenger was not successfully activated', 'event_espresso'),
4116
+						ucwords($messenger->label['singular'])
4117
+					),
4118
+					__FILE__,
4119
+					__FUNCTION__,
4120
+					__LINE__
4121
+				);
4122 4122
                 
4123
-                return false;
4124
-            }
4125
-        }
4126
-    }
4123
+				return false;
4124
+			}
4125
+		}
4126
+	}
4127 4127
 
4128 4128
 
4129
-    /**
4130
-     * This sets up the appropriate response for deactivating a messenger and/or message type.
4131
-     *
4132
-     * @param EE_messenger         $messenger
4133
-     * @param EE_message_type|null $message_type
4134
-     * @return bool
4135
-     * @throws DomainException
4136
-     * @throws EE_Error
4137
-     * @throws InvalidArgumentException
4138
-     * @throws ReflectionException
4139
-     * @throws InvalidDataTypeException
4140
-     * @throws InvalidInterfaceException
4141
-     */
4142
-    protected function _setup_response_message_for_deactivating_messenger_with_message_types(
4143
-        $messenger,
4144
-        EE_message_type $message_type = null
4145
-    ) {
4146
-        EE_Error::overwrite_success();
4147
-        
4148
-        //if $messenger isn't a valid messenger object then get out.
4149
-        if ( ! $messenger instanceof EE_Messenger) {
4150
-            EE_Error::add_error(
4151
-                esc_html__('The messenger being deactivated is not a valid messenger', 'event_espresso'),
4152
-                __FILE__,
4153
-                __FUNCTION__,
4154
-                __LINE__
4155
-            );
4129
+	/**
4130
+	 * This sets up the appropriate response for deactivating a messenger and/or message type.
4131
+	 *
4132
+	 * @param EE_messenger         $messenger
4133
+	 * @param EE_message_type|null $message_type
4134
+	 * @return bool
4135
+	 * @throws DomainException
4136
+	 * @throws EE_Error
4137
+	 * @throws InvalidArgumentException
4138
+	 * @throws ReflectionException
4139
+	 * @throws InvalidDataTypeException
4140
+	 * @throws InvalidInterfaceException
4141
+	 */
4142
+	protected function _setup_response_message_for_deactivating_messenger_with_message_types(
4143
+		$messenger,
4144
+		EE_message_type $message_type = null
4145
+	) {
4146
+		EE_Error::overwrite_success();
4147
+        
4148
+		//if $messenger isn't a valid messenger object then get out.
4149
+		if ( ! $messenger instanceof EE_Messenger) {
4150
+			EE_Error::add_error(
4151
+				esc_html__('The messenger being deactivated is not a valid messenger', 'event_espresso'),
4152
+				__FILE__,
4153
+				__FUNCTION__,
4154
+				__LINE__
4155
+			);
4156 4156
             
4157
-            return false;
4158
-        }
4159
-        
4160
-        if ($message_type instanceof EE_message_type) {
4161
-            $message_type_name = $message_type->name;
4162
-            EE_Error::add_success(
4163
-                sprintf(
4164
-                    esc_html__('%s message type has been successfully deactivated for the %s messenger.', 'event_espresso'),
4165
-                    ucwords($message_type->label['singular']),
4166
-                    ucwords($messenger->label['singular'])
4167
-                )
4168
-            );
4169
-        } else {
4170
-            $message_type_name = '';
4171
-            EE_Error::add_success(
4172
-                sprintf(
4173
-                    esc_html__('%s messenger has been successfully deactivated.', 'event_espresso'),
4174
-                    ucwords($messenger->label['singular'])
4175
-                )
4176
-            );
4177
-        }
4178
-        
4179
-        //if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
4180
-        if ($messenger->name === 'html' || $message_type_name === 'invoice') {
4181
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
4182
-            $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
4183
-            if ($count_updated > 0) {
4184
-                $msg = $message_type_name === 'invoice'
4185
-                    ? esc_html__(
4186
-                        '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.',
4187
-                        'event_espresso'
4188
-                    )
4189
-                    : esc_html__(
4190
-                        '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.',
4191
-                        'event_espresso'
4192
-                    );
4193
-                EE_Error::add_attention($msg);
4194
-            }
4195
-        }
4196
-        
4197
-        return true;
4198
-    }
4157
+			return false;
4158
+		}
4159
+        
4160
+		if ($message_type instanceof EE_message_type) {
4161
+			$message_type_name = $message_type->name;
4162
+			EE_Error::add_success(
4163
+				sprintf(
4164
+					esc_html__('%s message type has been successfully deactivated for the %s messenger.', 'event_espresso'),
4165
+					ucwords($message_type->label['singular']),
4166
+					ucwords($messenger->label['singular'])
4167
+				)
4168
+			);
4169
+		} else {
4170
+			$message_type_name = '';
4171
+			EE_Error::add_success(
4172
+				sprintf(
4173
+					esc_html__('%s messenger has been successfully deactivated.', 'event_espresso'),
4174
+					ucwords($messenger->label['singular'])
4175
+				)
4176
+			);
4177
+		}
4178
+        
4179
+		//if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
4180
+		if ($messenger->name === 'html' || $message_type_name === 'invoice') {
4181
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
4182
+			$count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
4183
+			if ($count_updated > 0) {
4184
+				$msg = $message_type_name === 'invoice'
4185
+					? esc_html__(
4186
+						'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.',
4187
+						'event_espresso'
4188
+					)
4189
+					: esc_html__(
4190
+						'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.',
4191
+						'event_espresso'
4192
+					);
4193
+				EE_Error::add_attention($msg);
4194
+			}
4195
+		}
4196
+        
4197
+		return true;
4198
+	}
4199 4199
 
4200 4200
 
4201
-    /**
4202
-     * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
4203
-     *
4204
-     * @throws DomainException
4205
-     */
4206
-    public function update_mt_form()
4207
-    {
4208
-        if ( ! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
4209
-            EE_Error::add_error(
4210
-                esc_html__('Require message type or messenger to send an updated form', 'event_espresso'),
4211
-                __FILE__,
4212
-                __FUNCTION__,
4213
-                __LINE__
4214
-            );
4215
-            $this->_return_json();
4216
-        }
4217
-        
4218
-        $message_types = $this->get_installed_message_types();
4219
-        
4220
-        $message_type = $message_types[$this->_req_data['message_type']];
4221
-        $messenger    = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
4222
-        
4223
-        $content                         = $this->_message_type_settings_content(
4224
-            $message_type,
4225
-            $messenger,
4226
-            true
4227
-        );
4228
-        $this->_template_args['success'] = true;
4229
-        $this->_template_args['content'] = $content;
4230
-        $this->_return_json();
4231
-    }
4201
+	/**
4202
+	 * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
4203
+	 *
4204
+	 * @throws DomainException
4205
+	 */
4206
+	public function update_mt_form()
4207
+	{
4208
+		if ( ! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
4209
+			EE_Error::add_error(
4210
+				esc_html__('Require message type or messenger to send an updated form', 'event_espresso'),
4211
+				__FILE__,
4212
+				__FUNCTION__,
4213
+				__LINE__
4214
+			);
4215
+			$this->_return_json();
4216
+		}
4217
+        
4218
+		$message_types = $this->get_installed_message_types();
4219
+        
4220
+		$message_type = $message_types[$this->_req_data['message_type']];
4221
+		$messenger    = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
4222
+        
4223
+		$content                         = $this->_message_type_settings_content(
4224
+			$message_type,
4225
+			$messenger,
4226
+			true
4227
+		);
4228
+		$this->_template_args['success'] = true;
4229
+		$this->_template_args['content'] = $content;
4230
+		$this->_return_json();
4231
+	}
4232 4232
     
4233 4233
     
4234
-    /**
4235
-     * this handles saving the settings for a messenger or message type
4236
-     *
4237
-     */
4238
-    public function save_settings()
4239
-    {
4240
-        if ( ! isset($this->_req_data['type'])) {
4241
-            EE_Error::add_error(
4242
-                esc_html__(
4243
-                    'Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
4244
-                    'event_espresso'
4245
-                ),
4246
-                __FILE__,
4247
-                __FUNCTION__,
4248
-                __LINE__
4249
-            );
4250
-            $this->_template_args['error'] = true;
4251
-            $this->_return_json();
4252
-        }
4253
-        
4254
-        
4255
-        if ($this->_req_data['type'] === 'messenger') {
4256
-            //this should be an array.
4257
-            $settings  = $this->_req_data['messenger_settings'];
4258
-            $messenger = $settings['messenger'];
4259
-            //let's setup the settings data
4260
-            foreach ($settings as $key => $value) {
4261
-                switch ($key) {
4262
-                    case 'messenger' :
4263
-                        unset($settings['messenger']);
4264
-                        break;
4265
-                    case 'message_types' :
4266
-                        unset($settings['message_types']);
4267
-                        break;
4268
-                    default :
4269
-                        $settings[$key] = $value;
4270
-                        break;
4271
-                }
4272
-            }
4273
-            $this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
4274
-        } elseif ($this->_req_data['type'] === 'message_type') {
4275
-            $settings     = $this->_req_data['message_type_settings'];
4276
-            $messenger    = $settings['messenger'];
4277
-            $message_type = $settings['message_type'];
4234
+	/**
4235
+	 * this handles saving the settings for a messenger or message type
4236
+	 *
4237
+	 */
4238
+	public function save_settings()
4239
+	{
4240
+		if ( ! isset($this->_req_data['type'])) {
4241
+			EE_Error::add_error(
4242
+				esc_html__(
4243
+					'Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
4244
+					'event_espresso'
4245
+				),
4246
+				__FILE__,
4247
+				__FUNCTION__,
4248
+				__LINE__
4249
+			);
4250
+			$this->_template_args['error'] = true;
4251
+			$this->_return_json();
4252
+		}
4253
+        
4254
+        
4255
+		if ($this->_req_data['type'] === 'messenger') {
4256
+			//this should be an array.
4257
+			$settings  = $this->_req_data['messenger_settings'];
4258
+			$messenger = $settings['messenger'];
4259
+			//let's setup the settings data
4260
+			foreach ($settings as $key => $value) {
4261
+				switch ($key) {
4262
+					case 'messenger' :
4263
+						unset($settings['messenger']);
4264
+						break;
4265
+					case 'message_types' :
4266
+						unset($settings['message_types']);
4267
+						break;
4268
+					default :
4269
+						$settings[$key] = $value;
4270
+						break;
4271
+				}
4272
+			}
4273
+			$this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
4274
+		} elseif ($this->_req_data['type'] === 'message_type') {
4275
+			$settings     = $this->_req_data['message_type_settings'];
4276
+			$messenger    = $settings['messenger'];
4277
+			$message_type = $settings['message_type'];
4278 4278
             
4279
-            foreach ($settings as $key => $value) {
4280
-                switch ($key) {
4281
-                    case 'messenger' :
4282
-                        unset($settings['messenger']);
4283
-                        break;
4284
-                    case 'message_type' :
4285
-                        unset($settings['message_type']);
4286
-                        break;
4287
-                    default :
4288
-                        $settings[$key] = $value;
4289
-                        break;
4290
-                }
4291
-            }
4279
+			foreach ($settings as $key => $value) {
4280
+				switch ($key) {
4281
+					case 'messenger' :
4282
+						unset($settings['messenger']);
4283
+						break;
4284
+					case 'message_type' :
4285
+						unset($settings['message_type']);
4286
+						break;
4287
+					default :
4288
+						$settings[$key] = $value;
4289
+						break;
4290
+				}
4291
+			}
4292 4292
             
4293
-            $this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
4294
-        }
4295
-        
4296
-        //okay we should have the data all setup.  Now we just update!
4297
-        $success = $this->_message_resource_manager->update_active_messengers_option();
4298
-        
4299
-        if ($success) {
4300
-            EE_Error::add_success(__('Settings updated', 'event_espresso'));
4301
-        } else {
4302
-            EE_Error::add_error(
4303
-                esc_html__(
4304
-                    'Settings did not get updated',
4305
-                    'event_espresso'
4306
-                ),
4307
-                __FILE__,
4308
-                __FUNCTION__,
4309
-                __LINE__
4310
-            );
4311
-        }
4312
-        
4313
-        $this->_template_args['success'] = $success;
4314
-        $this->_return_json();
4315
-    }
4293
+			$this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
4294
+		}
4295
+        
4296
+		//okay we should have the data all setup.  Now we just update!
4297
+		$success = $this->_message_resource_manager->update_active_messengers_option();
4298
+        
4299
+		if ($success) {
4300
+			EE_Error::add_success(__('Settings updated', 'event_espresso'));
4301
+		} else {
4302
+			EE_Error::add_error(
4303
+				esc_html__(
4304
+					'Settings did not get updated',
4305
+					'event_espresso'
4306
+				),
4307
+				__FILE__,
4308
+				__FUNCTION__,
4309
+				__LINE__
4310
+			);
4311
+		}
4312
+        
4313
+		$this->_template_args['success'] = $success;
4314
+		$this->_return_json();
4315
+	}
4316 4316
     
4317 4317
     
4318 4318
     
4319 4319
     
4320
-    /**  EE MESSAGE PROCESSING ACTIONS **/
4320
+	/**  EE MESSAGE PROCESSING ACTIONS **/
4321 4321
 
4322 4322
 
4323
-    /**
4324
-     * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
4325
-     * However, this does not send immediately, it just queues for sending.
4326
-     *
4327
-     * @since 4.9.0
4328
-     * @throws EE_Error
4329
-     * @throws InvalidDataTypeException
4330
-     * @throws InvalidInterfaceException
4331
-     * @throws InvalidArgumentException
4332
-     * @throws ReflectionException
4333
-     */
4334
-    protected function _generate_now()
4335
-    {
4336
-        EED_Messages::generate_now($this->_get_msg_ids_from_request());
4337
-        $this->_redirect_after_action(false, '', '', array(), true);
4338
-    }
4323
+	/**
4324
+	 * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
4325
+	 * However, this does not send immediately, it just queues for sending.
4326
+	 *
4327
+	 * @since 4.9.0
4328
+	 * @throws EE_Error
4329
+	 * @throws InvalidDataTypeException
4330
+	 * @throws InvalidInterfaceException
4331
+	 * @throws InvalidArgumentException
4332
+	 * @throws ReflectionException
4333
+	 */
4334
+	protected function _generate_now()
4335
+	{
4336
+		EED_Messages::generate_now($this->_get_msg_ids_from_request());
4337
+		$this->_redirect_after_action(false, '', '', array(), true);
4338
+	}
4339 4339
 
4340 4340
 
4341
-    /**
4342
-     * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
4343
-     * are EEM_Message::status_resend or EEM_Message::status_idle
4344
-     *
4345
-     * @since 4.9.0
4346
-     * @throws EE_Error
4347
-     * @throws InvalidDataTypeException
4348
-     * @throws InvalidInterfaceException
4349
-     * @throws InvalidArgumentException
4350
-     * @throws ReflectionException
4351
-     */
4352
-    protected function _generate_and_send_now()
4353
-    {
4354
-        EED_Messages::generate_and_send_now($this->_get_msg_ids_from_request());
4355
-        $this->_redirect_after_action(false, '', '', array(), true);
4356
-    }
4341
+	/**
4342
+	 * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
4343
+	 * are EEM_Message::status_resend or EEM_Message::status_idle
4344
+	 *
4345
+	 * @since 4.9.0
4346
+	 * @throws EE_Error
4347
+	 * @throws InvalidDataTypeException
4348
+	 * @throws InvalidInterfaceException
4349
+	 * @throws InvalidArgumentException
4350
+	 * @throws ReflectionException
4351
+	 */
4352
+	protected function _generate_and_send_now()
4353
+	{
4354
+		EED_Messages::generate_and_send_now($this->_get_msg_ids_from_request());
4355
+		$this->_redirect_after_action(false, '', '', array(), true);
4356
+	}
4357 4357
 
4358 4358
 
4359
-    /**
4360
-     * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
4361
-     *
4362
-     * @since 4.9.0
4363
-     * @throws EE_Error
4364
-     * @throws InvalidDataTypeException
4365
-     * @throws InvalidInterfaceException
4366
-     * @throws InvalidArgumentException
4367
-     * @throws ReflectionException
4368
-     */
4369
-    protected function _queue_for_resending()
4370
-    {
4371
-        EED_Messages::queue_for_resending($this->_get_msg_ids_from_request());
4372
-        $this->_redirect_after_action(false, '', '', array(), true);
4373
-    }
4359
+	/**
4360
+	 * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
4361
+	 *
4362
+	 * @since 4.9.0
4363
+	 * @throws EE_Error
4364
+	 * @throws InvalidDataTypeException
4365
+	 * @throws InvalidInterfaceException
4366
+	 * @throws InvalidArgumentException
4367
+	 * @throws ReflectionException
4368
+	 */
4369
+	protected function _queue_for_resending()
4370
+	{
4371
+		EED_Messages::queue_for_resending($this->_get_msg_ids_from_request());
4372
+		$this->_redirect_after_action(false, '', '', array(), true);
4373
+	}
4374 4374
 
4375 4375
 
4376
-    /**
4377
-     *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
4378
-     *
4379
-     * @since 4.9.0
4380
-     * @throws EE_Error
4381
-     * @throws InvalidDataTypeException
4382
-     * @throws InvalidInterfaceException
4383
-     * @throws InvalidArgumentException
4384
-     * @throws ReflectionException
4385
-     */
4386
-    protected function _send_now()
4387
-    {
4388
-        EED_Messages::send_now($this->_get_msg_ids_from_request());
4389
-        $this->_redirect_after_action(false, '', '', array(), true);
4390
-    }
4376
+	/**
4377
+	 *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
4378
+	 *
4379
+	 * @since 4.9.0
4380
+	 * @throws EE_Error
4381
+	 * @throws InvalidDataTypeException
4382
+	 * @throws InvalidInterfaceException
4383
+	 * @throws InvalidArgumentException
4384
+	 * @throws ReflectionException
4385
+	 */
4386
+	protected function _send_now()
4387
+	{
4388
+		EED_Messages::send_now($this->_get_msg_ids_from_request());
4389
+		$this->_redirect_after_action(false, '', '', array(), true);
4390
+	}
4391 4391
 
4392 4392
 
4393
-    /**
4394
-     * Deletes EE_messages for IDs in the request.
4395
-     *
4396
-     * @since 4.9.0
4397
-     * @throws EE_Error
4398
-     * @throws InvalidDataTypeException
4399
-     * @throws InvalidInterfaceException
4400
-     * @throws InvalidArgumentException
4401
-     */
4402
-    protected function _delete_ee_messages()
4403
-    {
4404
-        $msg_ids       = $this->_get_msg_ids_from_request();
4405
-        $deleted_count = 0;
4406
-        foreach ($msg_ids as $msg_id) {
4407
-            if (EEM_Message::instance()->delete_by_ID($msg_id)) {
4408
-                $deleted_count++;
4409
-            }
4410
-        }
4411
-        if ($deleted_count) {
4412
-            EE_Error::add_success(esc_html(_n('Message successfully deleted', 'Messages successfully deleted', $deleted_count, 'event_espresso')));
4413
-            $this->_redirect_after_action(
4414
-                false,
4415
-                '',
4416
-                '',
4417
-                array(),
4418
-                true
4419
-            );
4420
-        } else {
4421
-            EE_Error::add_error(
4422
-                _n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
4423
-                __FILE__, __FUNCTION__, __LINE__
4424
-            );
4425
-            $this->_redirect_after_action(false, '', '', array(), true);
4426
-        }
4427
-    }
4393
+	/**
4394
+	 * Deletes EE_messages for IDs in the request.
4395
+	 *
4396
+	 * @since 4.9.0
4397
+	 * @throws EE_Error
4398
+	 * @throws InvalidDataTypeException
4399
+	 * @throws InvalidInterfaceException
4400
+	 * @throws InvalidArgumentException
4401
+	 */
4402
+	protected function _delete_ee_messages()
4403
+	{
4404
+		$msg_ids       = $this->_get_msg_ids_from_request();
4405
+		$deleted_count = 0;
4406
+		foreach ($msg_ids as $msg_id) {
4407
+			if (EEM_Message::instance()->delete_by_ID($msg_id)) {
4408
+				$deleted_count++;
4409
+			}
4410
+		}
4411
+		if ($deleted_count) {
4412
+			EE_Error::add_success(esc_html(_n('Message successfully deleted', 'Messages successfully deleted', $deleted_count, 'event_espresso')));
4413
+			$this->_redirect_after_action(
4414
+				false,
4415
+				'',
4416
+				'',
4417
+				array(),
4418
+				true
4419
+			);
4420
+		} else {
4421
+			EE_Error::add_error(
4422
+				_n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
4423
+				__FILE__, __FUNCTION__, __LINE__
4424
+			);
4425
+			$this->_redirect_after_action(false, '', '', array(), true);
4426
+		}
4427
+	}
4428 4428
     
4429 4429
     
4430
-    /**
4431
-     *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
4432
-     * @since 4.9.0
4433
-     * @return array
4434
-     */
4435
-    protected function _get_msg_ids_from_request()
4436
-    {
4437
-        if ( ! isset($this->_req_data['MSG_ID'])) {
4438
-            return array();
4439
-        }
4440
-        
4441
-        return is_array($this->_req_data['MSG_ID'])
4442
-            ? array_keys($this->_req_data['MSG_ID'])
4443
-            : array($this->_req_data['MSG_ID']);
4444
-    }
4430
+	/**
4431
+	 *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
4432
+	 * @since 4.9.0
4433
+	 * @return array
4434
+	 */
4435
+	protected function _get_msg_ids_from_request()
4436
+	{
4437
+		if ( ! isset($this->_req_data['MSG_ID'])) {
4438
+			return array();
4439
+		}
4440
+        
4441
+		return is_array($this->_req_data['MSG_ID'])
4442
+			? array_keys($this->_req_data['MSG_ID'])
4443
+			: array($this->_req_data['MSG_ID']);
4444
+	}
4445 4445
 }
Please login to merge, or discard this patch.
payment_methods/Paypal_Express/EE_PMT_Paypal_Express.pm.php 2 patches
Indentation   +140 added lines, -140 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,153 +17,153 @@  discard block
 block discarded – undo
17 17
 class EE_PMT_Paypal_Express extends EE_PMT_Base
18 18
 {
19 19
 
20
-    /**
21
-     * EE_PMT_Paypal_Express constructor.
22
-     */
23
-    public function __construct($pm_instance = null)
24
-    {
25
-        require_once($this->file_folder() . 'EEG_Paypal_Express.gateway.php');
26
-        $this->_gateway = new EEG_Paypal_Express();
20
+	/**
21
+	 * EE_PMT_Paypal_Express constructor.
22
+	 */
23
+	public function __construct($pm_instance = null)
24
+	{
25
+		require_once($this->file_folder() . 'EEG_Paypal_Express.gateway.php');
26
+		$this->_gateway = new EEG_Paypal_Express();
27 27
 
28
-        $this->_pretty_name = esc_html__('PayPal Express', 'event_espresso');
29
-        $this->_template_path = $this->file_folder() . 'templates' . DS;
30
-        $this->_default_description = esc_html__(
31
-            // @codingStandardsIgnoreStart
32
-            'After clicking \'Finalize Registration\', you will be forwarded to PayPal website to Login and make your payment.',
33
-            // @codingStandardsIgnoreEnd
34
-            'event_espresso'
35
-        );
36
-        $this->_default_button_url = $this->file_url() . 'lib' . DS . 'paypal-express-checkout-logo-gold-160.png';
28
+		$this->_pretty_name = esc_html__('PayPal Express', 'event_espresso');
29
+		$this->_template_path = $this->file_folder() . 'templates' . DS;
30
+		$this->_default_description = esc_html__(
31
+			// @codingStandardsIgnoreStart
32
+			'After clicking \'Finalize Registration\', you will be forwarded to PayPal website to Login and make your payment.',
33
+			// @codingStandardsIgnoreEnd
34
+			'event_espresso'
35
+		);
36
+		$this->_default_button_url = $this->file_url() . 'lib' . DS . 'paypal-express-checkout-logo-gold-160.png';
37 37
 
38
-        parent::__construct($pm_instance);
39
-    }
38
+		parent::__construct($pm_instance);
39
+	}
40 40
 
41 41
 
42
-    /**
43
-     * Adds the help tab.
44
-     *
45
-     * @see EE_PMT_Base::help_tabs_config()
46
-     * @return array
47
-     */
48
-    public function help_tabs_config()
49
-    {
50
-        return array(
51
-            $this->get_help_tab_name() => array(
52
-                'title'    => esc_html__('PayPal Express Settings', 'event_espresso'),
53
-                'filename' => 'payment_methods_overview_paypal_express'
54
-            )
55
-        );
56
-    }
42
+	/**
43
+	 * Adds the help tab.
44
+	 *
45
+	 * @see EE_PMT_Base::help_tabs_config()
46
+	 * @return array
47
+	 */
48
+	public function help_tabs_config()
49
+	{
50
+		return array(
51
+			$this->get_help_tab_name() => array(
52
+				'title'    => esc_html__('PayPal Express Settings', 'event_espresso'),
53
+				'filename' => 'payment_methods_overview_paypal_express'
54
+			)
55
+		);
56
+	}
57 57
 
58 58
 
59
-    /**
60
-     * Gets the form for all the settings related to this payment method type.
61
-     *
62
-     * @return EE_Payment_Method_Form
63
-     */
64
-    public function generate_new_settings_form()
65
-    {
66
-        EE_Registry::instance()->load_helper('Template');
67
-        $form = new EE_Payment_Method_Form(
68
-            array(
69
-                'extra_meta_inputs' => array(
70
-                    'api_username' => new EE_Text_Input(
71
-                        array(
72
-                            'html_label_text' => sprintf(
73
-                                esc_html__('API Username %s', 'event_espresso'),
74
-                                $this->get_help_tab_link()
75
-                            ),
76
-                            'required'        => true,
77
-                        )
78
-                    ),
79
-                    'api_password' => new EE_Text_Input(
80
-                        array(
81
-                            'html_label_text' => sprintf(
82
-                                esc_html__('API Password %s', 'event_espresso'),
83
-                                $this->get_help_tab_link()
84
-                            ),
85
-                            'required'        => true,
86
-                        )
87
-                    ),
88
-                    'api_signature' => new EE_Text_Input(
89
-                        array(
90
-                            'html_label_text' => sprintf(
91
-                                esc_html__('API Signature %s', 'event_espresso'),
92
-                                $this->get_help_tab_link()
93
-                            ),
94
-                            'required'        => true,
95
-                        )
96
-                    ),
97
-                    'request_shipping_addr' => new EE_Yes_No_Input(
98
-                        array(
99
-                            'html_label_text' => sprintf(
100
-                                esc_html__('Request Shipping Address %s', 'event_espresso'),
101
-                                $this->get_help_tab_link()
102
-                            ),
103
-                            'html_help_text'  => esc_html__(
104
-                                // @codingStandardsIgnoreStart
105
-                                'If set to "Yes", then a shipping address will be requested on the PayPal checkout page.',
106
-                                // @codingStandardsIgnoreEnd
107
-                                'event_espresso'
108
-                            ),
109
-                            'required'        => true,
110
-                            'default'         => false,
111
-                        )
112
-                    ),
113
-                    'image_url' => new EE_Admin_File_Uploader_Input(
114
-                        array(
115
-                            'html_label_text' => sprintf(
116
-                                esc_html__('Image URL %s', 'event_espresso'),
117
-                                $this->get_help_tab_link()
118
-                            ),
119
-                            'html_help_text'  => esc_html__(
120
-                                'Used for your business/personal logo on the PayPal page',
121
-                                'event_espresso'
122
-                            ),
123
-                            'required'        => false,
124
-                        )
125
-                    ),
126
-                )
127
-            )
128
-        );
129
-        return $form;
130
-    }
59
+	/**
60
+	 * Gets the form for all the settings related to this payment method type.
61
+	 *
62
+	 * @return EE_Payment_Method_Form
63
+	 */
64
+	public function generate_new_settings_form()
65
+	{
66
+		EE_Registry::instance()->load_helper('Template');
67
+		$form = new EE_Payment_Method_Form(
68
+			array(
69
+				'extra_meta_inputs' => array(
70
+					'api_username' => new EE_Text_Input(
71
+						array(
72
+							'html_label_text' => sprintf(
73
+								esc_html__('API Username %s', 'event_espresso'),
74
+								$this->get_help_tab_link()
75
+							),
76
+							'required'        => true,
77
+						)
78
+					),
79
+					'api_password' => new EE_Text_Input(
80
+						array(
81
+							'html_label_text' => sprintf(
82
+								esc_html__('API Password %s', 'event_espresso'),
83
+								$this->get_help_tab_link()
84
+							),
85
+							'required'        => true,
86
+						)
87
+					),
88
+					'api_signature' => new EE_Text_Input(
89
+						array(
90
+							'html_label_text' => sprintf(
91
+								esc_html__('API Signature %s', 'event_espresso'),
92
+								$this->get_help_tab_link()
93
+							),
94
+							'required'        => true,
95
+						)
96
+					),
97
+					'request_shipping_addr' => new EE_Yes_No_Input(
98
+						array(
99
+							'html_label_text' => sprintf(
100
+								esc_html__('Request Shipping Address %s', 'event_espresso'),
101
+								$this->get_help_tab_link()
102
+							),
103
+							'html_help_text'  => esc_html__(
104
+								// @codingStandardsIgnoreStart
105
+								'If set to "Yes", then a shipping address will be requested on the PayPal checkout page.',
106
+								// @codingStandardsIgnoreEnd
107
+								'event_espresso'
108
+							),
109
+							'required'        => true,
110
+							'default'         => false,
111
+						)
112
+					),
113
+					'image_url' => new EE_Admin_File_Uploader_Input(
114
+						array(
115
+							'html_label_text' => sprintf(
116
+								esc_html__('Image URL %s', 'event_espresso'),
117
+								$this->get_help_tab_link()
118
+							),
119
+							'html_help_text'  => esc_html__(
120
+								'Used for your business/personal logo on the PayPal page',
121
+								'event_espresso'
122
+							),
123
+							'required'        => false,
124
+						)
125
+					),
126
+				)
127
+			)
128
+		);
129
+		return $form;
130
+	}
131 131
 
132 132
 
133
-    /**
134
-     * Creates a billing form for this payment method type.
135
-     *
136
-     * @param \EE_Transaction $transaction
137
-     * @return \EE_Billing_Info_Form
138
-     */
139
-    public function generate_new_billing_form(EE_Transaction $transaction = null)
140
-    {
141
-        if ($this->_pm_instance->debug_mode()) {
142
-            $form = new EE_Billing_Info_Form(
143
-                $this->_pm_instance,
144
-                array(
145
-                    'name' => 'paypal_express_Info_Form',
146
-                    'subsections' => array(
147
-                        'paypal_express_debug_info' => new EE_Form_Section_Proper(
148
-                            array(
149
-                                'layout_strategy' => new EE_Template_Layout(
150
-                                    array(
151
-                                        'layout_template_file' => $this->_template_path
152
-                                                                    . 'paypal_express_debug_info.template.php',
153
-                                        'template_args'        => array(
154
-                                            'debug_mode' => $this->_pm_instance->debug_mode()
155
-                                        )
156
-                                    )
157
-                                )
158
-                            )
159
-                        )
160
-                    )
161
-                )
162
-            );
163
-            return $form;
164
-        }
133
+	/**
134
+	 * Creates a billing form for this payment method type.
135
+	 *
136
+	 * @param \EE_Transaction $transaction
137
+	 * @return \EE_Billing_Info_Form
138
+	 */
139
+	public function generate_new_billing_form(EE_Transaction $transaction = null)
140
+	{
141
+		if ($this->_pm_instance->debug_mode()) {
142
+			$form = new EE_Billing_Info_Form(
143
+				$this->_pm_instance,
144
+				array(
145
+					'name' => 'paypal_express_Info_Form',
146
+					'subsections' => array(
147
+						'paypal_express_debug_info' => new EE_Form_Section_Proper(
148
+							array(
149
+								'layout_strategy' => new EE_Template_Layout(
150
+									array(
151
+										'layout_template_file' => $this->_template_path
152
+																	. 'paypal_express_debug_info.template.php',
153
+										'template_args'        => array(
154
+											'debug_mode' => $this->_pm_instance->debug_mode()
155
+										)
156
+									)
157
+								)
158
+							)
159
+						)
160
+					)
161
+				)
162
+			);
163
+			return $form;
164
+		}
165 165
 
166
-        return false;
167
-    }
166
+		return false;
167
+	}
168 168
 }
169 169
 // End of file EE_PMT_Paypal_Express.pm.php
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@  discard block
 block discarded – undo
1
-<?php if (! defined('EVENT_ESPRESSO_VERSION')) {
1
+<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2 2
     exit('NO direct script access allowed');
3 3
 }
4 4
 
@@ -22,18 +22,18 @@  discard block
 block discarded – undo
22 22
      */
23 23
     public function __construct($pm_instance = null)
24 24
     {
25
-        require_once($this->file_folder() . 'EEG_Paypal_Express.gateway.php');
25
+        require_once($this->file_folder().'EEG_Paypal_Express.gateway.php');
26 26
         $this->_gateway = new EEG_Paypal_Express();
27 27
 
28 28
         $this->_pretty_name = esc_html__('PayPal Express', 'event_espresso');
29
-        $this->_template_path = $this->file_folder() . 'templates' . DS;
29
+        $this->_template_path = $this->file_folder().'templates'.DS;
30 30
         $this->_default_description = esc_html__(
31 31
             // @codingStandardsIgnoreStart
32 32
             'After clicking \'Finalize Registration\', you will be forwarded to PayPal website to Login and make your payment.',
33 33
             // @codingStandardsIgnoreEnd
34 34
             'event_espresso'
35 35
         );
36
-        $this->_default_button_url = $this->file_url() . 'lib' . DS . 'paypal-express-checkout-logo-gold-160.png';
36
+        $this->_default_button_url = $this->file_url().'lib'.DS.'paypal-express-checkout-logo-gold-160.png';
37 37
 
38 38
         parent::__construct($pm_instance);
39 39
     }
Please login to merge, or discard this patch.
espresso.php 2 patches
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -38,7 +38,7 @@  discard block
 block discarded – undo
38 38
  * @since       4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
41
+    if ( ! function_exists('espresso_duplicate_plugin_error')) {
42 42
         /**
43 43
          *    espresso_duplicate_plugin_error
44 44
          *    displays if more than one version of EE is activated at the same time
@@ -63,7 +63,7 @@  discard block
 block discarded – undo
63 63
 
64 64
 } else {
65 65
     define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
66
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+    if ( ! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
67 67
         /**
68 68
          * espresso_minimum_php_version_error
69 69
          * @return void
@@ -126,13 +126,13 @@  discard block
 block discarded – undo
126 126
                 return;
127 127
             }
128 128
             // load debugging tools
129
-            if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
130
-                require_once   EE_HELPERS . 'EEH_Debug_Tools.helper.php';
129
+            if (WP_DEBUG === true && is_readable(EE_HELPERS.'EEH_Debug_Tools.helper.php')) {
130
+                require_once   EE_HELPERS.'EEH_Debug_Tools.helper.php';
131 131
                 \EEH_Debug_Tools::instance();
132 132
             }
133 133
             // load error handling
134
-            if (is_readable(EE_CORE . 'EE_Error.core.php')) {
135
-                require_once EE_CORE . 'EE_Error.core.php';
134
+            if (is_readable(EE_CORE.'EE_Error.core.php')) {
135
+                require_once EE_CORE.'EE_Error.core.php';
136 136
             } else {
137 137
                 wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
138 138
             }
@@ -152,7 +152,7 @@  discard block
 block discarded – undo
152 152
             if (is_readable($full_path_to_file)) {
153 153
                 require_once $full_path_to_file;
154 154
             } else {
155
-                throw new \EE_Error (
155
+                throw new \EE_Error(
156 156
                     sprintf(
157 157
                         esc_html__(
158 158
                             'The %s class file could not be located or is not readable due to file permissions.',
@@ -178,47 +178,47 @@  discard block
 block discarded – undo
178 178
          */
179 179
         function bootstrap_espresso()
180 180
         {
181
-            require_once __DIR__ . '/core/espresso_definitions.php';
181
+            require_once __DIR__.'/core/espresso_definitions.php';
182 182
             try {
183 183
                 espresso_load_error_handling();
184 184
                 espresso_load_required(
185 185
                     'EEH_Base',
186
-                    EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php'
186
+                    EE_CORE.'helpers'.DS.'EEH_Base.helper.php'
187 187
                 );
188 188
                 espresso_load_required(
189 189
                     'EEH_File',
190
-                    EE_CORE . 'interfaces' . DS . 'EEHI_File.interface.php'
190
+                    EE_CORE.'interfaces'.DS.'EEHI_File.interface.php'
191 191
                 );
192 192
                 espresso_load_required(
193 193
                     'EEH_File',
194
-                    EE_CORE . 'helpers' . DS . 'EEH_File.helper.php'
194
+                    EE_CORE.'helpers'.DS.'EEH_File.helper.php'
195 195
                 );
196 196
                 espresso_load_required(
197 197
                     'EEH_Array',
198
-                    EE_CORE . 'helpers' . DS . 'EEH_Array.helper.php'
198
+                    EE_CORE.'helpers'.DS.'EEH_Array.helper.php'
199 199
                 );
200 200
                 // instantiate and configure PSR4 autoloader
201 201
                 espresso_load_required(
202 202
                     'Psr4Autoloader',
203
-                    EE_CORE . 'Psr4Autoloader.php'
203
+                    EE_CORE.'Psr4Autoloader.php'
204 204
                 );
205 205
                 espresso_load_required(
206 206
                     'EE_Psr4AutoloaderInit',
207
-                    EE_CORE . 'EE_Psr4AutoloaderInit.core.php'
207
+                    EE_CORE.'EE_Psr4AutoloaderInit.core.php'
208 208
                 );
209 209
                 $AutoloaderInit = new EE_Psr4AutoloaderInit();
210 210
                 $AutoloaderInit->initializeAutoloader();
211 211
                 espresso_load_required(
212 212
                     'EE_Request',
213
-                    EE_CORE . 'request_stack' . DS . 'EE_Request.core.php'
213
+                    EE_CORE.'request_stack'.DS.'EE_Request.core.php'
214 214
                 );
215 215
                 espresso_load_required(
216 216
                     'EE_Response',
217
-                    EE_CORE . 'request_stack' . DS . 'EE_Response.core.php'
217
+                    EE_CORE.'request_stack'.DS.'EE_Response.core.php'
218 218
                 );
219 219
                 espresso_load_required(
220 220
                     'EE_Bootstrap',
221
-                    EE_CORE . 'EE_Bootstrap.core.php'
221
+                    EE_CORE.'EE_Bootstrap.core.php'
222 222
                 );
223 223
                 // bootstrap EE and the request stack
224 224
                 new EE_Bootstrap(
@@ -226,14 +226,14 @@  discard block
 block discarded – undo
226 226
                     new EE_Response()
227 227
                 );
228 228
             } catch (Exception $e) {
229
-                require_once EE_CORE . 'exceptions' . DS . 'ExceptionStackTraceDisplay.php';
229
+                require_once EE_CORE.'exceptions'.DS.'ExceptionStackTraceDisplay.php';
230 230
                 new EventEspresso\core\exceptions\ExceptionStackTraceDisplay($e);
231 231
             }
232 232
         }
233 233
         bootstrap_espresso();
234 234
     }
235 235
 }
236
-if (! function_exists('espresso_deactivate_plugin')) {
236
+if ( ! function_exists('espresso_deactivate_plugin')) {
237 237
     /**
238 238
      *    deactivate_plugin
239 239
      * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
@@ -244,8 +244,8 @@  discard block
 block discarded – undo
244 244
      */
245 245
     function espresso_deactivate_plugin($plugin_basename = '')
246 246
     {
247
-        if (! function_exists('deactivate_plugins')) {
248
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
247
+        if ( ! function_exists('deactivate_plugins')) {
248
+            require_once ABSPATH.'wp-admin/includes/plugin.php';
249 249
         }
250 250
         unset($_GET['activate'], $_REQUEST['activate']);
251 251
         deactivate_plugins($plugin_basename);
Please login to merge, or discard this patch.
Indentation   +191 added lines, -191 removed lines patch added patch discarded remove patch
@@ -38,216 +38,216 @@
 block discarded – undo
38 38
  * @since       4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 
64 64
 } else {
65
-    define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
66
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
67
-        /**
68
-         * espresso_minimum_php_version_error
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
65
+	define('EE_MIN_PHP_VER_REQUIRED', '5.3.9');
66
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
67
+		/**
68
+		 * espresso_minimum_php_version_error
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.58.rc.019');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.58.rc.019');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118
-        /**
119
-         *    espresso_load_error_handling
120
-         *    this function loads EE's class for handling exceptions and errors
121
-         */
122
-        function espresso_load_error_handling()
123
-        {
124
-            static $error_handling_loaded = false;
125
-            if ($error_handling_loaded) {
126
-                return;
127
-            }
128
-            // load debugging tools
129
-            if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
130
-                require_once   EE_HELPERS . 'EEH_Debug_Tools.helper.php';
131
-                \EEH_Debug_Tools::instance();
132
-            }
133
-            // load error handling
134
-            if (is_readable(EE_CORE . 'EE_Error.core.php')) {
135
-                require_once EE_CORE . 'EE_Error.core.php';
136
-            } else {
137
-                wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
138
-            }
139
-            $error_handling_loaded = true;
140
-        }
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118
+		/**
119
+		 *    espresso_load_error_handling
120
+		 *    this function loads EE's class for handling exceptions and errors
121
+		 */
122
+		function espresso_load_error_handling()
123
+		{
124
+			static $error_handling_loaded = false;
125
+			if ($error_handling_loaded) {
126
+				return;
127
+			}
128
+			// load debugging tools
129
+			if (WP_DEBUG === true && is_readable(EE_HELPERS . 'EEH_Debug_Tools.helper.php')) {
130
+				require_once   EE_HELPERS . 'EEH_Debug_Tools.helper.php';
131
+				\EEH_Debug_Tools::instance();
132
+			}
133
+			// load error handling
134
+			if (is_readable(EE_CORE . 'EE_Error.core.php')) {
135
+				require_once EE_CORE . 'EE_Error.core.php';
136
+			} else {
137
+				wp_die(esc_html__('The EE_Error core class could not be loaded.', 'event_espresso'));
138
+			}
139
+			$error_handling_loaded = true;
140
+		}
141 141
 
142
-        /**
143
-         *    espresso_load_required
144
-         *    given a class name and path, this function will load that file or throw an exception
145
-         *
146
-         * @param    string $classname
147
-         * @param    string $full_path_to_file
148
-         * @throws    EE_Error
149
-         */
150
-        function espresso_load_required($classname, $full_path_to_file)
151
-        {
152
-            if (is_readable($full_path_to_file)) {
153
-                require_once $full_path_to_file;
154
-            } else {
155
-                throw new \EE_Error (
156
-                    sprintf(
157
-                        esc_html__(
158
-                            'The %s class file could not be located or is not readable due to file permissions.',
159
-                            'event_espresso'
160
-                        ),
161
-                        $classname
162
-                    )
163
-                );
164
-            }
165
-        }
142
+		/**
143
+		 *    espresso_load_required
144
+		 *    given a class name and path, this function will load that file or throw an exception
145
+		 *
146
+		 * @param    string $classname
147
+		 * @param    string $full_path_to_file
148
+		 * @throws    EE_Error
149
+		 */
150
+		function espresso_load_required($classname, $full_path_to_file)
151
+		{
152
+			if (is_readable($full_path_to_file)) {
153
+				require_once $full_path_to_file;
154
+			} else {
155
+				throw new \EE_Error (
156
+					sprintf(
157
+						esc_html__(
158
+							'The %s class file could not be located or is not readable due to file permissions.',
159
+							'event_espresso'
160
+						),
161
+						$classname
162
+					)
163
+				);
164
+			}
165
+		}
166 166
 
167
-        /**
168
-         * @since 4.9.27
169
-         * @throws \EE_Error
170
-         * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
171
-         * @throws \EventEspresso\core\exceptions\InvalidEntityException
172
-         * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
173
-         * @throws \EventEspresso\core\exceptions\InvalidClassException
174
-         * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
175
-         * @throws \EventEspresso\core\services\container\exceptions\ServiceExistsException
176
-         * @throws \EventEspresso\core\services\container\exceptions\ServiceNotFoundException
177
-         * @throws \OutOfBoundsException
178
-         */
179
-        function bootstrap_espresso()
180
-        {
181
-            require_once __DIR__ . '/core/espresso_definitions.php';
182
-            try {
183
-                espresso_load_error_handling();
184
-                espresso_load_required(
185
-                    'EEH_Base',
186
-                    EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php'
187
-                );
188
-                espresso_load_required(
189
-                    'EEH_File',
190
-                    EE_CORE . 'interfaces' . DS . 'EEHI_File.interface.php'
191
-                );
192
-                espresso_load_required(
193
-                    'EEH_File',
194
-                    EE_CORE . 'helpers' . DS . 'EEH_File.helper.php'
195
-                );
196
-                espresso_load_required(
197
-                    'EEH_Array',
198
-                    EE_CORE . 'helpers' . DS . 'EEH_Array.helper.php'
199
-                );
200
-                // instantiate and configure PSR4 autoloader
201
-                espresso_load_required(
202
-                    'Psr4Autoloader',
203
-                    EE_CORE . 'Psr4Autoloader.php'
204
-                );
205
-                espresso_load_required(
206
-                    'EE_Psr4AutoloaderInit',
207
-                    EE_CORE . 'EE_Psr4AutoloaderInit.core.php'
208
-                );
209
-                $AutoloaderInit = new EE_Psr4AutoloaderInit();
210
-                $AutoloaderInit->initializeAutoloader();
211
-                espresso_load_required(
212
-                    'EE_Request',
213
-                    EE_CORE . 'request_stack' . DS . 'EE_Request.core.php'
214
-                );
215
-                espresso_load_required(
216
-                    'EE_Response',
217
-                    EE_CORE . 'request_stack' . DS . 'EE_Response.core.php'
218
-                );
219
-                espresso_load_required(
220
-                    'EE_Bootstrap',
221
-                    EE_CORE . 'EE_Bootstrap.core.php'
222
-                );
223
-                // bootstrap EE and the request stack
224
-                new EE_Bootstrap(
225
-                    new EE_Request($_GET, $_POST, $_COOKIE),
226
-                    new EE_Response()
227
-                );
228
-            } catch (Exception $e) {
229
-                require_once EE_CORE . 'exceptions' . DS . 'ExceptionStackTraceDisplay.php';
230
-                new EventEspresso\core\exceptions\ExceptionStackTraceDisplay($e);
231
-            }
232
-        }
233
-        bootstrap_espresso();
234
-    }
167
+		/**
168
+		 * @since 4.9.27
169
+		 * @throws \EE_Error
170
+		 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
171
+		 * @throws \EventEspresso\core\exceptions\InvalidEntityException
172
+		 * @throws \EventEspresso\core\exceptions\InvalidIdentifierException
173
+		 * @throws \EventEspresso\core\exceptions\InvalidClassException
174
+		 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
175
+		 * @throws \EventEspresso\core\services\container\exceptions\ServiceExistsException
176
+		 * @throws \EventEspresso\core\services\container\exceptions\ServiceNotFoundException
177
+		 * @throws \OutOfBoundsException
178
+		 */
179
+		function bootstrap_espresso()
180
+		{
181
+			require_once __DIR__ . '/core/espresso_definitions.php';
182
+			try {
183
+				espresso_load_error_handling();
184
+				espresso_load_required(
185
+					'EEH_Base',
186
+					EE_CORE . 'helpers' . DS . 'EEH_Base.helper.php'
187
+				);
188
+				espresso_load_required(
189
+					'EEH_File',
190
+					EE_CORE . 'interfaces' . DS . 'EEHI_File.interface.php'
191
+				);
192
+				espresso_load_required(
193
+					'EEH_File',
194
+					EE_CORE . 'helpers' . DS . 'EEH_File.helper.php'
195
+				);
196
+				espresso_load_required(
197
+					'EEH_Array',
198
+					EE_CORE . 'helpers' . DS . 'EEH_Array.helper.php'
199
+				);
200
+				// instantiate and configure PSR4 autoloader
201
+				espresso_load_required(
202
+					'Psr4Autoloader',
203
+					EE_CORE . 'Psr4Autoloader.php'
204
+				);
205
+				espresso_load_required(
206
+					'EE_Psr4AutoloaderInit',
207
+					EE_CORE . 'EE_Psr4AutoloaderInit.core.php'
208
+				);
209
+				$AutoloaderInit = new EE_Psr4AutoloaderInit();
210
+				$AutoloaderInit->initializeAutoloader();
211
+				espresso_load_required(
212
+					'EE_Request',
213
+					EE_CORE . 'request_stack' . DS . 'EE_Request.core.php'
214
+				);
215
+				espresso_load_required(
216
+					'EE_Response',
217
+					EE_CORE . 'request_stack' . DS . 'EE_Response.core.php'
218
+				);
219
+				espresso_load_required(
220
+					'EE_Bootstrap',
221
+					EE_CORE . 'EE_Bootstrap.core.php'
222
+				);
223
+				// bootstrap EE and the request stack
224
+				new EE_Bootstrap(
225
+					new EE_Request($_GET, $_POST, $_COOKIE),
226
+					new EE_Response()
227
+				);
228
+			} catch (Exception $e) {
229
+				require_once EE_CORE . 'exceptions' . DS . 'ExceptionStackTraceDisplay.php';
230
+				new EventEspresso\core\exceptions\ExceptionStackTraceDisplay($e);
231
+			}
232
+		}
233
+		bootstrap_espresso();
234
+	}
235 235
 }
236 236
 if (! function_exists('espresso_deactivate_plugin')) {
237
-    /**
238
-     *    deactivate_plugin
239
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
240
-     *
241
-     * @access public
242
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
243
-     * @return    void
244
-     */
245
-    function espresso_deactivate_plugin($plugin_basename = '')
246
-    {
247
-        if (! function_exists('deactivate_plugins')) {
248
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
249
-        }
250
-        unset($_GET['activate'], $_REQUEST['activate']);
251
-        deactivate_plugins($plugin_basename);
252
-    }
237
+	/**
238
+	 *    deactivate_plugin
239
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
240
+	 *
241
+	 * @access public
242
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
243
+	 * @return    void
244
+	 */
245
+	function espresso_deactivate_plugin($plugin_basename = '')
246
+	{
247
+		if (! function_exists('deactivate_plugins')) {
248
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
249
+		}
250
+		unset($_GET['activate'], $_REQUEST['activate']);
251
+		deactivate_plugins($plugin_basename);
252
+	}
253 253
 }
Please login to merge, or discard this patch.
caffeinated/brewing_regular.php 2 patches
Indentation   +260 added lines, -260 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
 use EventEspresso\core\services\database\TableAnalysis;
5 5
 
6 6
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
7
-    exit('No direct script access allowed');
7
+	exit('No direct script access allowed');
8 8
 }
9 9
 /**
10 10
  * the purpose of this file is to simply contain any action/filter hook callbacks etc for specific aspects of EE
@@ -29,268 +29,268 @@  discard block
 block discarded – undo
29 29
 class EE_Brewing_Regular extends EE_BASE implements InterminableInterface
30 30
 {
31 31
 
32
-    /**
33
-     * @var \EventEspresso\core\services\database\TableAnalysis $table_analysis
34
-     */
35
-    protected $_table_analysis;
36
-
37
-
38
-    /**
39
-     * EE_Brewing_Regular constructor.
40
-     * @throws \DomainException
41
-     * @throws \EE_Error
42
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
43
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
44
-     * @throws \InvalidArgumentException
45
-     */
46
-    public function __construct(TableAnalysis $table_analysis)
47
-    {
48
-        $this->_table_analysis = $table_analysis;
49
-        if (defined('EE_CAFF_PATH')) {
50
-            // activation
51
-            add_action('AHEE__EEH_Activation__initialize_db_content', array($this, 'initialize_caf_db_content'));
52
-            // load caff init
53
-            add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'caffeinated_init'));
54
-            // remove the "powered by" credit link from receipts and invoices
55
-            add_filter('FHEE_EE_Html_messenger__add_powered_by_credit_link_to_receipt_and_invoice', '__return_false');
56
-            // add caffeinated modules
57
-            add_filter(
58
-                'FHEE__EE_Config__register_modules__modules_to_register',
59
-                array($this, 'caffeinated_modules_to_register')
60
-            );
61
-            // load caff scripts
62
-            add_action('wp_enqueue_scripts', array($this, 'enqueue_caffeinated_scripts'), 10);
63
-            add_filter('FHEE__EE_Registry__load_helper__helper_paths', array($this, 'caf_helper_paths'), 10);
64
-            //add_filter('FHEE__EE_Registry__load_helper__helper_paths', array($this, 'caf_helper_paths'), 10);
65
-            EE_Register_Payment_Method::register(
66
-                'caffeinated_payment_methods',
67
-                array(
68
-                    'payment_method_paths' => glob(EE_CAF_PAYMENT_METHODS . '*', GLOB_ONLYDIR)
69
-                )
70
-            );
71
-            // caffeinated constructed
72
-            do_action('AHEE__EE_Brewing_Regular__construct__complete');
73
-            //seeing how this is caf, which isn't put on WordPress.org, we can have affiliate links without a disclaimer
74
-            add_filter('FHEE__ee_show_affiliate_links', '__return_false');
75
-        }
76
-    }
77
-
78
-
79
-
80
-    /**
81
-     * callback for the FHEE__EE_Registry__load_helper__helper_paths filter to add the caffeinated paths
82
-     *
83
-     * @param array $paths original helper paths array
84
-     * @return array             new array of paths
85
-     */
86
-    public function caf_helper_paths($paths)
87
-    {
88
-        $paths[] = EE_CAF_CORE . 'helpers' . DS;
89
-        return $paths;
90
-    }
91
-
92
-
93
-
94
-    /**
95
-     * Upon brand-new activation, if this is a new activation of CAF, we want to add
96
-     * some global prices that will show off EE4's capabilities. However, if they're upgrading
97
-     * from 3.1, or simply EE4.x decaf, we assume they don't want us to suddenly introduce these extra prices.
98
-     * This action should only be called when EE 4.x.0.P is initially activated.
99
-     * Right now the only CAF content are these global prices. If there's more in the future, then
100
-     * we should probably create a caf file to contain it all instead just a function like this.
101
-     * Right now, we ASSUME the only price types in the system are default ones
102
-     *
103
-     * @global wpdb $wpdb
104
-     */
105
-    public function initialize_caf_db_content()
106
-    {
107
-        global $wpdb;
108
-        //use same method of getting creator id as the version introducing the change
109
-        $default_creator_id = apply_filters('FHEE__EE_DMS_Core_4_5_0__get_default_creator_id', get_current_user_id());
110
-        $price_type_table = $wpdb->prefix . "esp_price_type";
111
-        $price_table = $wpdb->prefix . "esp_price";
112
-        if ($this->_get_table_analysis()->tableExists($price_type_table)) {
113
-            $SQL = 'SELECT COUNT(PRT_ID) FROM ' . $price_type_table . ' WHERE PBT_ID=4';//include trashed price types
114
-            $tax_price_type_count = $wpdb->get_var($SQL);
115
-            if ($tax_price_type_count <= 1) {
116
-                $wpdb->insert(
117
-                    $price_type_table,
118
-                    array(
119
-                        'PRT_name'       => __("Regional Tax", "event_espresso"),
120
-                        'PBT_ID'         => 4,
121
-                        'PRT_is_percent' => true,
122
-                        'PRT_order'      => 60,
123
-                        'PRT_deleted'    => false,
124
-                        'PRT_wp_user'    => $default_creator_id,
125
-                    ),
126
-                    array(
127
-                        '%s',//PRT_name
128
-                        '%d',//PBT_id
129
-                        '%d',//PRT_is_percent
130
-                        '%d',//PRT_order
131
-                        '%d',//PRT_deleted
132
-                        '%d', //PRT_wp_user
133
-                    )
134
-                );
135
-                //federal tax
136
-                $result = $wpdb->insert(
137
-                    $price_type_table,
138
-                    array(
139
-                        'PRT_name'       => __("Federal Tax", "event_espresso"),
140
-                        'PBT_ID'         => 4,
141
-                        'PRT_is_percent' => true,
142
-                        'PRT_order'      => 70,
143
-                        'PRT_deleted'    => false,
144
-                        'PRT_wp_user'    => $default_creator_id,
145
-                    ),
146
-                    array(
147
-                        '%s',//PRT_name
148
-                        '%d',//PBT_id
149
-                        '%d',//PRT_is_percent
150
-                        '%d',//PRT_order
151
-                        '%d',//PRT_deleted
152
-                        '%d' //PRT_wp_user
153
-                    )
154
-                );
155
-                if ($result) {
156
-                    $wpdb->insert(
157
-                        $price_table,
158
-                        array(
159
-                            'PRT_ID'         => $wpdb->insert_id,
160
-                            'PRC_amount'     => 15.00,
161
-                            'PRC_name'       => __("Sales Tax", "event_espresso"),
162
-                            'PRC_desc'       => '',
163
-                            'PRC_is_default' => true,
164
-                            'PRC_overrides'  => null,
165
-                            'PRC_deleted'    => false,
166
-                            'PRC_order'      => 50,
167
-                            'PRC_parent'     => null,
168
-                            'PRC_wp_user'    => $default_creator_id,
169
-                        ),
170
-                        array(
171
-                            '%d',//PRT_id
172
-                            '%f',//PRC_amount
173
-                            '%s',//PRC_name
174
-                            '%s',//PRC_desc
175
-                            '%d',//PRC_is_default
176
-                            '%d',//PRC_overrides
177
-                            '%d',//PRC_deleted
178
-                            '%d',//PRC_order
179
-                            '%d',//PRC_parent
180
-                            '%d' //PRC_wp_user
181
-                        )
182
-                    );
183
-                }
184
-            }
185
-        }
186
-    }
187
-
188
-
189
-
190
-    /**
191
-     *    caffeinated_modules_to_register
192
-     *
193
-     * @access public
194
-     * @param array $modules_to_register
195
-     * @return array
196
-     */
197
-    public function caffeinated_modules_to_register($modules_to_register = array())
198
-    {
199
-        if (is_readable(EE_CAFF_PATH . 'modules')) {
200
-            $caffeinated_modules_to_register = glob(EE_CAFF_PATH . 'modules' . DS . '*', GLOB_ONLYDIR);
201
-            if (is_array($caffeinated_modules_to_register) && ! empty($caffeinated_modules_to_register)) {
202
-                $modules_to_register = array_merge($modules_to_register, $caffeinated_modules_to_register);
203
-            }
204
-        }
205
-        return $modules_to_register;
206
-    }
207
-
208
-
209
-
210
-    public function caffeinated_init()
211
-    {
212
-        // EE_Register_CPTs hooks
213
-        add_filter('FHEE__EE_Register_CPTs__get_taxonomies__taxonomies', array($this, 'filter_taxonomies'), 10);
214
-        add_filter('FHEE__EE_Register_CPTs__get_CPTs__cpts', array($this, 'filter_cpts'), 10);
215
-        add_filter('FHEE__EE_Admin__get_extra_nav_menu_pages_items', array($this, 'nav_metabox_items'), 10);
216
-        EE_Registry::instance()->load_file(EE_CAFF_PATH, 'EE_Caf_Messages', 'class', array(), false);
217
-        // caffeinated_init__complete hook
218
-        do_action('AHEE__EE_Brewing_Regular__caffeinated_init__complete');
219
-    }
220
-
221
-
222
-
223
-    public function enqueue_caffeinated_scripts()
224
-    {
225
-        // sound of crickets...
226
-    }
227
-
228
-
229
-
230
-    /**
231
-     * callbacks below here
232
-     *
233
-     * @param array $taxonomy_array
234
-     * @return array
235
-     */
236
-    public function filter_taxonomies(array $taxonomy_array)
237
-    {
238
-        $taxonomy_array['espresso_venue_categories']['args']['show_in_nav_menus'] = true;
239
-        return $taxonomy_array;
240
-    }
241
-
242
-
243
-
244
-    /**
245
-     * @param array $cpt_array
246
-     * @return mixed
247
-     */
248
-    public function filter_cpts(array $cpt_array)
249
-    {
250
-        $cpt_array['espresso_venues']['args']['show_in_nav_menus'] = true;
251
-        return $cpt_array;
252
-    }
253
-
254
-
255
-
256
-    /**
257
-     * @param array $menuitems
258
-     * @return array
259
-     */
260
-    public function nav_metabox_items(array $menuitems)
261
-    {
262
-        $menuitems[] = array(
263
-            'title'       => __('Venue List', 'event_espresso'),
264
-            'url'         => get_post_type_archive_link('espresso_venues'),
265
-            'description' => __('Archive page for all venues.', 'event_espresso'),
266
-        );
267
-        return $menuitems;
268
-    }
269
-
270
-
271
-    /**
272
-     * Gets the injected table analyzer, or throws an exception
273
-     *
274
-     * @return TableAnalysis
275
-     * @throws \EE_Error
276
-     */
277
-    protected function _get_table_analysis()
278
-    {
279
-        if ($this->_table_analysis instanceof TableAnalysis) {
280
-            return $this->_table_analysis;
281
-        } else {
282
-            throw new \EE_Error(
283
-                sprintf(
284
-                    __('Table analysis class on class %1$s is not set properly.', 'event_espresso'),
285
-                    get_class($this)
286
-                )
287
-            );
288
-        }
289
-    }
32
+	/**
33
+	 * @var \EventEspresso\core\services\database\TableAnalysis $table_analysis
34
+	 */
35
+	protected $_table_analysis;
36
+
37
+
38
+	/**
39
+	 * EE_Brewing_Regular constructor.
40
+	 * @throws \DomainException
41
+	 * @throws \EE_Error
42
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
43
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
44
+	 * @throws \InvalidArgumentException
45
+	 */
46
+	public function __construct(TableAnalysis $table_analysis)
47
+	{
48
+		$this->_table_analysis = $table_analysis;
49
+		if (defined('EE_CAFF_PATH')) {
50
+			// activation
51
+			add_action('AHEE__EEH_Activation__initialize_db_content', array($this, 'initialize_caf_db_content'));
52
+			// load caff init
53
+			add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'caffeinated_init'));
54
+			// remove the "powered by" credit link from receipts and invoices
55
+			add_filter('FHEE_EE_Html_messenger__add_powered_by_credit_link_to_receipt_and_invoice', '__return_false');
56
+			// add caffeinated modules
57
+			add_filter(
58
+				'FHEE__EE_Config__register_modules__modules_to_register',
59
+				array($this, 'caffeinated_modules_to_register')
60
+			);
61
+			// load caff scripts
62
+			add_action('wp_enqueue_scripts', array($this, 'enqueue_caffeinated_scripts'), 10);
63
+			add_filter('FHEE__EE_Registry__load_helper__helper_paths', array($this, 'caf_helper_paths'), 10);
64
+			//add_filter('FHEE__EE_Registry__load_helper__helper_paths', array($this, 'caf_helper_paths'), 10);
65
+			EE_Register_Payment_Method::register(
66
+				'caffeinated_payment_methods',
67
+				array(
68
+					'payment_method_paths' => glob(EE_CAF_PAYMENT_METHODS . '*', GLOB_ONLYDIR)
69
+				)
70
+			);
71
+			// caffeinated constructed
72
+			do_action('AHEE__EE_Brewing_Regular__construct__complete');
73
+			//seeing how this is caf, which isn't put on WordPress.org, we can have affiliate links without a disclaimer
74
+			add_filter('FHEE__ee_show_affiliate_links', '__return_false');
75
+		}
76
+	}
77
+
78
+
79
+
80
+	/**
81
+	 * callback for the FHEE__EE_Registry__load_helper__helper_paths filter to add the caffeinated paths
82
+	 *
83
+	 * @param array $paths original helper paths array
84
+	 * @return array             new array of paths
85
+	 */
86
+	public function caf_helper_paths($paths)
87
+	{
88
+		$paths[] = EE_CAF_CORE . 'helpers' . DS;
89
+		return $paths;
90
+	}
91
+
92
+
93
+
94
+	/**
95
+	 * Upon brand-new activation, if this is a new activation of CAF, we want to add
96
+	 * some global prices that will show off EE4's capabilities. However, if they're upgrading
97
+	 * from 3.1, or simply EE4.x decaf, we assume they don't want us to suddenly introduce these extra prices.
98
+	 * This action should only be called when EE 4.x.0.P is initially activated.
99
+	 * Right now the only CAF content are these global prices. If there's more in the future, then
100
+	 * we should probably create a caf file to contain it all instead just a function like this.
101
+	 * Right now, we ASSUME the only price types in the system are default ones
102
+	 *
103
+	 * @global wpdb $wpdb
104
+	 */
105
+	public function initialize_caf_db_content()
106
+	{
107
+		global $wpdb;
108
+		//use same method of getting creator id as the version introducing the change
109
+		$default_creator_id = apply_filters('FHEE__EE_DMS_Core_4_5_0__get_default_creator_id', get_current_user_id());
110
+		$price_type_table = $wpdb->prefix . "esp_price_type";
111
+		$price_table = $wpdb->prefix . "esp_price";
112
+		if ($this->_get_table_analysis()->tableExists($price_type_table)) {
113
+			$SQL = 'SELECT COUNT(PRT_ID) FROM ' . $price_type_table . ' WHERE PBT_ID=4';//include trashed price types
114
+			$tax_price_type_count = $wpdb->get_var($SQL);
115
+			if ($tax_price_type_count <= 1) {
116
+				$wpdb->insert(
117
+					$price_type_table,
118
+					array(
119
+						'PRT_name'       => __("Regional Tax", "event_espresso"),
120
+						'PBT_ID'         => 4,
121
+						'PRT_is_percent' => true,
122
+						'PRT_order'      => 60,
123
+						'PRT_deleted'    => false,
124
+						'PRT_wp_user'    => $default_creator_id,
125
+					),
126
+					array(
127
+						'%s',//PRT_name
128
+						'%d',//PBT_id
129
+						'%d',//PRT_is_percent
130
+						'%d',//PRT_order
131
+						'%d',//PRT_deleted
132
+						'%d', //PRT_wp_user
133
+					)
134
+				);
135
+				//federal tax
136
+				$result = $wpdb->insert(
137
+					$price_type_table,
138
+					array(
139
+						'PRT_name'       => __("Federal Tax", "event_espresso"),
140
+						'PBT_ID'         => 4,
141
+						'PRT_is_percent' => true,
142
+						'PRT_order'      => 70,
143
+						'PRT_deleted'    => false,
144
+						'PRT_wp_user'    => $default_creator_id,
145
+					),
146
+					array(
147
+						'%s',//PRT_name
148
+						'%d',//PBT_id
149
+						'%d',//PRT_is_percent
150
+						'%d',//PRT_order
151
+						'%d',//PRT_deleted
152
+						'%d' //PRT_wp_user
153
+					)
154
+				);
155
+				if ($result) {
156
+					$wpdb->insert(
157
+						$price_table,
158
+						array(
159
+							'PRT_ID'         => $wpdb->insert_id,
160
+							'PRC_amount'     => 15.00,
161
+							'PRC_name'       => __("Sales Tax", "event_espresso"),
162
+							'PRC_desc'       => '',
163
+							'PRC_is_default' => true,
164
+							'PRC_overrides'  => null,
165
+							'PRC_deleted'    => false,
166
+							'PRC_order'      => 50,
167
+							'PRC_parent'     => null,
168
+							'PRC_wp_user'    => $default_creator_id,
169
+						),
170
+						array(
171
+							'%d',//PRT_id
172
+							'%f',//PRC_amount
173
+							'%s',//PRC_name
174
+							'%s',//PRC_desc
175
+							'%d',//PRC_is_default
176
+							'%d',//PRC_overrides
177
+							'%d',//PRC_deleted
178
+							'%d',//PRC_order
179
+							'%d',//PRC_parent
180
+							'%d' //PRC_wp_user
181
+						)
182
+					);
183
+				}
184
+			}
185
+		}
186
+	}
187
+
188
+
189
+
190
+	/**
191
+	 *    caffeinated_modules_to_register
192
+	 *
193
+	 * @access public
194
+	 * @param array $modules_to_register
195
+	 * @return array
196
+	 */
197
+	public function caffeinated_modules_to_register($modules_to_register = array())
198
+	{
199
+		if (is_readable(EE_CAFF_PATH . 'modules')) {
200
+			$caffeinated_modules_to_register = glob(EE_CAFF_PATH . 'modules' . DS . '*', GLOB_ONLYDIR);
201
+			if (is_array($caffeinated_modules_to_register) && ! empty($caffeinated_modules_to_register)) {
202
+				$modules_to_register = array_merge($modules_to_register, $caffeinated_modules_to_register);
203
+			}
204
+		}
205
+		return $modules_to_register;
206
+	}
207
+
208
+
209
+
210
+	public function caffeinated_init()
211
+	{
212
+		// EE_Register_CPTs hooks
213
+		add_filter('FHEE__EE_Register_CPTs__get_taxonomies__taxonomies', array($this, 'filter_taxonomies'), 10);
214
+		add_filter('FHEE__EE_Register_CPTs__get_CPTs__cpts', array($this, 'filter_cpts'), 10);
215
+		add_filter('FHEE__EE_Admin__get_extra_nav_menu_pages_items', array($this, 'nav_metabox_items'), 10);
216
+		EE_Registry::instance()->load_file(EE_CAFF_PATH, 'EE_Caf_Messages', 'class', array(), false);
217
+		// caffeinated_init__complete hook
218
+		do_action('AHEE__EE_Brewing_Regular__caffeinated_init__complete');
219
+	}
220
+
221
+
222
+
223
+	public function enqueue_caffeinated_scripts()
224
+	{
225
+		// sound of crickets...
226
+	}
227
+
228
+
229
+
230
+	/**
231
+	 * callbacks below here
232
+	 *
233
+	 * @param array $taxonomy_array
234
+	 * @return array
235
+	 */
236
+	public function filter_taxonomies(array $taxonomy_array)
237
+	{
238
+		$taxonomy_array['espresso_venue_categories']['args']['show_in_nav_menus'] = true;
239
+		return $taxonomy_array;
240
+	}
241
+
242
+
243
+
244
+	/**
245
+	 * @param array $cpt_array
246
+	 * @return mixed
247
+	 */
248
+	public function filter_cpts(array $cpt_array)
249
+	{
250
+		$cpt_array['espresso_venues']['args']['show_in_nav_menus'] = true;
251
+		return $cpt_array;
252
+	}
253
+
254
+
255
+
256
+	/**
257
+	 * @param array $menuitems
258
+	 * @return array
259
+	 */
260
+	public function nav_metabox_items(array $menuitems)
261
+	{
262
+		$menuitems[] = array(
263
+			'title'       => __('Venue List', 'event_espresso'),
264
+			'url'         => get_post_type_archive_link('espresso_venues'),
265
+			'description' => __('Archive page for all venues.', 'event_espresso'),
266
+		);
267
+		return $menuitems;
268
+	}
269
+
270
+
271
+	/**
272
+	 * Gets the injected table analyzer, or throws an exception
273
+	 *
274
+	 * @return TableAnalysis
275
+	 * @throws \EE_Error
276
+	 */
277
+	protected function _get_table_analysis()
278
+	{
279
+		if ($this->_table_analysis instanceof TableAnalysis) {
280
+			return $this->_table_analysis;
281
+		} else {
282
+			throw new \EE_Error(
283
+				sprintf(
284
+					__('Table analysis class on class %1$s is not set properly.', 'event_espresso'),
285
+					get_class($this)
286
+				)
287
+			);
288
+		}
289
+	}
290 290
 }
291 291
 
292 292
 
293 293
 
294 294
 $brewing = new EE_Brewing_Regular(
295
-    EE_Registry::instance()->create('TableAnalysis', array(), true)
295
+	EE_Registry::instance()->create('TableAnalysis', array(), true)
296 296
 );
297 297
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -12,10 +12,10 @@  discard block
 block discarded – undo
12 12
  * define and use the hook in a specific caffeinated/whatever class or file.
13 13
  */
14 14
 // defined some new constants related to caffeinated folder
15
-define('EE_CAF_URL', EE_PLUGIN_DIR_URL . 'caffeinated/');
16
-define('EE_CAF_CORE', EE_CAFF_PATH . 'core' . DS);
17
-define('EE_CAF_LIBRARIES', EE_CAF_CORE . 'libraries' . DS);
18
-define('EE_CAF_PAYMENT_METHODS', EE_CAFF_PATH . 'payment_methods' . DS);
15
+define('EE_CAF_URL', EE_PLUGIN_DIR_URL.'caffeinated/');
16
+define('EE_CAF_CORE', EE_CAFF_PATH.'core'.DS);
17
+define('EE_CAF_LIBRARIES', EE_CAF_CORE.'libraries'.DS);
18
+define('EE_CAF_PAYMENT_METHODS', EE_CAFF_PATH.'payment_methods'.DS);
19 19
 
20 20
 
21 21
 
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
             EE_Register_Payment_Method::register(
66 66
                 'caffeinated_payment_methods',
67 67
                 array(
68
-                    'payment_method_paths' => glob(EE_CAF_PAYMENT_METHODS . '*', GLOB_ONLYDIR)
68
+                    'payment_method_paths' => glob(EE_CAF_PAYMENT_METHODS.'*', GLOB_ONLYDIR)
69 69
                 )
70 70
             );
71 71
             // caffeinated constructed
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
      */
86 86
     public function caf_helper_paths($paths)
87 87
     {
88
-        $paths[] = EE_CAF_CORE . 'helpers' . DS;
88
+        $paths[] = EE_CAF_CORE.'helpers'.DS;
89 89
         return $paths;
90 90
     }
91 91
 
@@ -107,10 +107,10 @@  discard block
 block discarded – undo
107 107
         global $wpdb;
108 108
         //use same method of getting creator id as the version introducing the change
109 109
         $default_creator_id = apply_filters('FHEE__EE_DMS_Core_4_5_0__get_default_creator_id', get_current_user_id());
110
-        $price_type_table = $wpdb->prefix . "esp_price_type";
111
-        $price_table = $wpdb->prefix . "esp_price";
110
+        $price_type_table = $wpdb->prefix."esp_price_type";
111
+        $price_table = $wpdb->prefix."esp_price";
112 112
         if ($this->_get_table_analysis()->tableExists($price_type_table)) {
113
-            $SQL = 'SELECT COUNT(PRT_ID) FROM ' . $price_type_table . ' WHERE PBT_ID=4';//include trashed price types
113
+            $SQL = 'SELECT COUNT(PRT_ID) FROM '.$price_type_table.' WHERE PBT_ID=4'; //include trashed price types
114 114
             $tax_price_type_count = $wpdb->get_var($SQL);
115 115
             if ($tax_price_type_count <= 1) {
116 116
                 $wpdb->insert(
@@ -124,11 +124,11 @@  discard block
 block discarded – undo
124 124
                         'PRT_wp_user'    => $default_creator_id,
125 125
                     ),
126 126
                     array(
127
-                        '%s',//PRT_name
128
-                        '%d',//PBT_id
129
-                        '%d',//PRT_is_percent
130
-                        '%d',//PRT_order
131
-                        '%d',//PRT_deleted
127
+                        '%s', //PRT_name
128
+                        '%d', //PBT_id
129
+                        '%d', //PRT_is_percent
130
+                        '%d', //PRT_order
131
+                        '%d', //PRT_deleted
132 132
                         '%d', //PRT_wp_user
133 133
                     )
134 134
                 );
@@ -144,11 +144,11 @@  discard block
 block discarded – undo
144 144
                         'PRT_wp_user'    => $default_creator_id,
145 145
                     ),
146 146
                     array(
147
-                        '%s',//PRT_name
148
-                        '%d',//PBT_id
149
-                        '%d',//PRT_is_percent
150
-                        '%d',//PRT_order
151
-                        '%d',//PRT_deleted
147
+                        '%s', //PRT_name
148
+                        '%d', //PBT_id
149
+                        '%d', //PRT_is_percent
150
+                        '%d', //PRT_order
151
+                        '%d', //PRT_deleted
152 152
                         '%d' //PRT_wp_user
153 153
                     )
154 154
                 );
@@ -168,15 +168,15 @@  discard block
 block discarded – undo
168 168
                             'PRC_wp_user'    => $default_creator_id,
169 169
                         ),
170 170
                         array(
171
-                            '%d',//PRT_id
172
-                            '%f',//PRC_amount
173
-                            '%s',//PRC_name
174
-                            '%s',//PRC_desc
175
-                            '%d',//PRC_is_default
176
-                            '%d',//PRC_overrides
177
-                            '%d',//PRC_deleted
178
-                            '%d',//PRC_order
179
-                            '%d',//PRC_parent
171
+                            '%d', //PRT_id
172
+                            '%f', //PRC_amount
173
+                            '%s', //PRC_name
174
+                            '%s', //PRC_desc
175
+                            '%d', //PRC_is_default
176
+                            '%d', //PRC_overrides
177
+                            '%d', //PRC_deleted
178
+                            '%d', //PRC_order
179
+                            '%d', //PRC_parent
180 180
                             '%d' //PRC_wp_user
181 181
                         )
182 182
                     );
@@ -196,8 +196,8 @@  discard block
 block discarded – undo
196 196
      */
197 197
     public function caffeinated_modules_to_register($modules_to_register = array())
198 198
     {
199
-        if (is_readable(EE_CAFF_PATH . 'modules')) {
200
-            $caffeinated_modules_to_register = glob(EE_CAFF_PATH . 'modules' . DS . '*', GLOB_ONLYDIR);
199
+        if (is_readable(EE_CAFF_PATH.'modules')) {
200
+            $caffeinated_modules_to_register = glob(EE_CAFF_PATH.'modules'.DS.'*', GLOB_ONLYDIR);
201 201
             if (is_array($caffeinated_modules_to_register) && ! empty($caffeinated_modules_to_register)) {
202 202
                 $modules_to_register = array_merge($modules_to_register, $caffeinated_modules_to_register);
203 203
             }
Please login to merge, or discard this patch.
core/libraries/plugin_api/EE_Register_Capabilities.lib.php 2 patches
Indentation   +175 added lines, -175 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 use EventEspresso\core\services\loaders\LoaderFactory;
11 11
 
12 12
 if (! defined('EVENT_ESPRESSO_VERSION')) {
13
-    exit('No direct script access allowed');
13
+	exit('No direct script access allowed');
14 14
 }
15 15
 
16 16
 /**
@@ -24,189 +24,189 @@  discard block
 block discarded – undo
24 24
 class EE_Register_Capabilities implements EEI_Plugin_API
25 25
 {
26 26
 
27
-    /**
28
-     * Holds the settings for a specific registration.
29
-     *
30
-     * @var array
31
-     */
32
-    protected static $_registry = array();
27
+	/**
28
+	 * Holds the settings for a specific registration.
29
+	 *
30
+	 * @var array
31
+	 */
32
+	protected static $_registry = array();
33 33
 
34 34
 
35
-    /**
36
-     * Used to register capability items with EE core.
37
-     *
38
-     * @since 4.5.0
39
-     * @param string $cap_reference                                                       usually will be a class name
40
-     *                                                                                    that references capability
41
-     *                                                                                    related items setup for
42
-     *                                                                                    something.
43
-     * @param array  $setup_args                                                          {
44
-     *                                                                                    An array of items related to
45
-     *                                                                                    registering capabilities.
46
-     * @type array   $capabilities                                                        An array mapping capability
47
-     *       strings to core WP Role. Something like: array(
48
-     *                                                                                    'administrator'    => array(
49
-     *                                                                                    'read_cap', 'edit_cap',
50
-     *                                                                                    'delete_cap'),
51
-     *                                                                                    'author'                =>
52
-     *                                                                                    array( 'read_cap' )
53
-     *                                                                                    ).
54
-     * @type array   $capability_maps                                                     EE_Meta_Capability_Map[]
55
-     * @see   EE_Capabilities.php for php docs on these objects.
56
-     *                                                                                    Should be indexed by the
57
-     *                                                                                    classname for the capability
58
-     *                                                                                    map and values representing
59
-     *                                                                                    the arguments for the map.
60
-     *                                                                                    }
61
-     * @throws EE_Error
62
-     * @return void
63
-     */
64
-    public static function register($cap_reference = null, $setup_args = array())
65
-    {
66
-        //required fields MUST be present, so let's make sure they are.
67
-        if ($cap_reference === null || ! is_array($setup_args) || empty($setup_args['capabilities'])) {
68
-            throw new EE_Error(
69
-                __('In order to register capabilities with EE_Register_Capabilities::register, you must include a unique name to reference the capabilities being registered, plus an array containing the following keys: "capabilities".',
70
-                    'event_espresso')
71
-            );
72
-        }
73
-        //make sure we don't register twice
74
-        if (isset(self::$_registry[$cap_reference])) {
75
-            return;
76
-        }
77
-        //make sure this is not registered too late or too early.
78
-        if (! did_action('AHEE__EE_System__load_espresso_addons') || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')) {
79
-            EE_Error::doing_it_wrong(__METHOD__,
80
-                sprintf(__('%s has been registered too late.  Please ensure that EE_Register_Capabilities::register has been called at some point before the "AHEE__EE_System___detect_if_activation_or_upgrade__begin" action hook has been called.',
81
-                    'event_espresso'), $cap_reference), '4.5.0');
82
-        }
83
-        //some preliminary sanitization and setting to the $_registry property
84
-        self::$_registry[ $cap_reference ] = array(
85
-            'caps'               => isset($setup_args['capabilities']) && is_array($setup_args['capabilities'])
86
-                ? $setup_args['capabilities']
87
-                : array(),
88
-            'cap_maps'           => isset($setup_args['capability_maps'])
89
-                ? $setup_args['capability_maps']
90
-                : array(),
91
-        );
92
-        //set initial caps (note that EE_Capabilities takes care of making sure that the caps get added only once)
93
-        add_filter(
94
-            'FHEE__EE_Capabilities__addCaps__capabilities_to_add',
95
-            array('EE_Register_Capabilities', 'register_capabilities')
96
-        );
97
-        //add filter for cap maps
98
-        add_filter(
99
-            'FHEE__EE_Capabilities___set_meta_caps__meta_caps',
100
-            array('EE_Register_Capabilities', 'register_cap_maps')
101
-        );
102
-    }
35
+	/**
36
+	 * Used to register capability items with EE core.
37
+	 *
38
+	 * @since 4.5.0
39
+	 * @param string $cap_reference                                                       usually will be a class name
40
+	 *                                                                                    that references capability
41
+	 *                                                                                    related items setup for
42
+	 *                                                                                    something.
43
+	 * @param array  $setup_args                                                          {
44
+	 *                                                                                    An array of items related to
45
+	 *                                                                                    registering capabilities.
46
+	 * @type array   $capabilities                                                        An array mapping capability
47
+	 *       strings to core WP Role. Something like: array(
48
+	 *                                                                                    'administrator'    => array(
49
+	 *                                                                                    'read_cap', 'edit_cap',
50
+	 *                                                                                    'delete_cap'),
51
+	 *                                                                                    'author'                =>
52
+	 *                                                                                    array( 'read_cap' )
53
+	 *                                                                                    ).
54
+	 * @type array   $capability_maps                                                     EE_Meta_Capability_Map[]
55
+	 * @see   EE_Capabilities.php for php docs on these objects.
56
+	 *                                                                                    Should be indexed by the
57
+	 *                                                                                    classname for the capability
58
+	 *                                                                                    map and values representing
59
+	 *                                                                                    the arguments for the map.
60
+	 *                                                                                    }
61
+	 * @throws EE_Error
62
+	 * @return void
63
+	 */
64
+	public static function register($cap_reference = null, $setup_args = array())
65
+	{
66
+		//required fields MUST be present, so let's make sure they are.
67
+		if ($cap_reference === null || ! is_array($setup_args) || empty($setup_args['capabilities'])) {
68
+			throw new EE_Error(
69
+				__('In order to register capabilities with EE_Register_Capabilities::register, you must include a unique name to reference the capabilities being registered, plus an array containing the following keys: "capabilities".',
70
+					'event_espresso')
71
+			);
72
+		}
73
+		//make sure we don't register twice
74
+		if (isset(self::$_registry[$cap_reference])) {
75
+			return;
76
+		}
77
+		//make sure this is not registered too late or too early.
78
+		if (! did_action('AHEE__EE_System__load_espresso_addons') || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')) {
79
+			EE_Error::doing_it_wrong(__METHOD__,
80
+				sprintf(__('%s has been registered too late.  Please ensure that EE_Register_Capabilities::register has been called at some point before the "AHEE__EE_System___detect_if_activation_or_upgrade__begin" action hook has been called.',
81
+					'event_espresso'), $cap_reference), '4.5.0');
82
+		}
83
+		//some preliminary sanitization and setting to the $_registry property
84
+		self::$_registry[ $cap_reference ] = array(
85
+			'caps'               => isset($setup_args['capabilities']) && is_array($setup_args['capabilities'])
86
+				? $setup_args['capabilities']
87
+				: array(),
88
+			'cap_maps'           => isset($setup_args['capability_maps'])
89
+				? $setup_args['capability_maps']
90
+				: array(),
91
+		);
92
+		//set initial caps (note that EE_Capabilities takes care of making sure that the caps get added only once)
93
+		add_filter(
94
+			'FHEE__EE_Capabilities__addCaps__capabilities_to_add',
95
+			array('EE_Register_Capabilities', 'register_capabilities')
96
+		);
97
+		//add filter for cap maps
98
+		add_filter(
99
+			'FHEE__EE_Capabilities___set_meta_caps__meta_caps',
100
+			array('EE_Register_Capabilities', 'register_cap_maps')
101
+		);
102
+	}
103 103
 
104 104
 
105
-    /**
106
-     * callback for FHEE__EE_Capabilities__init_caps_map__caps filter.
107
-     * Takes care of registering additional capabilities to the caps map.   Note, that this also on the initial
108
-     * registration ensures that new capabilities are added to existing roles.
109
-     *
110
-     * @param array $incoming_caps The original caps map.
111
-     * @return array merged in new caps.
112
-     */
113
-    public static function register_capabilities($incoming_caps)
114
-    {
115
-        foreach (self::$_registry as $cap_reference => $caps_and_cap_map) {
116
-            $incoming_caps = array_merge_recursive($incoming_caps, $caps_and_cap_map['caps']);
117
-        }
118
-        return $incoming_caps;
119
-    }
105
+	/**
106
+	 * callback for FHEE__EE_Capabilities__init_caps_map__caps filter.
107
+	 * Takes care of registering additional capabilities to the caps map.   Note, that this also on the initial
108
+	 * registration ensures that new capabilities are added to existing roles.
109
+	 *
110
+	 * @param array $incoming_caps The original caps map.
111
+	 * @return array merged in new caps.
112
+	 */
113
+	public static function register_capabilities($incoming_caps)
114
+	{
115
+		foreach (self::$_registry as $cap_reference => $caps_and_cap_map) {
116
+			$incoming_caps = array_merge_recursive($incoming_caps, $caps_and_cap_map['caps']);
117
+		}
118
+		return $incoming_caps;
119
+	}
120 120
 
121 121
 
122
-    /**
123
-     * Callback for the 'FHEE__EE_Capabilities___set_meta_caps__meta_caps' filter which registers an array of
124
-     * capability maps for the WP meta_caps filter called in EE_Capabilities.
125
-     *
126
-     * @since 4.5.0
127
-     * @param EE_Meta_Capability_Map[] $cap_maps The existing cap maps array.
128
-     * @return EE_Meta_Capability_Map[]
129
-     * @throws EE_Error
130
-     */
131
-    public static function register_cap_maps($cap_maps)
132
-    {
133
-        //loop through and instantiate cap maps.
134
-        foreach (self::$_registry as $cap_reference => $setup) {
135
-            if (! isset($setup['cap_maps'])) {
136
-                continue;
137
-            }
138
-            foreach ($setup['cap_maps'] as $cap_class => $args) {
122
+	/**
123
+	 * Callback for the 'FHEE__EE_Capabilities___set_meta_caps__meta_caps' filter which registers an array of
124
+	 * capability maps for the WP meta_caps filter called in EE_Capabilities.
125
+	 *
126
+	 * @since 4.5.0
127
+	 * @param EE_Meta_Capability_Map[] $cap_maps The existing cap maps array.
128
+	 * @return EE_Meta_Capability_Map[]
129
+	 * @throws EE_Error
130
+	 */
131
+	public static function register_cap_maps($cap_maps)
132
+	{
133
+		//loop through and instantiate cap maps.
134
+		foreach (self::$_registry as $cap_reference => $setup) {
135
+			if (! isset($setup['cap_maps'])) {
136
+				continue;
137
+			}
138
+			foreach ($setup['cap_maps'] as $cap_class => $args) {
139 139
 
140
-                /**
141
-                 * account for cases where capability maps may be indexed
142
-                 * numerically to allow for the same map class to be utilized
143
-                 * In those cases, maps will be setup in an array like:
144
-                 * array(
145
-                 *    0 => array( 'EE_Meta_Capability' => array(
146
-                 *        'ee_edit_cap', array( 'Object_Name',
147
-                 *        'ee_edit_published_cap',
148
-                 *        'ee_edit_others_cap', 'ee_edit_private_cap' )
149
-                 *        ) )
150
-                 *    1 => ...
151
-                 * )
152
-                 * instead of:
153
-                 * array(
154
-                 *    'EE_Meta_Capability' => array(
155
-                 *        'ee_edit_cap', array( 'Object_Name',
156
-                 *        'ee_edit_published_cap',
157
-                 *        'ee_edit_others_cap', 'ee_edit_private_cap' )
158
-                 *        ),
159
-                 *    ...
160
-                 * )
161
-                 */
162
-                if (is_numeric($cap_class)) {
163
-                    $cap_class = key($args);
164
-                    $args      = $args[$cap_class];
165
-                }
140
+				/**
141
+				 * account for cases where capability maps may be indexed
142
+				 * numerically to allow for the same map class to be utilized
143
+				 * In those cases, maps will be setup in an array like:
144
+				 * array(
145
+				 *    0 => array( 'EE_Meta_Capability' => array(
146
+				 *        'ee_edit_cap', array( 'Object_Name',
147
+				 *        'ee_edit_published_cap',
148
+				 *        'ee_edit_others_cap', 'ee_edit_private_cap' )
149
+				 *        ) )
150
+				 *    1 => ...
151
+				 * )
152
+				 * instead of:
153
+				 * array(
154
+				 *    'EE_Meta_Capability' => array(
155
+				 *        'ee_edit_cap', array( 'Object_Name',
156
+				 *        'ee_edit_published_cap',
157
+				 *        'ee_edit_others_cap', 'ee_edit_private_cap' )
158
+				 *        ),
159
+				 *    ...
160
+				 * )
161
+				 */
162
+				if (is_numeric($cap_class)) {
163
+					$cap_class = key($args);
164
+					$args      = $args[$cap_class];
165
+				}
166 166
 
167
-                if (! class_exists($cap_class)) {
168
-                    throw new EE_Error(sprintf(__('An addon (%s) has tried to register a capability map improperly.  Capability map arrays must be indexed by capability map classname, and an array for the class arguments',
169
-                        'event_espresso'), $cap_reference));
170
-                }
167
+				if (! class_exists($cap_class)) {
168
+					throw new EE_Error(sprintf(__('An addon (%s) has tried to register a capability map improperly.  Capability map arrays must be indexed by capability map classname, and an array for the class arguments',
169
+						'event_espresso'), $cap_reference));
170
+				}
171 171
 
172
-                if (count($args) !== 2) {
173
-                    throw new EE_Error(sprintf(__('An addon (%s) has tried to register a capability map improperly.  Capability map arrays must be indexed by capability map classname, and an array for the class arguments.  The array should have two values the first being a string and the second an array.',
174
-                        'event_espresso'), $cap_reference));
175
-                }
176
-                $cap_maps[] = new $cap_class($args[0], $args[1]);
177
-            }
178
-        }
179
-        return $cap_maps;
180
-    }
172
+				if (count($args) !== 2) {
173
+					throw new EE_Error(sprintf(__('An addon (%s) has tried to register a capability map improperly.  Capability map arrays must be indexed by capability map classname, and an array for the class arguments.  The array should have two values the first being a string and the second an array.',
174
+						'event_espresso'), $cap_reference));
175
+				}
176
+				$cap_maps[] = new $cap_class($args[0], $args[1]);
177
+			}
178
+		}
179
+		return $cap_maps;
180
+	}
181 181
 
182 182
 
183
-    /**
184
-     * @param string $cap_reference
185
-     * @throws EE_Error
186
-     * @throws \InvalidArgumentException
187
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
188
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
189
-     */
190
-    public static function deregister($cap_reference = '')
191
-    {
192
-        if (! empty(self::$_registry[$cap_reference])) {
193
-            if (! empty(self::$_registry[ $cap_reference ]['caps'])) {
194
-                //if it's too early to remove capabilities, wait to do this until core is loaded and ready
195
-                $caps_to_remove = self::$_registry[ $cap_reference ]['caps'];
196
-                if (did_action('AHEE__EE_System__core_loaded_and_ready')) {
197
-                    $capabilities = LoaderFactory::getLoader()->getShared('EE_Capabilities');
198
-                    $capabilities->removeCaps($caps_to_remove);
199
-                } else {
200
-                    add_action(
201
-                        'AHEE__EE_System__core_loaded_and_ready',
202
-                        function () use ($caps_to_remove) {
203
-                            $capabilities = LoaderFactory::getLoader()->getShared('EE_Capabilities');
204
-                            $capabilities->removeCaps($caps_to_remove);
205
-                        }
206
-                    );
207
-                }
208
-            }
209
-            unset(self::$_registry[$cap_reference]);
210
-        }
211
-    }
183
+	/**
184
+	 * @param string $cap_reference
185
+	 * @throws EE_Error
186
+	 * @throws \InvalidArgumentException
187
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
188
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
189
+	 */
190
+	public static function deregister($cap_reference = '')
191
+	{
192
+		if (! empty(self::$_registry[$cap_reference])) {
193
+			if (! empty(self::$_registry[ $cap_reference ]['caps'])) {
194
+				//if it's too early to remove capabilities, wait to do this until core is loaded and ready
195
+				$caps_to_remove = self::$_registry[ $cap_reference ]['caps'];
196
+				if (did_action('AHEE__EE_System__core_loaded_and_ready')) {
197
+					$capabilities = LoaderFactory::getLoader()->getShared('EE_Capabilities');
198
+					$capabilities->removeCaps($caps_to_remove);
199
+				} else {
200
+					add_action(
201
+						'AHEE__EE_System__core_loaded_and_ready',
202
+						function () use ($caps_to_remove) {
203
+							$capabilities = LoaderFactory::getLoader()->getShared('EE_Capabilities');
204
+							$capabilities->removeCaps($caps_to_remove);
205
+						}
206
+					);
207
+				}
208
+			}
209
+			unset(self::$_registry[$cap_reference]);
210
+		}
211
+	}
212 212
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -9,7 +9,7 @@  discard block
 block discarded – undo
9 9
 
10 10
 use EventEspresso\core\services\loaders\LoaderFactory;
11 11
 
12
-if (! defined('EVENT_ESPRESSO_VERSION')) {
12
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
13 13
     exit('No direct script access allowed');
14 14
 }
15 15
 
@@ -75,13 +75,13 @@  discard block
 block discarded – undo
75 75
             return;
76 76
         }
77 77
         //make sure this is not registered too late or too early.
78
-        if (! did_action('AHEE__EE_System__load_espresso_addons') || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')) {
78
+        if ( ! did_action('AHEE__EE_System__load_espresso_addons') || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')) {
79 79
             EE_Error::doing_it_wrong(__METHOD__,
80 80
                 sprintf(__('%s has been registered too late.  Please ensure that EE_Register_Capabilities::register has been called at some point before the "AHEE__EE_System___detect_if_activation_or_upgrade__begin" action hook has been called.',
81 81
                     'event_espresso'), $cap_reference), '4.5.0');
82 82
         }
83 83
         //some preliminary sanitization and setting to the $_registry property
84
-        self::$_registry[ $cap_reference ] = array(
84
+        self::$_registry[$cap_reference] = array(
85 85
             'caps'               => isset($setup_args['capabilities']) && is_array($setup_args['capabilities'])
86 86
                 ? $setup_args['capabilities']
87 87
                 : array(),
@@ -132,7 +132,7 @@  discard block
 block discarded – undo
132 132
     {
133 133
         //loop through and instantiate cap maps.
134 134
         foreach (self::$_registry as $cap_reference => $setup) {
135
-            if (! isset($setup['cap_maps'])) {
135
+            if ( ! isset($setup['cap_maps'])) {
136 136
                 continue;
137 137
             }
138 138
             foreach ($setup['cap_maps'] as $cap_class => $args) {
@@ -164,7 +164,7 @@  discard block
 block discarded – undo
164 164
                     $args      = $args[$cap_class];
165 165
                 }
166 166
 
167
-                if (! class_exists($cap_class)) {
167
+                if ( ! class_exists($cap_class)) {
168 168
                     throw new EE_Error(sprintf(__('An addon (%s) has tried to register a capability map improperly.  Capability map arrays must be indexed by capability map classname, and an array for the class arguments',
169 169
                         'event_espresso'), $cap_reference));
170 170
                 }
@@ -189,17 +189,17 @@  discard block
 block discarded – undo
189 189
      */
190 190
     public static function deregister($cap_reference = '')
191 191
     {
192
-        if (! empty(self::$_registry[$cap_reference])) {
193
-            if (! empty(self::$_registry[ $cap_reference ]['caps'])) {
192
+        if ( ! empty(self::$_registry[$cap_reference])) {
193
+            if ( ! empty(self::$_registry[$cap_reference]['caps'])) {
194 194
                 //if it's too early to remove capabilities, wait to do this until core is loaded and ready
195
-                $caps_to_remove = self::$_registry[ $cap_reference ]['caps'];
195
+                $caps_to_remove = self::$_registry[$cap_reference]['caps'];
196 196
                 if (did_action('AHEE__EE_System__core_loaded_and_ready')) {
197 197
                     $capabilities = LoaderFactory::getLoader()->getShared('EE_Capabilities');
198 198
                     $capabilities->removeCaps($caps_to_remove);
199 199
                 } else {
200 200
                     add_action(
201 201
                         'AHEE__EE_System__core_loaded_and_ready',
202
-                        function () use ($caps_to_remove) {
202
+                        function() use ($caps_to_remove) {
203 203
                             $capabilities = LoaderFactory::getLoader()->getShared('EE_Capabilities');
204 204
                             $capabilities->removeCaps($caps_to_remove);
205 205
                         }
Please login to merge, or discard this patch.
core/helpers/EEH_Line_Item.helper.php 3 patches
Doc Comments   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -874,7 +874,7 @@  discard block
 block discarded – undo
874 874
      * Deletes ALL children of the passed line item
875 875
      *
876 876
      * @param EE_Line_Item $parent_line_item
877
-     * @return bool
877
+     * @return integer
878 878
      * @throws \EE_Error
879 879
      */
880 880
     public static function delete_all_child_items(EE_Line_Item $parent_line_item)
@@ -1138,6 +1138,7 @@  discard block
 block discarded – undo
1138 1138
      * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1139 1139
      * @param string $line_item_type one of the EEM_Line_Item constants
1140 1140
      * @param string | NULL $obj_type object model class name (minus prefix) or NULL to ignore object type when searching
1141
+     * @param string $obj_type
1141 1142
      * @return EE_Line_Item[]
1142 1143
      */
1143 1144
     protected static function _get_descendants_by_type_and_object_type(
Please login to merge, or discard this patch.
Indentation   +1701 added lines, -1701 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if (!defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 
5 5
 /**
@@ -23,1706 +23,1706 @@  discard block
 block discarded – undo
23 23
 class EEH_Line_Item
24 24
 {
25 25
 
26
-    //other functions: cancel ticket purchase
27
-    //delete ticket purchase
28
-    //add promotion
29
-
30
-
31
-    /**
32
-     * Adds a simple item ( unrelated to any other model object) to the total line item
33
-     * in the correct spot in the line item tree (also verifying it doesn't add a duplicate based on the LIN_code)
34
-     * beneath the pre-tax-total (alongside event subtotals).
35
-     * Automatically re-calculates the line item totals and updates the related transaction. But
36
-     * DOES NOT automatically upgrade the transaction's registrations' final prices (which
37
-     * should probably change because of this).
38
-     * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
39
-     * after using this, to keep the registration final prices in-sync with the transaction's total.
40
-     *
41
-     * @param EE_Line_Item $parent_line_item
42
-     * @param string $name
43
-     * @param float $unit_price
44
-     * @param string $description
45
-     * @param int $quantity
46
-     * @param boolean $taxable
47
-     * @param boolean $code if set to a value, ensures there is only one line item with that code
48
-     * @return boolean success
49
-     * @throws \EE_Error
50
-     */
51
-    public static function add_unrelated_item(EE_Line_Item $parent_line_item, $name, $unit_price, $description = '', $quantity = 1, $taxable = FALSE, $code = NULL)
52
-    {
53
-        $items_subtotal = self::get_pre_tax_subtotal($parent_line_item);
54
-        $line_item = EE_Line_Item::new_instance(array(
55
-            'LIN_name' => $name,
56
-            'LIN_desc' => $description,
57
-            'LIN_unit_price' => $unit_price,
58
-            'LIN_quantity' => $quantity,
59
-            'LIN_percent' => null,
60
-            'LIN_is_taxable' => $taxable,
61
-            'LIN_order' => $items_subtotal instanceof EE_Line_Item ? count($items_subtotal->children()) : 0,
62
-            'LIN_total' => (float)$unit_price * (int)$quantity,
63
-            'LIN_type' => EEM_Line_Item::type_line_item,
64
-            'LIN_code' => $code,
65
-        ));
66
-        $line_item = apply_filters(
67
-            'FHEE__EEH_Line_Item__add_unrelated_item__line_item',
68
-            $line_item,
69
-            $parent_line_item
70
-        );
71
-        return self::add_item($parent_line_item, $line_item);
72
-    }
73
-
74
-
75
-    /**
76
-     * Adds a simple item ( unrelated to any other model object) to the total line item,
77
-     * in the correct spot in the line item tree. Automatically
78
-     * re-calculates the line item totals and updates the related transaction. But
79
-     * DOES NOT automatically upgrade the transaction's registrations' final prices (which
80
-     * should probably change because of this).
81
-     * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
82
-     * after using this, to keep the registration final prices in-sync with the transaction's total.
83
-     *
84
-     * @param EE_Line_Item $parent_line_item
85
-     * @param string $name
86
-     * @param float $percentage_amount
87
-     * @param string $description
88
-     * @param boolean $taxable
89
-     * @return boolean success
90
-     * @throws \EE_Error
91
-     */
92
-    public static function add_percentage_based_item(EE_Line_Item $parent_line_item, $name, $percentage_amount, $description = '', $taxable = FALSE)
93
-    {
94
-        $line_item = EE_Line_Item::new_instance(array(
95
-            'LIN_name' => $name,
96
-            'LIN_desc' => $description,
97
-            'LIN_unit_price' => 0,
98
-            'LIN_percent' => $percentage_amount,
99
-            'LIN_quantity' => NULL,
100
-            'LIN_is_taxable' => $taxable,
101
-            'LIN_total' => (float)($percentage_amount * ($parent_line_item->total() / 100)),
102
-            'LIN_type' => EEM_Line_Item::type_line_item,
103
-            'LIN_parent' => $parent_line_item->ID()
104
-        ));
105
-        $line_item = apply_filters(
106
-            'FHEE__EEH_Line_Item__add_percentage_based_item__line_item',
107
-            $line_item
108
-        );
109
-        return $parent_line_item->add_child_line_item($line_item, false);
110
-    }
111
-
112
-
113
-    /**
114
-     * Returns the new line item created by adding a purchase of the ticket
115
-     * ensures that ticket line item is saved, and that cart total has been recalculated.
116
-     * If this ticket has already been purchased, just increments its count.
117
-     * Automatically re-calculates the line item totals and updates the related transaction. But
118
-     * DOES NOT automatically upgrade the transaction's registrations' final prices (which
119
-     * should probably change because of this).
120
-     * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
121
-     * after using this, to keep the registration final prices in-sync with the transaction's total.
122
-     *
123
-     * @param EE_Line_Item $total_line_item grand total line item of type EEM_Line_Item::type_total
124
-     * @param EE_Ticket $ticket
125
-     * @param int $qty
126
-     * @return \EE_Line_Item
127
-     * @throws \EE_Error
128
-     */
129
-    public static function add_ticket_purchase(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
130
-    {
131
-        if (!$total_line_item instanceof EE_Line_Item || !$total_line_item->is_total()) {
132
-            throw new EE_Error(sprintf(__('A valid line item total is required in order to add tickets. A line item of type "%s" was passed.', 'event_espresso'), $ticket->ID(), $total_line_item->ID()));
133
-        }
134
-        // either increment the qty for an existing ticket
135
-        $line_item = self::increment_ticket_qty_if_already_in_cart($total_line_item, $ticket, $qty);
136
-        // or add a new one
137
-        if (!$line_item instanceof EE_Line_Item) {
138
-            $line_item = self::create_ticket_line_item($total_line_item, $ticket, $qty);
139
-        }
140
-        $total_line_item->recalculate_total_including_taxes();
141
-        return $line_item;
142
-    }
143
-
144
-
145
-    /**
146
-     * Returns the new line item created by adding a purchase of the ticket
147
-     * @param \EE_Line_Item $total_line_item
148
-     * @param EE_Ticket $ticket
149
-     * @param int $qty
150
-     * @return \EE_Line_Item
151
-     * @throws \EE_Error
152
-     */
153
-    public static function increment_ticket_qty_if_already_in_cart(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
154
-    {
155
-        $line_item = null;
156
-        if ($total_line_item instanceof EE_Line_Item && $total_line_item->is_total()) {
157
-            $ticket_line_items = EEH_Line_Item::get_ticket_line_items($total_line_item);
158
-            foreach ((array)$ticket_line_items as $ticket_line_item) {
159
-                if (
160
-                    $ticket_line_item instanceof EE_Line_Item
161
-                    && (int)$ticket_line_item->OBJ_ID() === (int)$ticket->ID()
162
-                ) {
163
-                    $line_item = $ticket_line_item;
164
-                    break;
165
-                }
166
-            }
167
-        }
168
-        if ($line_item instanceof EE_Line_Item) {
169
-            EEH_Line_Item::increment_quantity($line_item, $qty);
170
-            return $line_item;
171
-        }
172
-        return null;
173
-    }
174
-
175
-
176
-    /**
177
-     * Increments the line item and all its children's quantity by $qty (but percent line items are unaffected).
178
-     * Does NOT save or recalculate other line items totals
179
-     *
180
-     * @param EE_Line_Item $line_item
181
-     * @param int $qty
182
-     * @return void
183
-     * @throws \EE_Error
184
-     */
185
-    public static function increment_quantity(EE_Line_Item $line_item, $qty = 1)
186
-    {
187
-        if (!$line_item->is_percent()) {
188
-            $qty += $line_item->quantity();
189
-            $line_item->set_quantity($qty);
190
-            $line_item->set_total($line_item->unit_price() * $qty);
191
-            $line_item->save();
192
-        }
193
-        foreach ($line_item->children() as $child) {
194
-            if ($child->is_sub_line_item()) {
195
-                EEH_Line_Item::update_quantity($child, $qty);
196
-            }
197
-        }
198
-    }
199
-
200
-
201
-    /**
202
-     * Decrements the line item and all its children's quantity by $qty (but percent line items are unaffected).
203
-     * Does NOT save or recalculate other line items totals
204
-     *
205
-     * @param EE_Line_Item $line_item
206
-     * @param int $qty
207
-     * @return void
208
-     * @throws \EE_Error
209
-     */
210
-    public static function decrement_quantity(EE_Line_Item $line_item, $qty = 1)
211
-    {
212
-        if (!$line_item->is_percent()) {
213
-            $qty = $line_item->quantity() - $qty;
214
-            $qty = max($qty, 0);
215
-            $line_item->set_quantity($qty);
216
-            $line_item->set_total($line_item->unit_price() * $qty);
217
-            $line_item->save();
218
-        }
219
-        foreach ($line_item->children() as $child) {
220
-            if ($child->is_sub_line_item()) {
221
-                EEH_Line_Item::update_quantity($child, $qty);
222
-            }
223
-        }
224
-    }
225
-
226
-
227
-    /**
228
-     * Updates the line item and its children's quantities to the specified number.
229
-     * Does NOT save them or recalculate totals.
230
-     *
231
-     * @param EE_Line_Item $line_item
232
-     * @param int $new_quantity
233
-     * @throws \EE_Error
234
-     */
235
-    public static function update_quantity(EE_Line_Item $line_item, $new_quantity)
236
-    {
237
-        if (!$line_item->is_percent()) {
238
-            $line_item->set_quantity($new_quantity);
239
-            $line_item->set_total($line_item->unit_price() * $new_quantity);
240
-            $line_item->save();
241
-        }
242
-        foreach ($line_item->children() as $child) {
243
-            if ($child->is_sub_line_item()) {
244
-                EEH_Line_Item::update_quantity($child, $new_quantity);
245
-            }
246
-        }
247
-    }
248
-
249
-
250
-    /**
251
-     * Returns the new line item created by adding a purchase of the ticket
252
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
253
-     * @param EE_Ticket $ticket
254
-     * @param int $qty
255
-     * @return \EE_Line_Item
256
-     * @throws \EE_Error
257
-     */
258
-    public static function create_ticket_line_item(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
259
-    {
260
-        $datetimes = $ticket->datetimes();
261
-        $first_datetime = reset($datetimes);
262
-        if ($first_datetime instanceof EE_Datetime && $first_datetime->event() instanceof EE_Event) {
263
-            $first_datetime_name = $first_datetime->event()->name();
264
-        } else {
265
-            $first_datetime_name = __('Event', 'event_espresso');
266
-        }
267
-        $event = sprintf(_x('(For %1$s)', '(For Event Name)', 'event_espresso'), $first_datetime_name);
268
-        // get event subtotal line
269
-        $events_sub_total = self::get_event_line_item_for_ticket($total_line_item, $ticket);
270
-        // add $ticket to cart
271
-        $line_item = EE_Line_Item::new_instance(array(
272
-            'LIN_name' => $ticket->name(),
273
-            'LIN_desc' => $ticket->description() !== '' ? $ticket->description() . ' ' . $event : $event,
274
-            'LIN_unit_price' => $ticket->price(),
275
-            'LIN_quantity' => $qty,
276
-            'LIN_is_taxable' => $ticket->taxable(),
277
-            'LIN_order' => count($events_sub_total->children()),
278
-            'LIN_total' => $ticket->price() * $qty,
279
-            'LIN_type' => EEM_Line_Item::type_line_item,
280
-            'OBJ_ID' => $ticket->ID(),
281
-            'OBJ_type' => 'Ticket'
282
-        ));
283
-        $line_item = apply_filters(
284
-            'FHEE__EEH_Line_Item__create_ticket_line_item__line_item',
285
-            $line_item
286
-        );
287
-        $events_sub_total->add_child_line_item($line_item);
288
-        //now add the sub-line items
289
-        $running_total_for_ticket = 0;
290
-        foreach ($ticket->prices(array('order_by' => array('PRC_order' => 'ASC'))) as $price) {
291
-            $sign = $price->is_discount() ? -1 : 1;
292
-            $price_total = $price->is_percent()
293
-                ? $running_total_for_ticket * $price->amount() / 100
294
-                : $price->amount() * $qty;
295
-            $sub_line_item = EE_Line_Item::new_instance(array(
296
-                'LIN_name' => $price->name(),
297
-                'LIN_desc' => $price->desc(),
298
-                'LIN_quantity' => $price->is_percent() ? null : $qty,
299
-                'LIN_is_taxable' => false,
300
-                'LIN_order' => $price->order(),
301
-                'LIN_total' => $sign * $price_total,
302
-                'LIN_type' => EEM_Line_Item::type_sub_line_item,
303
-                'OBJ_ID' => $price->ID(),
304
-                'OBJ_type' => 'Price'
305
-            ));
306
-            $sub_line_item = apply_filters(
307
-                'FHEE__EEH_Line_Item__create_ticket_line_item__sub_line_item',
308
-                $sub_line_item
309
-            );
310
-            if ($price->is_percent()) {
311
-                $sub_line_item->set_percent($sign * $price->amount());
312
-            } else {
313
-                $sub_line_item->set_unit_price($sign * $price->amount());
314
-            }
315
-            $running_total_for_ticket += $price_total;
316
-            $line_item->add_child_line_item($sub_line_item);
317
-        }
318
-        return $line_item;
319
-    }
320
-
321
-
322
-    /**
323
-     * Adds the specified item under the pre-tax-sub-total line item. Automatically
324
-     * re-calculates the line item totals and updates the related transaction. But
325
-     * DOES NOT automatically upgrade the transaction's registrations' final prices (which
326
-     * should probably change because of this).
327
-     * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
328
-     * after using this, to keep the registration final prices in-sync with the transaction's total.
329
-     *
330
-     * @param EE_Line_Item $total_line_item
331
-     * @param EE_Line_Item $item to be added
332
-     * @return boolean
333
-     * @throws \EE_Error
334
-     */
335
-    public static function add_item(EE_Line_Item $total_line_item, EE_Line_Item $item)
336
-    {
337
-        $pre_tax_subtotal = self::get_pre_tax_subtotal($total_line_item);
338
-        if ($pre_tax_subtotal instanceof EE_Line_Item) {
339
-            $success = $pre_tax_subtotal->add_child_line_item($item);
340
-        } else {
341
-            return FALSE;
342
-        }
343
-        $total_line_item->recalculate_total_including_taxes();
344
-        return $success;
345
-    }
346
-
347
-
348
-    /**
349
-     * cancels an existing ticket line item,
350
-     * by decrementing it's quantity by 1 and adding a new "type_cancellation" sub-line-item.
351
-     * ALL totals and subtotals will NEED TO BE UPDATED after performing this action
352
-     *
353
-     * @param EE_Line_Item $ticket_line_item
354
-     * @param int $qty
355
-     * @return bool success
356
-     * @throws \EE_Error
357
-     */
358
-    public static function cancel_ticket_line_item(EE_Line_Item $ticket_line_item, $qty = 1)
359
-    {
360
-        // validate incoming line_item
361
-        if ($ticket_line_item->OBJ_type() !== 'Ticket') {
362
-            throw new EE_Error(
363
-                sprintf(
364
-                    __('The supplied line item must have an Object Type of "Ticket", not %1$s.', 'event_espresso'),
365
-                    $ticket_line_item->type()
366
-                )
367
-            );
368
-        }
369
-        if ($ticket_line_item->quantity() < $qty) {
370
-            throw new EE_Error(
371
-                sprintf(
372
-                    __('Can not cancel %1$d ticket(s) because the supplied line item has a quantity of %2$d.', 'event_espresso'),
373
-                    $qty,
374
-                    $ticket_line_item->quantity()
375
-                )
376
-            );
377
-        }
378
-        // decrement ticket quantity; don't rely on auto-fixing when recalculating totals to do this
379
-        $ticket_line_item->set_quantity($ticket_line_item->quantity() - $qty);
380
-        foreach ($ticket_line_item->children() as $child_line_item) {
381
-            if (
382
-                $child_line_item->is_sub_line_item()
383
-                && !$child_line_item->is_percent()
384
-                && !$child_line_item->is_cancellation()
385
-            ) {
386
-                $child_line_item->set_quantity($child_line_item->quantity() - $qty);
387
-            }
388
-        }
389
-        // get cancellation sub line item
390
-        $cancellation_line_item = EEH_Line_Item::get_descendants_of_type(
391
-            $ticket_line_item,
392
-            EEM_Line_Item::type_cancellation
393
-        );
394
-        $cancellation_line_item = reset($cancellation_line_item);
395
-        // verify that this ticket was indeed previously cancelled
396
-        if ($cancellation_line_item instanceof EE_Line_Item) {
397
-            // increment cancelled quantity
398
-            $cancellation_line_item->set_quantity($cancellation_line_item->quantity() + $qty);
399
-        } else {
400
-            // create cancellation sub line item
401
-            $cancellation_line_item = EE_Line_Item::new_instance(array(
402
-                'LIN_name' => __('Cancellation', 'event_espresso'),
403
-                'LIN_desc' => sprintf(
404
-                    _x('Cancelled %1$s : %2$s', 'Cancelled Ticket Name : 2015-01-01 11:11', 'event_espresso'),
405
-                    $ticket_line_item->name(),
406
-                    current_time(get_option('date_format') . ' ' . get_option('time_format'))
407
-                ),
408
-                'LIN_unit_price' => 0, // $ticket_line_item->unit_price()
409
-                'LIN_quantity' => $qty,
410
-                'LIN_is_taxable' => $ticket_line_item->is_taxable(),
411
-                'LIN_order' => count($ticket_line_item->children()),
412
-                'LIN_total' => 0, // $ticket_line_item->unit_price()
413
-                'LIN_type' => EEM_Line_Item::type_cancellation,
414
-            ));
415
-            $ticket_line_item->add_child_line_item($cancellation_line_item);
416
-        }
417
-        if ($ticket_line_item->save_this_and_descendants() > 0) {
418
-            // decrement parent line item quantity
419
-            $event_line_item = $ticket_line_item->parent();
420
-            if ($event_line_item instanceof EE_Line_Item && $event_line_item->OBJ_type() === 'Event') {
421
-                $event_line_item->set_quantity($event_line_item->quantity() - $qty);
422
-                $event_line_item->save();
423
-            }
424
-            EEH_Line_Item::get_grand_total_and_recalculate_everything($ticket_line_item);
425
-            return true;
426
-        }
427
-        return false;
428
-    }
429
-
430
-
431
-    /**
432
-     * reinstates (un-cancels?) a previously canceled ticket line item,
433
-     * by incrementing it's quantity by 1, and decrementing it's "type_cancellation" sub-line-item.
434
-     * ALL totals and subtotals will NEED TO BE UPDATED after performing this action
435
-     *
436
-     * @param EE_Line_Item $ticket_line_item
437
-     * @param int $qty
438
-     * @return bool success
439
-     * @throws \EE_Error
440
-     */
441
-    public static function reinstate_canceled_ticket_line_item(EE_Line_Item $ticket_line_item, $qty = 1)
442
-    {
443
-        // validate incoming line_item
444
-        if ($ticket_line_item->OBJ_type() !== 'Ticket') {
445
-            throw new EE_Error(
446
-                sprintf(
447
-                    __('The supplied line item must have an Object Type of "Ticket", not %1$s.', 'event_espresso'),
448
-                    $ticket_line_item->type()
449
-                )
450
-            );
451
-        }
452
-        // get cancellation sub line item
453
-        $cancellation_line_item = EEH_Line_Item::get_descendants_of_type(
454
-            $ticket_line_item,
455
-            EEM_Line_Item::type_cancellation
456
-        );
457
-        $cancellation_line_item = reset($cancellation_line_item);
458
-        // verify that this ticket was indeed previously cancelled
459
-        if (!$cancellation_line_item instanceof EE_Line_Item) {
460
-            return false;
461
-        }
462
-        if ($cancellation_line_item->quantity() > $qty) {
463
-            // decrement cancelled quantity
464
-            $cancellation_line_item->set_quantity($cancellation_line_item->quantity() - $qty);
465
-        } else if ($cancellation_line_item->quantity() == $qty) {
466
-            // decrement cancelled quantity in case anyone still has the object kicking around
467
-            $cancellation_line_item->set_quantity($cancellation_line_item->quantity() - $qty);
468
-            // delete because quantity will end up as 0
469
-            $cancellation_line_item->delete();
470
-            // and attempt to destroy the object,
471
-            // even though PHP won't actually destroy it until it needs the memory
472
-            unset($cancellation_line_item);
473
-        } else {
474
-            // what ?!?! negative quantity ?!?!
475
-            throw new EE_Error(
476
-                sprintf(
477
-                    __('Can not reinstate %1$d cancelled ticket(s) because the cancelled ticket quantity is only %2$d.',
478
-                        'event_espresso'),
479
-                    $qty,
480
-                    $cancellation_line_item->quantity()
481
-                )
482
-            );
483
-        }
484
-        // increment ticket quantity
485
-        $ticket_line_item->set_quantity($ticket_line_item->quantity() + $qty);
486
-        if ($ticket_line_item->save_this_and_descendants() > 0) {
487
-            // increment parent line item quantity
488
-            $event_line_item = $ticket_line_item->parent();
489
-            if ($event_line_item instanceof EE_Line_Item && $event_line_item->OBJ_type() === 'Event') {
490
-                $event_line_item->set_quantity($event_line_item->quantity() + $qty);
491
-            }
492
-            EEH_Line_Item::get_grand_total_and_recalculate_everything($ticket_line_item);
493
-            return true;
494
-        }
495
-        return false;
496
-    }
497
-
498
-
499
-    /**
500
-     * calls EEH_Line_Item::find_transaction_grand_total_for_line_item()
501
-     * then EE_Line_Item::recalculate_total_including_taxes() on the result
502
-     *
503
-     * @param EE_Line_Item $line_item
504
-     * @return \EE_Line_Item
505
-     */
506
-    public static function get_grand_total_and_recalculate_everything(EE_Line_Item $line_item)
507
-    {
508
-        $grand_total_line_item = EEH_Line_Item::find_transaction_grand_total_for_line_item($line_item);
509
-        return $grand_total_line_item->recalculate_total_including_taxes();
510
-    }
511
-
512
-
513
-    /**
514
-     * Gets the line item which contains the subtotal of all the items
515
-     *
516
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
517
-     * @return \EE_Line_Item
518
-     * @throws \EE_Error
519
-     */
520
-    public static function get_pre_tax_subtotal(EE_Line_Item $total_line_item)
521
-    {
522
-        $pre_tax_subtotal = $total_line_item->get_child_line_item('pre-tax-subtotal');
523
-        return $pre_tax_subtotal instanceof EE_Line_Item
524
-            ? $pre_tax_subtotal
525
-            : self::create_pre_tax_subtotal($total_line_item);
526
-    }
527
-
528
-
529
-    /**
530
-     * Gets the line item for the taxes subtotal
531
-     *
532
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
533
-     * @return \EE_Line_Item
534
-     * @throws \EE_Error
535
-     */
536
-    public static function get_taxes_subtotal(EE_Line_Item $total_line_item)
537
-    {
538
-        $taxes = $total_line_item->get_child_line_item('taxes');
539
-        return $taxes ? $taxes : self::create_taxes_subtotal($total_line_item);
540
-    }
541
-
542
-
543
-    /**
544
-     * sets the TXN ID on an EE_Line_Item if passed a valid EE_Transaction object
545
-     *
546
-     * @param EE_Line_Item $line_item
547
-     * @param EE_Transaction $transaction
548
-     * @return void
549
-     * @throws \EE_Error
550
-     */
551
-    public static function set_TXN_ID(EE_Line_Item $line_item, $transaction = NULL)
552
-    {
553
-        if ($transaction) {
554
-            /** @type EEM_Transaction $EEM_Transaction */
555
-            $EEM_Transaction = EE_Registry::instance()->load_model('Transaction');
556
-            $TXN_ID = $EEM_Transaction->ensure_is_ID($transaction);
557
-            $line_item->set_TXN_ID($TXN_ID);
558
-        }
559
-    }
560
-
561
-
562
-    /**
563
-     * Creates a new default total line item for the transaction,
564
-     * and its tickets subtotal and taxes subtotal line items (and adds the
565
-     * existing taxes as children of the taxes subtotal line item)
566
-     *
567
-     * @param EE_Transaction $transaction
568
-     * @return \EE_Line_Item of type total
569
-     * @throws \EE_Error
570
-     */
571
-    public static function create_total_line_item($transaction = NULL)
572
-    {
573
-        $total_line_item = EE_Line_Item::new_instance(array(
574
-            'LIN_code' => 'total',
575
-            'LIN_name' => __('Grand Total', 'event_espresso'),
576
-            'LIN_type' => EEM_Line_Item::type_total,
577
-            'OBJ_type' => 'Transaction'
578
-        ));
579
-        $total_line_item = apply_filters(
580
-            'FHEE__EEH_Line_Item__create_total_line_item__total_line_item',
581
-            $total_line_item
582
-        );
583
-        self::set_TXN_ID($total_line_item, $transaction);
584
-        self::create_pre_tax_subtotal($total_line_item, $transaction);
585
-        self::create_taxes_subtotal($total_line_item, $transaction);
586
-        return $total_line_item;
587
-    }
588
-
589
-
590
-    /**
591
-     * Creates a default items subtotal line item
592
-     *
593
-     * @param EE_Line_Item $total_line_item
594
-     * @param EE_Transaction $transaction
595
-     * @return EE_Line_Item
596
-     * @throws \EE_Error
597
-     */
598
-    protected static function create_pre_tax_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
599
-    {
600
-        $pre_tax_line_item = EE_Line_Item::new_instance(array(
601
-            'LIN_code' => 'pre-tax-subtotal',
602
-            'LIN_name' => __('Pre-Tax Subtotal', 'event_espresso'),
603
-            'LIN_type' => EEM_Line_Item::type_sub_total
604
-        ));
605
-        $pre_tax_line_item = apply_filters(
606
-            'FHEE__EEH_Line_Item__create_pre_tax_subtotal__pre_tax_line_item',
607
-            $pre_tax_line_item
608
-        );
609
-        self::set_TXN_ID($pre_tax_line_item, $transaction);
610
-        $total_line_item->add_child_line_item($pre_tax_line_item);
611
-        self::create_event_subtotal($pre_tax_line_item, $transaction);
612
-        return $pre_tax_line_item;
613
-    }
614
-
615
-
616
-    /**
617
-     * Creates a line item for the taxes subtotal and finds all the tax prices
618
-     * and applies taxes to it
619
-     *
620
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
621
-     * @param EE_Transaction $transaction
622
-     * @return EE_Line_Item
623
-     * @throws \EE_Error
624
-     */
625
-    protected static function create_taxes_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
626
-    {
627
-        $tax_line_item = EE_Line_Item::new_instance(array(
628
-            'LIN_code' => 'taxes',
629
-            'LIN_name' => __('Taxes', 'event_espresso'),
630
-            'LIN_type' => EEM_Line_Item::type_tax_sub_total,
631
-            'LIN_order' => 1000,//this should always come last
632
-        ));
633
-        $tax_line_item = apply_filters(
634
-            'FHEE__EEH_Line_Item__create_taxes_subtotal__tax_line_item',
635
-            $tax_line_item
636
-        );
637
-        self::set_TXN_ID($tax_line_item, $transaction);
638
-        $total_line_item->add_child_line_item($tax_line_item);
639
-        //and lastly, add the actual taxes
640
-        self::apply_taxes($total_line_item);
641
-        return $tax_line_item;
642
-    }
643
-
644
-
645
-    /**
646
-     * Creates a default items subtotal line item
647
-     *
648
-     * @param EE_Line_Item $pre_tax_line_item
649
-     * @param EE_Transaction $transaction
650
-     * @param EE_Event $event
651
-     * @return EE_Line_Item
652
-     * @throws \EE_Error
653
-     */
654
-    public static function create_event_subtotal(EE_Line_Item $pre_tax_line_item, $transaction = NULL, $event = NULL)
655
-    {
656
-        $event_line_item = EE_Line_Item::new_instance(array(
657
-            'LIN_code' => self::get_event_code($event),
658
-            'LIN_name' => self::get_event_name($event),
659
-            'LIN_desc' => self::get_event_desc($event),
660
-            'LIN_type' => EEM_Line_Item::type_sub_total,
661
-            'OBJ_type' => 'Event',
662
-            'OBJ_ID' => $event instanceof EE_Event ? $event->ID() : 0
663
-        ));
664
-        $event_line_item = apply_filters(
665
-            'FHEE__EEH_Line_Item__create_event_subtotal__event_line_item',
666
-            $event_line_item
667
-        );
668
-        self::set_TXN_ID($event_line_item, $transaction);
669
-        $pre_tax_line_item->add_child_line_item($event_line_item);
670
-        return $event_line_item;
671
-    }
672
-
673
-
674
-    /**
675
-     * Gets what the event ticket's code SHOULD be
676
-     *
677
-     * @param EE_Event $event
678
-     * @return string
679
-     * @throws \EE_Error
680
-     */
681
-    public static function get_event_code($event)
682
-    {
683
-        return 'event-' . ($event instanceof EE_Event ? $event->ID() : '0');
684
-    }
685
-
686
-    /**
687
-     * Gets the event name
688
-     * @param EE_Event $event
689
-     * @return string
690
-     */
691
-    public static function get_event_name($event)
692
-    {
693
-        return $event instanceof EE_Event ? $event->name() : __('Event', 'event_espresso');
694
-    }
695
-
696
-    /**
697
-     * Gets the event excerpt
698
-     * @param EE_Event $event
699
-     * @return string
700
-     */
701
-    public static function get_event_desc($event)
702
-    {
703
-        return $event instanceof EE_Event ? $event->short_description() : '';
704
-    }
705
-
706
-    /**
707
-     * Given the grand total line item and a ticket, finds the event sub-total
708
-     * line item the ticket's purchase should be added onto
709
-     *
710
-     * @access public
711
-     * @param EE_Line_Item $grand_total the grand total line item
712
-     * @param EE_Ticket $ticket
713
-     * @throws \EE_Error
714
-     * @return EE_Line_Item
715
-     */
716
-    public static function get_event_line_item_for_ticket(EE_Line_Item $grand_total, EE_Ticket $ticket)
717
-    {
718
-        $first_datetime = $ticket->first_datetime();
719
-        if (!$first_datetime instanceof EE_Datetime) {
720
-            throw new EE_Error(
721
-                sprintf(__('The supplied ticket (ID %d) has no datetimes', 'event_espresso'), $ticket->ID())
722
-            );
723
-        }
724
-        $event = $first_datetime->event();
725
-        if (!$event instanceof EE_Event) {
726
-            throw new EE_Error(
727
-                sprintf(
728
-                    __('The supplied ticket (ID %d) has no event data associated with it.', 'event_espresso'),
729
-                    $ticket->ID()
730
-                )
731
-            );
732
-        }
733
-        $events_sub_total = EEH_Line_Item::get_event_line_item($grand_total, $event);
734
-        if (!$events_sub_total instanceof EE_Line_Item) {
735
-            throw new EE_Error(
736
-                sprintf(
737
-                    __('There is no events sub-total for ticket %s on total line item %d', 'event_espresso'),
738
-                    $ticket->ID(),
739
-                    $grand_total->ID()
740
-                )
741
-            );
742
-        }
743
-        return $events_sub_total;
744
-    }
745
-
746
-
747
-    /**
748
-     * Gets the event line item
749
-     *
750
-     * @param EE_Line_Item $grand_total
751
-     * @param EE_Event $event
752
-     * @return EE_Line_Item for the event subtotal which is a child of $grand_total
753
-     * @throws \EE_Error
754
-     */
755
-    public static function get_event_line_item(EE_Line_Item $grand_total, $event)
756
-    {
757
-        /** @type EE_Event $event */
758
-        $event = EEM_Event::instance()->ensure_is_obj($event, true);
759
-        $event_line_item = NULL;
760
-        $found = false;
761
-        foreach (EEH_Line_Item::get_event_subtotals($grand_total) as $event_line_item) {
762
-            // default event subtotal, we should only ever find this the first time this method is called
763
-            if (!$event_line_item->OBJ_ID()) {
764
-                // let's use this! but first... set the event details
765
-                EEH_Line_Item::set_event_subtotal_details($event_line_item, $event);
766
-                $found = true;
767
-                break;
768
-            } else if ($event_line_item->OBJ_ID() === $event->ID()) {
769
-                // found existing line item for this event in the cart, so break out of loop and use this one
770
-                $found = true;
771
-                break;
772
-            }
773
-        }
774
-        if (!$found) {
775
-            //there is no event sub-total yet, so add it
776
-            $pre_tax_subtotal = EEH_Line_Item::get_pre_tax_subtotal($grand_total);
777
-            // create a new "event" subtotal below that
778
-            $event_line_item = EEH_Line_Item::create_event_subtotal($pre_tax_subtotal, null, $event);
779
-            // and set the event details
780
-            EEH_Line_Item::set_event_subtotal_details($event_line_item, $event);
781
-        }
782
-        return $event_line_item;
783
-    }
784
-
785
-
786
-    /**
787
-     * Creates a default items subtotal line item
788
-     *
789
-     * @param EE_Line_Item $event_line_item
790
-     * @param EE_Event $event
791
-     * @param EE_Transaction $transaction
792
-     * @return EE_Line_Item
793
-     * @throws \EE_Error
794
-     */
795
-    public static function set_event_subtotal_details(
796
-        EE_Line_Item $event_line_item,
797
-        EE_Event $event,
798
-        $transaction = null
799
-    )
800
-    {
801
-        if ($event instanceof EE_Event) {
802
-            $event_line_item->set_code(self::get_event_code($event));
803
-            $event_line_item->set_name(self::get_event_name($event));
804
-            $event_line_item->set_desc(self::get_event_desc($event));
805
-            $event_line_item->set_OBJ_ID($event->ID());
806
-        }
807
-        self::set_TXN_ID($event_line_item, $transaction);
808
-    }
809
-
810
-
811
-    /**
812
-     * Finds what taxes should apply, adds them as tax line items under the taxes sub-total,
813
-     * and recalculates the taxes sub-total and the grand total. Resets the taxes, so
814
-     * any old taxes are removed
815
-     *
816
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
817
-     * @throws \EE_Error
818
-     */
819
-    public static function apply_taxes(EE_Line_Item $total_line_item)
820
-    {
821
-        /** @type EEM_Price $EEM_Price */
822
-        $EEM_Price = EE_Registry::instance()->load_model('Price');
823
-        // get array of taxes via Price Model
824
-        $ordered_taxes = $EEM_Price->get_all_prices_that_are_taxes();
825
-        ksort($ordered_taxes);
826
-        $taxes_line_item = self::get_taxes_subtotal($total_line_item);
827
-        //just to be safe, remove its old tax line items
828
-        $taxes_line_item->delete_children_line_items();
829
-        //loop thru taxes
830
-        foreach ($ordered_taxes as $order => $taxes) {
831
-            foreach ($taxes as $tax) {
832
-                if ($tax instanceof EE_Price) {
833
-                    $tax_line_item = EE_Line_Item::new_instance(
834
-                        array(
835
-                            'LIN_name' => $tax->name(),
836
-                            'LIN_desc' => $tax->desc(),
837
-                            'LIN_percent' => $tax->amount(),
838
-                            'LIN_is_taxable' => false,
839
-                            'LIN_order' => $order,
840
-                            'LIN_total' => 0,
841
-                            'LIN_type' => EEM_Line_Item::type_tax,
842
-                            'OBJ_type' => 'Price',
843
-                            'OBJ_ID' => $tax->ID()
844
-                        )
845
-                    );
846
-                    $tax_line_item = apply_filters(
847
-                        'FHEE__EEH_Line_Item__apply_taxes__tax_line_item',
848
-                        $tax_line_item
849
-                    );
850
-                    $taxes_line_item->add_child_line_item($tax_line_item);
851
-                }
852
-            }
853
-        }
854
-        $total_line_item->recalculate_total_including_taxes();
855
-    }
856
-
857
-
858
-    /**
859
-     * Ensures that taxes have been applied to the order, if not applies them.
860
-     * Returns the total amount of tax
861
-     *
862
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
863
-     * @return float
864
-     * @throws \EE_Error
865
-     */
866
-    public static function ensure_taxes_applied($total_line_item)
867
-    {
868
-        $taxes_subtotal = self::get_taxes_subtotal($total_line_item);
869
-        if (!$taxes_subtotal->children()) {
870
-            self::apply_taxes($total_line_item);
871
-        }
872
-        return $taxes_subtotal->total();
873
-    }
874
-
875
-
876
-    /**
877
-     * Deletes ALL children of the passed line item
878
-     *
879
-     * @param EE_Line_Item $parent_line_item
880
-     * @return bool
881
-     * @throws \EE_Error
882
-     */
883
-    public static function delete_all_child_items(EE_Line_Item $parent_line_item)
884
-    {
885
-        $deleted = 0;
886
-        foreach ($parent_line_item->children() as $child_line_item) {
887
-            if ($child_line_item instanceof EE_Line_Item) {
888
-                $deleted += EEH_Line_Item::delete_all_child_items($child_line_item);
889
-                if ($child_line_item->ID()) {
890
-                    $child_line_item->delete();
891
-                    unset($child_line_item);
892
-                } else {
893
-                    $parent_line_item->delete_child_line_item($child_line_item->code());
894
-                }
895
-                $deleted++;
896
-            }
897
-        }
898
-        return $deleted;
899
-    }
900
-
901
-
902
-    /**
903
-     * Deletes the line items as indicated by the line item code(s) provided,
904
-     * regardless of where they're found in the line item tree. Automatically
905
-     * re-calculates the line item totals and updates the related transaction. But
906
-     * DOES NOT automatically upgrade the transaction's registrations' final prices (which
907
-     * should probably change because of this).
908
-     * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
909
-     * after using this, to keep the registration final prices in-sync with the transaction's total.
910
-     * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
911
-     * @param array|bool|string $line_item_codes
912
-     * @return int number of items successfully removed
913
-     */
914
-    public static function delete_items(EE_Line_Item $total_line_item, $line_item_codes = FALSE)
915
-    {
916
-
917
-        if ($total_line_item->type() !== EEM_Line_Item::type_total) {
918
-            EE_Error::doing_it_wrong(
919
-                'EEH_Line_Item::delete_items',
920
-                __(
921
-                    'This static method should only be called with a TOTAL line item, otherwise we won\'t recalculate the totals correctly',
922
-                    'event_espresso'
923
-                ),
924
-                '4.6.18'
925
-            );
926
-        }
927
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
928
-
929
-        // check if only a single line_item_id was passed
930
-        if (!empty($line_item_codes) && !is_array($line_item_codes)) {
931
-            // place single line_item_id in an array to appear as multiple line_item_ids
932
-            $line_item_codes = array($line_item_codes);
933
-        }
934
-        $removals = 0;
935
-        // cycle thru line_item_ids
936
-        foreach ($line_item_codes as $line_item_id) {
937
-            $removals += $total_line_item->delete_child_line_item($line_item_id);
938
-        }
939
-
940
-        if ($removals > 0) {
941
-            $total_line_item->recalculate_taxes_and_tax_total();
942
-            return $removals;
943
-        } else {
944
-            return FALSE;
945
-        }
946
-    }
947
-
948
-
949
-    /**
950
-     * Overwrites the previous tax by clearing out the old taxes, and creates a new
951
-     * tax and updates the total line item accordingly
952
-     *
953
-     * @param EE_Line_Item $total_line_item
954
-     * @param float $amount
955
-     * @param string $name
956
-     * @param string $description
957
-     * @param string $code
958
-     * @param boolean $add_to_existing_line_item
959
-     *                          if true, and a duplicate line item with the same code is found,
960
-     *                          $amount will be added onto it; otherwise will simply set the taxes to match $amount
961
-     * @return EE_Line_Item the new tax line item created
962
-     * @throws \EE_Error
963
-     */
964
-    public static function set_total_tax_to(
965
-        EE_Line_Item $total_line_item,
966
-        $amount,
967
-        $name = null,
968
-        $description = null,
969
-        $code = null,
970
-        $add_to_existing_line_item = false
971
-    )
972
-    {
973
-        $tax_subtotal = self::get_taxes_subtotal($total_line_item);
974
-        $taxable_total = $total_line_item->taxable_total();
975
-
976
-        if ($add_to_existing_line_item) {
977
-            $new_tax = $tax_subtotal->get_child_line_item($code);
978
-            EEM_Line_Item::instance()->delete(
979
-                array(array('LIN_code' => array('!=', $code), 'LIN_parent' => $tax_subtotal->ID()))
980
-            );
981
-        } else {
982
-            $new_tax = null;
983
-            $tax_subtotal->delete_children_line_items();
984
-        }
985
-        if ($new_tax) {
986
-            $new_tax->set_total($new_tax->total() + $amount);
987
-            $new_tax->set_percent($taxable_total ? $new_tax->total() / $taxable_total * 100 : 0);
988
-        } else {
989
-            //no existing tax item. Create it
990
-            $new_tax = EE_Line_Item::new_instance(array(
991
-                'TXN_ID' => $total_line_item->TXN_ID(),
992
-                'LIN_name' => $name ? $name : __('Tax', 'event_espresso'),
993
-                'LIN_desc' => $description ? $description : '',
994
-                'LIN_percent' => $taxable_total ? ($amount / $taxable_total * 100) : 0,
995
-                'LIN_total' => $amount,
996
-                'LIN_parent' => $tax_subtotal->ID(),
997
-                'LIN_type' => EEM_Line_Item::type_tax,
998
-                'LIN_code' => $code
999
-            ));
1000
-        }
1001
-
1002
-        $new_tax = apply_filters(
1003
-            'FHEE__EEH_Line_Item__set_total_tax_to__new_tax_subtotal',
1004
-            $new_tax,
1005
-            $total_line_item
1006
-        );
1007
-        $new_tax->save();
1008
-        $tax_subtotal->set_total($new_tax->total());
1009
-        $tax_subtotal->save();
1010
-        $total_line_item->recalculate_total_including_taxes();
1011
-        return $new_tax;
1012
-    }
1013
-
1014
-
1015
-    /**
1016
-     * Makes all the line items which are children of $line_item taxable (or not).
1017
-     * Does NOT save the line items
1018
-     * @param EE_Line_Item $line_item
1019
-     * @param string $code_substring_for_whitelist if this string is part of the line item's code
1020
-     *  it will be whitelisted (ie, except from becoming taxable)
1021
-     * @param boolean $taxable
1022
-     */
1023
-    public static function set_line_items_taxable(
1024
-        EE_Line_Item $line_item,
1025
-        $taxable = true,
1026
-        $code_substring_for_whitelist = null
1027
-    )
1028
-    {
1029
-        $whitelisted = false;
1030
-        if ($code_substring_for_whitelist !== null) {
1031
-            $whitelisted = strpos($line_item->code(), $code_substring_for_whitelist) !== false ? true : false;
1032
-        }
1033
-        if (!$whitelisted && $line_item->is_line_item()) {
1034
-            $line_item->set_is_taxable($taxable);
1035
-        }
1036
-        foreach ($line_item->children() as $child_line_item) {
1037
-            EEH_Line_Item::set_line_items_taxable($child_line_item, $taxable, $code_substring_for_whitelist);
1038
-        }
1039
-    }
1040
-
1041
-
1042
-    /**
1043
-     * Gets all descendants that are event subtotals
1044
-     *
1045
-     * @uses  EEH_Line_Item::get_subtotals_of_object_type()
1046
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1047
-     * @return EE_Line_Item[]
1048
-     */
1049
-    public static function get_event_subtotals(EE_Line_Item $parent_line_item)
1050
-    {
1051
-        return self::get_subtotals_of_object_type($parent_line_item, 'Event');
1052
-    }
1053
-
1054
-
1055
-    /**
1056
-     * Gets all descendants subtotals that match the supplied object type
1057
-     *
1058
-     * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1059
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1060
-     * @param string $obj_type
1061
-     * @return EE_Line_Item[]
1062
-     */
1063
-    public static function get_subtotals_of_object_type(EE_Line_Item $parent_line_item, $obj_type = '')
1064
-    {
1065
-        return self::_get_descendants_by_type_and_object_type(
1066
-            $parent_line_item,
1067
-            EEM_Line_Item::type_sub_total,
1068
-            $obj_type
1069
-        );
1070
-    }
1071
-
1072
-
1073
-    /**
1074
-     * Gets all descendants that are tickets
1075
-     *
1076
-     * @uses  EEH_Line_Item::get_line_items_of_object_type()
1077
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1078
-     * @return EE_Line_Item[]
1079
-     */
1080
-    public static function get_ticket_line_items(EE_Line_Item $parent_line_item)
1081
-    {
1082
-        return self::get_line_items_of_object_type($parent_line_item, 'Ticket');
1083
-    }
1084
-
1085
-
1086
-    /**
1087
-     * Gets all descendants subtotals that match the supplied object type
1088
-     *
1089
-     * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1090
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1091
-     * @param string $obj_type
1092
-     * @return EE_Line_Item[]
1093
-     */
1094
-    public static function get_line_items_of_object_type(EE_Line_Item $parent_line_item, $obj_type = '')
1095
-    {
1096
-        return self::_get_descendants_by_type_and_object_type($parent_line_item, EEM_Line_Item::type_line_item, $obj_type);
1097
-    }
1098
-
1099
-
1100
-    /**
1101
-     * Gets all the descendants (ie, children or children of children etc) that are of the type 'tax'
1102
-     * @uses  EEH_Line_Item::get_descendants_of_type()
1103
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1104
-     * @return EE_Line_Item[]
1105
-     */
1106
-    public static function get_tax_descendants(EE_Line_Item $parent_line_item)
1107
-    {
1108
-        return EEH_Line_Item::get_descendants_of_type($parent_line_item, EEM_Line_Item::type_tax);
1109
-    }
1110
-
1111
-
1112
-    /**
1113
-     * Gets all the real items purchased which are children of this item
1114
-     * @uses  EEH_Line_Item::get_descendants_of_type()
1115
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1116
-     * @return EE_Line_Item[]
1117
-     */
1118
-    public static function get_line_item_descendants(EE_Line_Item $parent_line_item)
1119
-    {
1120
-        return EEH_Line_Item::get_descendants_of_type($parent_line_item, EEM_Line_Item::type_line_item);
1121
-    }
1122
-
1123
-
1124
-    /**
1125
-     * Gets all descendants of supplied line item that match the supplied line item type
1126
-     *
1127
-     * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1128
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1129
-     * @param string $line_item_type one of the EEM_Line_Item constants
1130
-     * @return EE_Line_Item[]
1131
-     */
1132
-    public static function get_descendants_of_type(EE_Line_Item $parent_line_item, $line_item_type)
1133
-    {
1134
-        return self::_get_descendants_by_type_and_object_type($parent_line_item, $line_item_type, NULL);
1135
-    }
1136
-
1137
-
1138
-    /**
1139
-     * Gets all descendants of supplied line item that match the supplied line item type and possibly the object type as well
1140
-     *
1141
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1142
-     * @param string $line_item_type one of the EEM_Line_Item constants
1143
-     * @param string | NULL $obj_type object model class name (minus prefix) or NULL to ignore object type when searching
1144
-     * @return EE_Line_Item[]
1145
-     */
1146
-    protected static function _get_descendants_by_type_and_object_type(
1147
-        EE_Line_Item $parent_line_item,
1148
-        $line_item_type,
1149
-        $obj_type = null
1150
-    )
1151
-    {
1152
-        $objects = array();
1153
-        foreach ($parent_line_item->children() as $child_line_item) {
1154
-            if ($child_line_item instanceof EE_Line_Item) {
1155
-                if (
1156
-                    $child_line_item->type() === $line_item_type
1157
-                    && (
1158
-                        $child_line_item->OBJ_type() === $obj_type || $obj_type === null
1159
-                    )
1160
-                ) {
1161
-                    $objects[] = $child_line_item;
1162
-                } else {
1163
-                    //go-through-all-its children looking for more matches
1164
-                    $objects = array_merge(
1165
-                        $objects,
1166
-                        self::_get_descendants_by_type_and_object_type(
1167
-                            $child_line_item,
1168
-                            $line_item_type,
1169
-                            $obj_type
1170
-                        )
1171
-                    );
1172
-                }
1173
-            }
1174
-        }
1175
-        return $objects;
1176
-    }
1177
-
1178
-
1179
-    /**
1180
-     * Gets all descendants subtotals that match the supplied object type
1181
-     *
1182
-     * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1183
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1184
-     * @param string $OBJ_type object type (like Event)
1185
-     * @param array $OBJ_IDs array of OBJ_IDs
1186
-     * @return EE_Line_Item[]
1187
-     */
1188
-    public static function get_line_items_by_object_type_and_IDs(
1189
-        EE_Line_Item $parent_line_item,
1190
-        $OBJ_type = '',
1191
-        $OBJ_IDs = array()
1192
-    )
1193
-    {
1194
-        return self::_get_descendants_by_object_type_and_object_ID($parent_line_item, $OBJ_type, $OBJ_IDs);
1195
-    }
1196
-
1197
-
1198
-    /**
1199
-     * Gets all descendants of supplied line item that match the supplied line item type and possibly the object type as well
1200
-     *
1201
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1202
-     * @param string $OBJ_type object type (like Event)
1203
-     * @param array $OBJ_IDs array of OBJ_IDs
1204
-     * @return EE_Line_Item[]
1205
-     */
1206
-    protected static function _get_descendants_by_object_type_and_object_ID(
1207
-        EE_Line_Item $parent_line_item,
1208
-        $OBJ_type,
1209
-        $OBJ_IDs
1210
-    )
1211
-    {
1212
-        $objects = array();
1213
-        foreach ($parent_line_item->children() as $child_line_item) {
1214
-            if ($child_line_item instanceof EE_Line_Item) {
1215
-                if (
1216
-                    $child_line_item->OBJ_type() === $OBJ_type
1217
-                    && is_array($OBJ_IDs)
1218
-                    && in_array($child_line_item->OBJ_ID(), $OBJ_IDs)
1219
-                ) {
1220
-                    $objects[] = $child_line_item;
1221
-                } else {
1222
-                    //go-through-all-its children looking for more matches
1223
-                    $objects = array_merge(
1224
-                        $objects,
1225
-                        self::_get_descendants_by_object_type_and_object_ID(
1226
-                            $child_line_item,
1227
-                            $OBJ_type,
1228
-                            $OBJ_IDs
1229
-                        )
1230
-                    );
1231
-                }
1232
-            }
1233
-        }
1234
-        return $objects;
1235
-    }
1236
-
1237
-
1238
-    /**
1239
-     * Uses a breadth-first-search in order to find the nearest descendant of
1240
-     * the specified type and returns it, else NULL
1241
-     *
1242
-     * @uses  EEH_Line_Item::_get_nearest_descendant()
1243
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1244
-     * @param string $type like one of the EEM_Line_Item::type_*
1245
-     * @return EE_Line_Item
1246
-     */
1247
-    public static function get_nearest_descendant_of_type(EE_Line_Item $parent_line_item, $type)
1248
-    {
1249
-        return self::_get_nearest_descendant($parent_line_item, 'LIN_type', $type);
1250
-    }
1251
-
1252
-
1253
-    /**
1254
-     * Uses a breadth-first-search in order to find the nearest descendant
1255
-     * having the specified LIN_code and returns it, else NULL
1256
-     *
1257
-     * @uses  EEH_Line_Item::_get_nearest_descendant()
1258
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1259
-     * @param string $code any value used for LIN_code
1260
-     * @return EE_Line_Item
1261
-     */
1262
-    public static function get_nearest_descendant_having_code(EE_Line_Item $parent_line_item, $code)
1263
-    {
1264
-        return self::_get_nearest_descendant($parent_line_item, 'LIN_code', $code);
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     * Uses a breadth-first-search in order to find the nearest descendant
1270
-     * having the specified LIN_code and returns it, else NULL
1271
-     *
1272
-     * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1273
-     * @param string $search_field name of EE_Line_Item property
1274
-     * @param string $value any value stored in $search_field
1275
-     * @return EE_Line_Item
1276
-     */
1277
-    protected static function _get_nearest_descendant(EE_Line_Item $parent_line_item, $search_field, $value)
1278
-    {
1279
-        foreach ($parent_line_item->children() as $child) {
1280
-            if ($child->get($search_field) == $value) {
1281
-                return $child;
1282
-            }
1283
-        }
1284
-        foreach ($parent_line_item->children() as $child) {
1285
-            $descendant_found = self::_get_nearest_descendant($child, $search_field, $value);
1286
-            if ($descendant_found) {
1287
-                return $descendant_found;
1288
-            }
1289
-        }
1290
-        return NULL;
1291
-    }
1292
-
1293
-
1294
-    /**
1295
-     * if passed line item has a TXN ID, uses that to jump directly to the grand total line item for the transaction,
1296
-     * else recursively walks up the line item tree until a parent of type total is found,
1297
-     *
1298
-     * @param EE_Line_Item $line_item
1299
-     * @return \EE_Line_Item
1300
-     * @throws \EE_Error
1301
-     */
1302
-    public static function find_transaction_grand_total_for_line_item(EE_Line_Item $line_item)
1303
-    {
1304
-        if ($line_item->TXN_ID()) {
1305
-            $total_line_item = $line_item->transaction()->total_line_item(false);
1306
-            if ($total_line_item instanceof EE_Line_Item) {
1307
-                return $total_line_item;
1308
-            }
1309
-        } else {
1310
-            $line_item_parent = $line_item->parent();
1311
-            if ($line_item_parent instanceof EE_Line_Item) {
1312
-                if ($line_item_parent->is_total()) {
1313
-                    return $line_item_parent;
1314
-                }
1315
-                return EEH_Line_Item::find_transaction_grand_total_for_line_item($line_item_parent);
1316
-            }
1317
-        }
1318
-        throw new EE_Error(
1319
-            sprintf(
1320
-                __('A valid grand total for line item %1$d was not found.', 'event_espresso'),
1321
-                $line_item->ID()
1322
-            )
1323
-        );
1324
-    }
1325
-
1326
-
1327
-    /**
1328
-     * Prints out a representation of the line item tree
1329
-     *
1330
-     * @param EE_Line_Item $line_item
1331
-     * @param int $indentation
1332
-     * @return void
1333
-     * @throws \EE_Error
1334
-     */
1335
-    public static function visualize(EE_Line_Item $line_item, $indentation = 0)
1336
-    {
1337
-        echo defined('EE_TESTS_DIR') ? "\n" : '<br />';
1338
-        if (!$indentation) {
1339
-            echo defined('EE_TESTS_DIR') ? "\n" : '<br />';
1340
-        }
1341
-        for ($i = 0; $i < $indentation; $i++) {
1342
-            echo ". ";
1343
-        }
1344
-        $breakdown = '';
1345
-        if ($line_item->is_line_item()) {
1346
-            if ($line_item->is_percent()) {
1347
-                $breakdown = "{$line_item->percent()}%";
1348
-            } else {
1349
-                $breakdown = '$' . "{$line_item->unit_price()} x {$line_item->quantity()}";
1350
-            }
1351
-        }
1352
-        echo $line_item->name() . " [ ID:{$line_item->ID()} | qty:{$line_item->quantity()} ] {$line_item->type()} : " . '$' . "{$line_item->total()}";
1353
-        if ($breakdown) {
1354
-            echo " ( {$breakdown} )";
1355
-        }
1356
-        if ($line_item->is_taxable()) {
1357
-            echo "  * taxable";
1358
-        }
1359
-        if ($line_item->children()) {
1360
-            foreach ($line_item->children() as $child) {
1361
-                self::visualize($child, $indentation + 1);
1362
-            }
1363
-        }
1364
-    }
1365
-
1366
-
1367
-    /**
1368
-     * Calculates the registration's final price, taking into account that they
1369
-     * need to not only help pay for their OWN ticket, but also any transaction-wide surcharges and taxes,
1370
-     * and receive a portion of any transaction-wide discounts.
1371
-     * eg1, if I buy a $1 ticket and brent buys a $9 ticket, and we receive a $5 discount
1372
-     * then I'll get 1/10 of that $5 discount, which is $0.50, and brent will get
1373
-     * 9/10ths of that $5 discount, which is $4.50. So my final price should be $0.50
1374
-     * and brent's final price should be $5.50.
1375
-     *
1376
-     * In order to do this, we basically need to traverse the line item tree calculating
1377
-     * the running totals (just as if we were recalculating the total), but when we identify
1378
-     * regular line items, we need to keep track of their share of the grand total.
1379
-     * Also, we need to keep track of the TAXABLE total for each ticket purchase, so
1380
-     * we can know how to apply taxes to it. (Note: "taxable total" does not equal the "pretax total"
1381
-     * when there are non-taxable items; otherwise they would be the same)
1382
-     *
1383
-     * @param EE_Line_Item $line_item
1384
-     * @param array $billable_ticket_quantities array of EE_Ticket IDs and their corresponding quantity that
1385
-     *                                                                            can be included in price calculations at this moment
1386
-     * @return array        keys are line items for tickets IDs and values are their share of the running total,
1387
-     *                                          plus the key 'total', and 'taxable' which also has keys of all the ticket IDs. Eg
1388
-     *                                          array(
1389
-     *                                          12 => 4.3
1390
-     *                                          23 => 8.0
1391
-     *                                          'total' => 16.6,
1392
-     *                                          'taxable' => array(
1393
-     *                                          12 => 10,
1394
-     *                                          23 => 4
1395
-     *                                          ).
1396
-     *                                          So to find which registrations have which final price, we need to find which line item
1397
-     *                                          is theirs, which can be done with
1398
-     *                                          `EEM_Line_Item::instance()->get_line_item_for_registration( $registration );`
1399
-     */
1400
-    public static function calculate_reg_final_prices_per_line_item(EE_Line_Item $line_item, $billable_ticket_quantities = array())
1401
-    {
1402
-        //init running grand total if not already
1403
-        if (!isset($running_totals['total'])) {
1404
-            $running_totals['total'] = 0;
1405
-        }
1406
-        if (!isset($running_totals['taxable'])) {
1407
-            $running_totals['taxable'] = array('total' => 0);
1408
-        }
1409
-        foreach ($line_item->children() as $child_line_item) {
1410
-            switch ($child_line_item->type()) {
1411
-
1412
-                case EEM_Line_Item::type_sub_total :
1413
-                    $running_totals_from_subtotal = EEH_Line_Item::calculate_reg_final_prices_per_line_item($child_line_item, $billable_ticket_quantities);
1414
-                    //combine arrays but preserve numeric keys
1415
-                    $running_totals = array_replace_recursive($running_totals_from_subtotal, $running_totals);
1416
-                    $running_totals['total'] += $running_totals_from_subtotal['total'];
1417
-                    $running_totals['taxable']['total'] += $running_totals_from_subtotal['taxable']['total'];
1418
-                    break;
1419
-
1420
-                case EEM_Line_Item::type_tax_sub_total :
1421
-
1422
-                    //find how much the taxes percentage is
1423
-                    if ($child_line_item->percent() !== 0) {
1424
-                        $tax_percent_decimal = $child_line_item->percent() / 100;
1425
-                    } else {
1426
-                        $tax_percent_decimal = EE_Taxes::get_total_taxes_percentage() / 100;
1427
-                    }
1428
-                    //and apply to all the taxable totals, and add to the pretax totals
1429
-                    foreach ($running_totals as $line_item_id => $this_running_total) {
1430
-                        //"total" and "taxable" array key is an exception
1431
-                        if ($line_item_id === 'taxable') {
1432
-                            continue;
1433
-                        }
1434
-                        $taxable_total = $running_totals['taxable'][$line_item_id];
1435
-                        $running_totals[$line_item_id] += ($taxable_total * $tax_percent_decimal);
1436
-                    }
1437
-                    break;
1438
-
1439
-                case EEM_Line_Item::type_line_item :
1440
-
1441
-                    // ticket line items or ????
1442
-                    if ($child_line_item->OBJ_type() === 'Ticket') {
1443
-                        // kk it's a ticket
1444
-                        if (isset($running_totals[$child_line_item->ID()])) {
1445
-                            //huh? that shouldn't happen.
1446
-                            $running_totals['total'] += $child_line_item->total();
1447
-                        } else {
1448
-                            //its not in our running totals yet. great.
1449
-                            if ($child_line_item->is_taxable()) {
1450
-                                $taxable_amount = $child_line_item->unit_price();
1451
-                            } else {
1452
-                                $taxable_amount = 0;
1453
-                            }
1454
-                            // are we only calculating totals for some tickets?
1455
-                            if (isset($billable_ticket_quantities[$child_line_item->OBJ_ID()])) {
1456
-                                $quantity = $billable_ticket_quantities[$child_line_item->OBJ_ID()];
1457
-                                $running_totals[$child_line_item->ID()] = $quantity
1458
-                                    ? $child_line_item->unit_price()
1459
-                                    : 0;
1460
-                                $running_totals['taxable'][$child_line_item->ID()] = $quantity
1461
-                                    ? $taxable_amount
1462
-                                    : 0;
1463
-                            } else {
1464
-                                $quantity = $child_line_item->quantity();
1465
-                                $running_totals[$child_line_item->ID()] = $child_line_item->unit_price();
1466
-                                $running_totals['taxable'][$child_line_item->ID()] = $taxable_amount;
1467
-                            }
1468
-                            $running_totals['taxable']['total'] += $taxable_amount * $quantity;
1469
-                            $running_totals['total'] += $child_line_item->unit_price() * $quantity;
1470
-                        }
1471
-                    } else {
1472
-                        // it's some other type of item added to the cart
1473
-                        // it should affect the running totals
1474
-                        // basically we want to convert it into a PERCENT modifier. Because
1475
-                        // more clearly affect all registration's final price equally
1476
-                        $line_items_percent_of_running_total = $running_totals['total'] > 0
1477
-                            ? ($child_line_item->total() / $running_totals['total']) + 1
1478
-                            : 1;
1479
-                        foreach ($running_totals as $line_item_id => $this_running_total) {
1480
-                            //the "taxable" array key is an exception
1481
-                            if ($line_item_id === 'taxable') {
1482
-                                continue;
1483
-                            }
1484
-                            // update the running totals
1485
-                            // yes this actually even works for the running grand total!
1486
-                            $running_totals[$line_item_id] =
1487
-                                $line_items_percent_of_running_total * $this_running_total;
1488
-
1489
-                            if ($child_line_item->is_taxable()) {
1490
-                                $running_totals['taxable'][$line_item_id] =
1491
-                                    $line_items_percent_of_running_total * $running_totals['taxable'][$line_item_id];
1492
-                            }
1493
-                        }
1494
-                    }
1495
-                    break;
1496
-            }
1497
-        }
1498
-        return $running_totals;
1499
-    }
1500
-
1501
-
1502
-    /**
1503
-     * @param \EE_Line_Item $total_line_item
1504
-     * @param \EE_Line_Item $ticket_line_item
1505
-     * @return float | null
1506
-     * @throws \OutOfRangeException
1507
-     */
1508
-    public static function calculate_final_price_for_ticket_line_item(\EE_Line_Item $total_line_item, \EE_Line_Item $ticket_line_item)
1509
-    {
1510
-        static $final_prices_per_ticket_line_item = array();
1511
-        if (empty($final_prices_per_ticket_line_item)) {
1512
-            $final_prices_per_ticket_line_item = \EEH_Line_Item::calculate_reg_final_prices_per_line_item(
1513
-                $total_line_item
1514
-            );
1515
-        }
1516
-        //ok now find this new registration's final price
1517
-        if (isset($final_prices_per_ticket_line_item[$ticket_line_item->ID()])) {
1518
-            return $final_prices_per_ticket_line_item[$ticket_line_item->ID()];
1519
-        }
1520
-        $message = sprintf(
1521
-            __(
1522
-                'The final price for the ticket line item (ID:%1$d) could not be calculated.',
1523
-                'event_espresso'
1524
-            ),
1525
-            $ticket_line_item->ID()
1526
-        );
1527
-        if (WP_DEBUG) {
1528
-            $message .= '<br>' . print_r($final_prices_per_ticket_line_item, true);
1529
-            throw new \OutOfRangeException($message);
1530
-        } else {
1531
-            EE_Log::instance()->log(__CLASS__, __FUNCTION__, $message);
1532
-        }
1533
-        return null;
1534
-    }
1535
-
1536
-
1537
-    /**
1538
-     * Creates a duplicate of the line item tree, except only includes billable items
1539
-     * and the portion of line items attributed to billable things
1540
-     *
1541
-     * @param EE_Line_Item $line_item
1542
-     * @param EE_Registration[] $registrations
1543
-     * @return \EE_Line_Item
1544
-     * @throws \EE_Error
1545
-     */
1546
-    public static function billable_line_item_tree(EE_Line_Item $line_item, $registrations)
1547
-    {
1548
-        $copy_li = EEH_Line_Item::billable_line_item($line_item, $registrations);
1549
-        foreach ($line_item->children() as $child_li) {
1550
-            $copy_li->add_child_line_item(EEH_Line_Item::billable_line_item_tree($child_li, $registrations));
1551
-        }
1552
-        //if this is the grand total line item, make sure the totals all add up
1553
-        //(we could have duplicated this logic AS we copied the line items, but
1554
-        //it seems DRYer this way)
1555
-        if ($copy_li->type() === EEM_Line_Item::type_total) {
1556
-            $copy_li->recalculate_total_including_taxes();
1557
-        }
1558
-        return $copy_li;
1559
-    }
1560
-
1561
-
1562
-    /**
1563
-     * Creates a new, unsaved line item from $line_item that factors in the
1564
-     * number of billable registrations on $registrations.
1565
-     *
1566
-     * @param EE_Line_Item $line_item
1567
-     * @return EE_Line_Item
1568
-     * @throws \EE_Error
1569
-     * @param EE_Registration[] $registrations
1570
-     */
1571
-    public static function billable_line_item(EE_Line_Item $line_item, $registrations)
1572
-    {
1573
-        $new_li_fields = $line_item->model_field_array();
1574
-        if ($line_item->type() === EEM_Line_Item::type_line_item &&
1575
-            $line_item->OBJ_type() === 'Ticket'
1576
-        ) {
1577
-            $count = 0;
1578
-            foreach ($registrations as $registration) {
1579
-                if ($line_item->OBJ_ID() === $registration->ticket_ID() &&
1580
-                    in_array($registration->status_ID(), EEM_Registration::reg_statuses_that_allow_payment())
1581
-                ) {
1582
-                    $count++;
1583
-                }
1584
-            }
1585
-            $new_li_fields['LIN_quantity'] = $count;
1586
-        }
1587
-        //don't set the total. We'll leave that up to the code that calculates it
1588
-        unset($new_li_fields['LIN_ID'], $new_li_fields['LIN_parent'], $new_li_fields['LIN_total']);
1589
-        return EE_Line_Item::new_instance($new_li_fields);
1590
-    }
1591
-
1592
-
1593
-    /**
1594
-     * Returns a modified line item tree where all the subtotals which have a total of 0
1595
-     * are removed, and line items with a quantity of 0
1596
-     *
1597
-     * @param EE_Line_Item $line_item |null
1598
-     * @return \EE_Line_Item|null
1599
-     * @throws \EE_Error
1600
-     */
1601
-    public static function non_empty_line_items(EE_Line_Item $line_item)
1602
-    {
1603
-        $copied_li = EEH_Line_Item::non_empty_line_item($line_item);
1604
-        if ($copied_li === null) {
1605
-            return null;
1606
-        }
1607
-        //if this is an event subtotal, we want to only include it if it
1608
-        //has a non-zero total and at least one ticket line item child
1609
-        $ticket_children = 0;
1610
-        foreach ($line_item->children() as $child_li) {
1611
-            $child_li_copy = EEH_Line_Item::non_empty_line_items($child_li);
1612
-            if ($child_li_copy !== null) {
1613
-                $copied_li->add_child_line_item($child_li_copy);
1614
-                if ($child_li_copy->type() === EEM_Line_Item::type_line_item &&
1615
-                    $child_li_copy->OBJ_type() === 'Ticket'
1616
-                ) {
1617
-                    $ticket_children++;
1618
-                }
1619
-            }
1620
-        }
1621
-        //if this is an event subtotal with NO ticket children
1622
-        //we basically want to ignore it
1623
-        if (
1624
-            $ticket_children === 0
1625
-            && $line_item->type() === EEM_Line_Item::type_sub_total
1626
-            && $line_item->OBJ_type() === 'Event'
1627
-            && $line_item->total() === 0
1628
-        ) {
1629
-            return null;
1630
-        }
1631
-        return $copied_li;
1632
-    }
1633
-
1634
-
1635
-    /**
1636
-     * Creates a new, unsaved line item, but if it's a ticket line item
1637
-     * with a total of 0, or a subtotal of 0, returns null instead
1638
-     *
1639
-     * @param EE_Line_Item $line_item
1640
-     * @return EE_Line_Item
1641
-     * @throws \EE_Error
1642
-     */
1643
-    public static function non_empty_line_item(EE_Line_Item $line_item)
1644
-    {
1645
-        if ($line_item->type() === EEM_Line_Item::type_line_item &&
1646
-            $line_item->OBJ_type() === 'Ticket' &&
1647
-            $line_item->quantity() === 0
1648
-        ) {
1649
-            return null;
1650
-        }
1651
-        $new_li_fields = $line_item->model_field_array();
1652
-        //don't set the total. We'll leave that up to the code that calculates it
1653
-        unset($new_li_fields['LIN_ID'], $new_li_fields['LIN_parent']);
1654
-        return EE_Line_Item::new_instance($new_li_fields);
1655
-    }
1656
-
1657
-
1658
-
1659
-    /**************************************** @DEPRECATED METHODS *************************************** */
1660
-    /**
1661
-     * @deprecated
1662
-     * @param EE_Line_Item $total_line_item
1663
-     * @return \EE_Line_Item
1664
-     * @throws \EE_Error
1665
-     */
1666
-    public static function get_items_subtotal(EE_Line_Item $total_line_item)
1667
-    {
1668
-        EE_Error::doing_it_wrong('EEH_Line_Item::get_items_subtotal()', __('Method replaced with EEH_Line_Item::get_pre_tax_subtotal()', 'event_espresso'), '4.6.0');
1669
-        return self::get_pre_tax_subtotal($total_line_item);
1670
-    }
1671
-
1672
-
1673
-    /**
1674
-     * @deprecated
1675
-     * @param EE_Transaction $transaction
1676
-     * @return \EE_Line_Item
1677
-     * @throws \EE_Error
1678
-     */
1679
-    public static function create_default_total_line_item($transaction = NULL)
1680
-    {
1681
-        EE_Error::doing_it_wrong('EEH_Line_Item::create_default_total_line_item()', __('Method replaced with EEH_Line_Item::create_total_line_item()', 'event_espresso'), '4.6.0');
1682
-        return self::create_total_line_item($transaction);
1683
-    }
1684
-
1685
-
1686
-    /**
1687
-     * @deprecated
1688
-     * @param EE_Line_Item $total_line_item
1689
-     * @param EE_Transaction $transaction
1690
-     * @return \EE_Line_Item
1691
-     * @throws \EE_Error
1692
-     */
1693
-    public static function create_default_tickets_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
1694
-    {
1695
-        EE_Error::doing_it_wrong('EEH_Line_Item::create_default_tickets_subtotal()', __('Method replaced with EEH_Line_Item::create_pre_tax_subtotal()', 'event_espresso'), '4.6.0');
1696
-        return self::create_pre_tax_subtotal($total_line_item, $transaction);
1697
-    }
1698
-
1699
-
1700
-    /**
1701
-     * @deprecated
1702
-     * @param EE_Line_Item $total_line_item
1703
-     * @param EE_Transaction $transaction
1704
-     * @return \EE_Line_Item
1705
-     * @throws \EE_Error
1706
-     */
1707
-    public static function create_default_taxes_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
1708
-    {
1709
-        EE_Error::doing_it_wrong('EEH_Line_Item::create_default_taxes_subtotal()', __('Method replaced with EEH_Line_Item::create_taxes_subtotal()', 'event_espresso'), '4.6.0');
1710
-        return self::create_taxes_subtotal($total_line_item, $transaction);
1711
-    }
1712
-
1713
-
1714
-    /**
1715
-     * @deprecated
1716
-     * @param EE_Line_Item $total_line_item
1717
-     * @param EE_Transaction $transaction
1718
-     * @return \EE_Line_Item
1719
-     * @throws \EE_Error
1720
-     */
1721
-    public static function create_default_event_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
1722
-    {
1723
-        EE_Error::doing_it_wrong('EEH_Line_Item::create_default_event_subtotal()', __('Method replaced with EEH_Line_Item::create_event_subtotal()', 'event_espresso'), '4.6.0');
1724
-        return self::create_event_subtotal($total_line_item, $transaction);
1725
-    }
26
+	//other functions: cancel ticket purchase
27
+	//delete ticket purchase
28
+	//add promotion
29
+
30
+
31
+	/**
32
+	 * Adds a simple item ( unrelated to any other model object) to the total line item
33
+	 * in the correct spot in the line item tree (also verifying it doesn't add a duplicate based on the LIN_code)
34
+	 * beneath the pre-tax-total (alongside event subtotals).
35
+	 * Automatically re-calculates the line item totals and updates the related transaction. But
36
+	 * DOES NOT automatically upgrade the transaction's registrations' final prices (which
37
+	 * should probably change because of this).
38
+	 * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
39
+	 * after using this, to keep the registration final prices in-sync with the transaction's total.
40
+	 *
41
+	 * @param EE_Line_Item $parent_line_item
42
+	 * @param string $name
43
+	 * @param float $unit_price
44
+	 * @param string $description
45
+	 * @param int $quantity
46
+	 * @param boolean $taxable
47
+	 * @param boolean $code if set to a value, ensures there is only one line item with that code
48
+	 * @return boolean success
49
+	 * @throws \EE_Error
50
+	 */
51
+	public static function add_unrelated_item(EE_Line_Item $parent_line_item, $name, $unit_price, $description = '', $quantity = 1, $taxable = FALSE, $code = NULL)
52
+	{
53
+		$items_subtotal = self::get_pre_tax_subtotal($parent_line_item);
54
+		$line_item = EE_Line_Item::new_instance(array(
55
+			'LIN_name' => $name,
56
+			'LIN_desc' => $description,
57
+			'LIN_unit_price' => $unit_price,
58
+			'LIN_quantity' => $quantity,
59
+			'LIN_percent' => null,
60
+			'LIN_is_taxable' => $taxable,
61
+			'LIN_order' => $items_subtotal instanceof EE_Line_Item ? count($items_subtotal->children()) : 0,
62
+			'LIN_total' => (float)$unit_price * (int)$quantity,
63
+			'LIN_type' => EEM_Line_Item::type_line_item,
64
+			'LIN_code' => $code,
65
+		));
66
+		$line_item = apply_filters(
67
+			'FHEE__EEH_Line_Item__add_unrelated_item__line_item',
68
+			$line_item,
69
+			$parent_line_item
70
+		);
71
+		return self::add_item($parent_line_item, $line_item);
72
+	}
73
+
74
+
75
+	/**
76
+	 * Adds a simple item ( unrelated to any other model object) to the total line item,
77
+	 * in the correct spot in the line item tree. Automatically
78
+	 * re-calculates the line item totals and updates the related transaction. But
79
+	 * DOES NOT automatically upgrade the transaction's registrations' final prices (which
80
+	 * should probably change because of this).
81
+	 * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
82
+	 * after using this, to keep the registration final prices in-sync with the transaction's total.
83
+	 *
84
+	 * @param EE_Line_Item $parent_line_item
85
+	 * @param string $name
86
+	 * @param float $percentage_amount
87
+	 * @param string $description
88
+	 * @param boolean $taxable
89
+	 * @return boolean success
90
+	 * @throws \EE_Error
91
+	 */
92
+	public static function add_percentage_based_item(EE_Line_Item $parent_line_item, $name, $percentage_amount, $description = '', $taxable = FALSE)
93
+	{
94
+		$line_item = EE_Line_Item::new_instance(array(
95
+			'LIN_name' => $name,
96
+			'LIN_desc' => $description,
97
+			'LIN_unit_price' => 0,
98
+			'LIN_percent' => $percentage_amount,
99
+			'LIN_quantity' => NULL,
100
+			'LIN_is_taxable' => $taxable,
101
+			'LIN_total' => (float)($percentage_amount * ($parent_line_item->total() / 100)),
102
+			'LIN_type' => EEM_Line_Item::type_line_item,
103
+			'LIN_parent' => $parent_line_item->ID()
104
+		));
105
+		$line_item = apply_filters(
106
+			'FHEE__EEH_Line_Item__add_percentage_based_item__line_item',
107
+			$line_item
108
+		);
109
+		return $parent_line_item->add_child_line_item($line_item, false);
110
+	}
111
+
112
+
113
+	/**
114
+	 * Returns the new line item created by adding a purchase of the ticket
115
+	 * ensures that ticket line item is saved, and that cart total has been recalculated.
116
+	 * If this ticket has already been purchased, just increments its count.
117
+	 * Automatically re-calculates the line item totals and updates the related transaction. But
118
+	 * DOES NOT automatically upgrade the transaction's registrations' final prices (which
119
+	 * should probably change because of this).
120
+	 * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
121
+	 * after using this, to keep the registration final prices in-sync with the transaction's total.
122
+	 *
123
+	 * @param EE_Line_Item $total_line_item grand total line item of type EEM_Line_Item::type_total
124
+	 * @param EE_Ticket $ticket
125
+	 * @param int $qty
126
+	 * @return \EE_Line_Item
127
+	 * @throws \EE_Error
128
+	 */
129
+	public static function add_ticket_purchase(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
130
+	{
131
+		if (!$total_line_item instanceof EE_Line_Item || !$total_line_item->is_total()) {
132
+			throw new EE_Error(sprintf(__('A valid line item total is required in order to add tickets. A line item of type "%s" was passed.', 'event_espresso'), $ticket->ID(), $total_line_item->ID()));
133
+		}
134
+		// either increment the qty for an existing ticket
135
+		$line_item = self::increment_ticket_qty_if_already_in_cart($total_line_item, $ticket, $qty);
136
+		// or add a new one
137
+		if (!$line_item instanceof EE_Line_Item) {
138
+			$line_item = self::create_ticket_line_item($total_line_item, $ticket, $qty);
139
+		}
140
+		$total_line_item->recalculate_total_including_taxes();
141
+		return $line_item;
142
+	}
143
+
144
+
145
+	/**
146
+	 * Returns the new line item created by adding a purchase of the ticket
147
+	 * @param \EE_Line_Item $total_line_item
148
+	 * @param EE_Ticket $ticket
149
+	 * @param int $qty
150
+	 * @return \EE_Line_Item
151
+	 * @throws \EE_Error
152
+	 */
153
+	public static function increment_ticket_qty_if_already_in_cart(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
154
+	{
155
+		$line_item = null;
156
+		if ($total_line_item instanceof EE_Line_Item && $total_line_item->is_total()) {
157
+			$ticket_line_items = EEH_Line_Item::get_ticket_line_items($total_line_item);
158
+			foreach ((array)$ticket_line_items as $ticket_line_item) {
159
+				if (
160
+					$ticket_line_item instanceof EE_Line_Item
161
+					&& (int)$ticket_line_item->OBJ_ID() === (int)$ticket->ID()
162
+				) {
163
+					$line_item = $ticket_line_item;
164
+					break;
165
+				}
166
+			}
167
+		}
168
+		if ($line_item instanceof EE_Line_Item) {
169
+			EEH_Line_Item::increment_quantity($line_item, $qty);
170
+			return $line_item;
171
+		}
172
+		return null;
173
+	}
174
+
175
+
176
+	/**
177
+	 * Increments the line item and all its children's quantity by $qty (but percent line items are unaffected).
178
+	 * Does NOT save or recalculate other line items totals
179
+	 *
180
+	 * @param EE_Line_Item $line_item
181
+	 * @param int $qty
182
+	 * @return void
183
+	 * @throws \EE_Error
184
+	 */
185
+	public static function increment_quantity(EE_Line_Item $line_item, $qty = 1)
186
+	{
187
+		if (!$line_item->is_percent()) {
188
+			$qty += $line_item->quantity();
189
+			$line_item->set_quantity($qty);
190
+			$line_item->set_total($line_item->unit_price() * $qty);
191
+			$line_item->save();
192
+		}
193
+		foreach ($line_item->children() as $child) {
194
+			if ($child->is_sub_line_item()) {
195
+				EEH_Line_Item::update_quantity($child, $qty);
196
+			}
197
+		}
198
+	}
199
+
200
+
201
+	/**
202
+	 * Decrements the line item and all its children's quantity by $qty (but percent line items are unaffected).
203
+	 * Does NOT save or recalculate other line items totals
204
+	 *
205
+	 * @param EE_Line_Item $line_item
206
+	 * @param int $qty
207
+	 * @return void
208
+	 * @throws \EE_Error
209
+	 */
210
+	public static function decrement_quantity(EE_Line_Item $line_item, $qty = 1)
211
+	{
212
+		if (!$line_item->is_percent()) {
213
+			$qty = $line_item->quantity() - $qty;
214
+			$qty = max($qty, 0);
215
+			$line_item->set_quantity($qty);
216
+			$line_item->set_total($line_item->unit_price() * $qty);
217
+			$line_item->save();
218
+		}
219
+		foreach ($line_item->children() as $child) {
220
+			if ($child->is_sub_line_item()) {
221
+				EEH_Line_Item::update_quantity($child, $qty);
222
+			}
223
+		}
224
+	}
225
+
226
+
227
+	/**
228
+	 * Updates the line item and its children's quantities to the specified number.
229
+	 * Does NOT save them or recalculate totals.
230
+	 *
231
+	 * @param EE_Line_Item $line_item
232
+	 * @param int $new_quantity
233
+	 * @throws \EE_Error
234
+	 */
235
+	public static function update_quantity(EE_Line_Item $line_item, $new_quantity)
236
+	{
237
+		if (!$line_item->is_percent()) {
238
+			$line_item->set_quantity($new_quantity);
239
+			$line_item->set_total($line_item->unit_price() * $new_quantity);
240
+			$line_item->save();
241
+		}
242
+		foreach ($line_item->children() as $child) {
243
+			if ($child->is_sub_line_item()) {
244
+				EEH_Line_Item::update_quantity($child, $new_quantity);
245
+			}
246
+		}
247
+	}
248
+
249
+
250
+	/**
251
+	 * Returns the new line item created by adding a purchase of the ticket
252
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
253
+	 * @param EE_Ticket $ticket
254
+	 * @param int $qty
255
+	 * @return \EE_Line_Item
256
+	 * @throws \EE_Error
257
+	 */
258
+	public static function create_ticket_line_item(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
259
+	{
260
+		$datetimes = $ticket->datetimes();
261
+		$first_datetime = reset($datetimes);
262
+		if ($first_datetime instanceof EE_Datetime && $first_datetime->event() instanceof EE_Event) {
263
+			$first_datetime_name = $first_datetime->event()->name();
264
+		} else {
265
+			$first_datetime_name = __('Event', 'event_espresso');
266
+		}
267
+		$event = sprintf(_x('(For %1$s)', '(For Event Name)', 'event_espresso'), $first_datetime_name);
268
+		// get event subtotal line
269
+		$events_sub_total = self::get_event_line_item_for_ticket($total_line_item, $ticket);
270
+		// add $ticket to cart
271
+		$line_item = EE_Line_Item::new_instance(array(
272
+			'LIN_name' => $ticket->name(),
273
+			'LIN_desc' => $ticket->description() !== '' ? $ticket->description() . ' ' . $event : $event,
274
+			'LIN_unit_price' => $ticket->price(),
275
+			'LIN_quantity' => $qty,
276
+			'LIN_is_taxable' => $ticket->taxable(),
277
+			'LIN_order' => count($events_sub_total->children()),
278
+			'LIN_total' => $ticket->price() * $qty,
279
+			'LIN_type' => EEM_Line_Item::type_line_item,
280
+			'OBJ_ID' => $ticket->ID(),
281
+			'OBJ_type' => 'Ticket'
282
+		));
283
+		$line_item = apply_filters(
284
+			'FHEE__EEH_Line_Item__create_ticket_line_item__line_item',
285
+			$line_item
286
+		);
287
+		$events_sub_total->add_child_line_item($line_item);
288
+		//now add the sub-line items
289
+		$running_total_for_ticket = 0;
290
+		foreach ($ticket->prices(array('order_by' => array('PRC_order' => 'ASC'))) as $price) {
291
+			$sign = $price->is_discount() ? -1 : 1;
292
+			$price_total = $price->is_percent()
293
+				? $running_total_for_ticket * $price->amount() / 100
294
+				: $price->amount() * $qty;
295
+			$sub_line_item = EE_Line_Item::new_instance(array(
296
+				'LIN_name' => $price->name(),
297
+				'LIN_desc' => $price->desc(),
298
+				'LIN_quantity' => $price->is_percent() ? null : $qty,
299
+				'LIN_is_taxable' => false,
300
+				'LIN_order' => $price->order(),
301
+				'LIN_total' => $sign * $price_total,
302
+				'LIN_type' => EEM_Line_Item::type_sub_line_item,
303
+				'OBJ_ID' => $price->ID(),
304
+				'OBJ_type' => 'Price'
305
+			));
306
+			$sub_line_item = apply_filters(
307
+				'FHEE__EEH_Line_Item__create_ticket_line_item__sub_line_item',
308
+				$sub_line_item
309
+			);
310
+			if ($price->is_percent()) {
311
+				$sub_line_item->set_percent($sign * $price->amount());
312
+			} else {
313
+				$sub_line_item->set_unit_price($sign * $price->amount());
314
+			}
315
+			$running_total_for_ticket += $price_total;
316
+			$line_item->add_child_line_item($sub_line_item);
317
+		}
318
+		return $line_item;
319
+	}
320
+
321
+
322
+	/**
323
+	 * Adds the specified item under the pre-tax-sub-total line item. Automatically
324
+	 * re-calculates the line item totals and updates the related transaction. But
325
+	 * DOES NOT automatically upgrade the transaction's registrations' final prices (which
326
+	 * should probably change because of this).
327
+	 * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
328
+	 * after using this, to keep the registration final prices in-sync with the transaction's total.
329
+	 *
330
+	 * @param EE_Line_Item $total_line_item
331
+	 * @param EE_Line_Item $item to be added
332
+	 * @return boolean
333
+	 * @throws \EE_Error
334
+	 */
335
+	public static function add_item(EE_Line_Item $total_line_item, EE_Line_Item $item)
336
+	{
337
+		$pre_tax_subtotal = self::get_pre_tax_subtotal($total_line_item);
338
+		if ($pre_tax_subtotal instanceof EE_Line_Item) {
339
+			$success = $pre_tax_subtotal->add_child_line_item($item);
340
+		} else {
341
+			return FALSE;
342
+		}
343
+		$total_line_item->recalculate_total_including_taxes();
344
+		return $success;
345
+	}
346
+
347
+
348
+	/**
349
+	 * cancels an existing ticket line item,
350
+	 * by decrementing it's quantity by 1 and adding a new "type_cancellation" sub-line-item.
351
+	 * ALL totals and subtotals will NEED TO BE UPDATED after performing this action
352
+	 *
353
+	 * @param EE_Line_Item $ticket_line_item
354
+	 * @param int $qty
355
+	 * @return bool success
356
+	 * @throws \EE_Error
357
+	 */
358
+	public static function cancel_ticket_line_item(EE_Line_Item $ticket_line_item, $qty = 1)
359
+	{
360
+		// validate incoming line_item
361
+		if ($ticket_line_item->OBJ_type() !== 'Ticket') {
362
+			throw new EE_Error(
363
+				sprintf(
364
+					__('The supplied line item must have an Object Type of "Ticket", not %1$s.', 'event_espresso'),
365
+					$ticket_line_item->type()
366
+				)
367
+			);
368
+		}
369
+		if ($ticket_line_item->quantity() < $qty) {
370
+			throw new EE_Error(
371
+				sprintf(
372
+					__('Can not cancel %1$d ticket(s) because the supplied line item has a quantity of %2$d.', 'event_espresso'),
373
+					$qty,
374
+					$ticket_line_item->quantity()
375
+				)
376
+			);
377
+		}
378
+		// decrement ticket quantity; don't rely on auto-fixing when recalculating totals to do this
379
+		$ticket_line_item->set_quantity($ticket_line_item->quantity() - $qty);
380
+		foreach ($ticket_line_item->children() as $child_line_item) {
381
+			if (
382
+				$child_line_item->is_sub_line_item()
383
+				&& !$child_line_item->is_percent()
384
+				&& !$child_line_item->is_cancellation()
385
+			) {
386
+				$child_line_item->set_quantity($child_line_item->quantity() - $qty);
387
+			}
388
+		}
389
+		// get cancellation sub line item
390
+		$cancellation_line_item = EEH_Line_Item::get_descendants_of_type(
391
+			$ticket_line_item,
392
+			EEM_Line_Item::type_cancellation
393
+		);
394
+		$cancellation_line_item = reset($cancellation_line_item);
395
+		// verify that this ticket was indeed previously cancelled
396
+		if ($cancellation_line_item instanceof EE_Line_Item) {
397
+			// increment cancelled quantity
398
+			$cancellation_line_item->set_quantity($cancellation_line_item->quantity() + $qty);
399
+		} else {
400
+			// create cancellation sub line item
401
+			$cancellation_line_item = EE_Line_Item::new_instance(array(
402
+				'LIN_name' => __('Cancellation', 'event_espresso'),
403
+				'LIN_desc' => sprintf(
404
+					_x('Cancelled %1$s : %2$s', 'Cancelled Ticket Name : 2015-01-01 11:11', 'event_espresso'),
405
+					$ticket_line_item->name(),
406
+					current_time(get_option('date_format') . ' ' . get_option('time_format'))
407
+				),
408
+				'LIN_unit_price' => 0, // $ticket_line_item->unit_price()
409
+				'LIN_quantity' => $qty,
410
+				'LIN_is_taxable' => $ticket_line_item->is_taxable(),
411
+				'LIN_order' => count($ticket_line_item->children()),
412
+				'LIN_total' => 0, // $ticket_line_item->unit_price()
413
+				'LIN_type' => EEM_Line_Item::type_cancellation,
414
+			));
415
+			$ticket_line_item->add_child_line_item($cancellation_line_item);
416
+		}
417
+		if ($ticket_line_item->save_this_and_descendants() > 0) {
418
+			// decrement parent line item quantity
419
+			$event_line_item = $ticket_line_item->parent();
420
+			if ($event_line_item instanceof EE_Line_Item && $event_line_item->OBJ_type() === 'Event') {
421
+				$event_line_item->set_quantity($event_line_item->quantity() - $qty);
422
+				$event_line_item->save();
423
+			}
424
+			EEH_Line_Item::get_grand_total_and_recalculate_everything($ticket_line_item);
425
+			return true;
426
+		}
427
+		return false;
428
+	}
429
+
430
+
431
+	/**
432
+	 * reinstates (un-cancels?) a previously canceled ticket line item,
433
+	 * by incrementing it's quantity by 1, and decrementing it's "type_cancellation" sub-line-item.
434
+	 * ALL totals and subtotals will NEED TO BE UPDATED after performing this action
435
+	 *
436
+	 * @param EE_Line_Item $ticket_line_item
437
+	 * @param int $qty
438
+	 * @return bool success
439
+	 * @throws \EE_Error
440
+	 */
441
+	public static function reinstate_canceled_ticket_line_item(EE_Line_Item $ticket_line_item, $qty = 1)
442
+	{
443
+		// validate incoming line_item
444
+		if ($ticket_line_item->OBJ_type() !== 'Ticket') {
445
+			throw new EE_Error(
446
+				sprintf(
447
+					__('The supplied line item must have an Object Type of "Ticket", not %1$s.', 'event_espresso'),
448
+					$ticket_line_item->type()
449
+				)
450
+			);
451
+		}
452
+		// get cancellation sub line item
453
+		$cancellation_line_item = EEH_Line_Item::get_descendants_of_type(
454
+			$ticket_line_item,
455
+			EEM_Line_Item::type_cancellation
456
+		);
457
+		$cancellation_line_item = reset($cancellation_line_item);
458
+		// verify that this ticket was indeed previously cancelled
459
+		if (!$cancellation_line_item instanceof EE_Line_Item) {
460
+			return false;
461
+		}
462
+		if ($cancellation_line_item->quantity() > $qty) {
463
+			// decrement cancelled quantity
464
+			$cancellation_line_item->set_quantity($cancellation_line_item->quantity() - $qty);
465
+		} else if ($cancellation_line_item->quantity() == $qty) {
466
+			// decrement cancelled quantity in case anyone still has the object kicking around
467
+			$cancellation_line_item->set_quantity($cancellation_line_item->quantity() - $qty);
468
+			// delete because quantity will end up as 0
469
+			$cancellation_line_item->delete();
470
+			// and attempt to destroy the object,
471
+			// even though PHP won't actually destroy it until it needs the memory
472
+			unset($cancellation_line_item);
473
+		} else {
474
+			// what ?!?! negative quantity ?!?!
475
+			throw new EE_Error(
476
+				sprintf(
477
+					__('Can not reinstate %1$d cancelled ticket(s) because the cancelled ticket quantity is only %2$d.',
478
+						'event_espresso'),
479
+					$qty,
480
+					$cancellation_line_item->quantity()
481
+				)
482
+			);
483
+		}
484
+		// increment ticket quantity
485
+		$ticket_line_item->set_quantity($ticket_line_item->quantity() + $qty);
486
+		if ($ticket_line_item->save_this_and_descendants() > 0) {
487
+			// increment parent line item quantity
488
+			$event_line_item = $ticket_line_item->parent();
489
+			if ($event_line_item instanceof EE_Line_Item && $event_line_item->OBJ_type() === 'Event') {
490
+				$event_line_item->set_quantity($event_line_item->quantity() + $qty);
491
+			}
492
+			EEH_Line_Item::get_grand_total_and_recalculate_everything($ticket_line_item);
493
+			return true;
494
+		}
495
+		return false;
496
+	}
497
+
498
+
499
+	/**
500
+	 * calls EEH_Line_Item::find_transaction_grand_total_for_line_item()
501
+	 * then EE_Line_Item::recalculate_total_including_taxes() on the result
502
+	 *
503
+	 * @param EE_Line_Item $line_item
504
+	 * @return \EE_Line_Item
505
+	 */
506
+	public static function get_grand_total_and_recalculate_everything(EE_Line_Item $line_item)
507
+	{
508
+		$grand_total_line_item = EEH_Line_Item::find_transaction_grand_total_for_line_item($line_item);
509
+		return $grand_total_line_item->recalculate_total_including_taxes();
510
+	}
511
+
512
+
513
+	/**
514
+	 * Gets the line item which contains the subtotal of all the items
515
+	 *
516
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
517
+	 * @return \EE_Line_Item
518
+	 * @throws \EE_Error
519
+	 */
520
+	public static function get_pre_tax_subtotal(EE_Line_Item $total_line_item)
521
+	{
522
+		$pre_tax_subtotal = $total_line_item->get_child_line_item('pre-tax-subtotal');
523
+		return $pre_tax_subtotal instanceof EE_Line_Item
524
+			? $pre_tax_subtotal
525
+			: self::create_pre_tax_subtotal($total_line_item);
526
+	}
527
+
528
+
529
+	/**
530
+	 * Gets the line item for the taxes subtotal
531
+	 *
532
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
533
+	 * @return \EE_Line_Item
534
+	 * @throws \EE_Error
535
+	 */
536
+	public static function get_taxes_subtotal(EE_Line_Item $total_line_item)
537
+	{
538
+		$taxes = $total_line_item->get_child_line_item('taxes');
539
+		return $taxes ? $taxes : self::create_taxes_subtotal($total_line_item);
540
+	}
541
+
542
+
543
+	/**
544
+	 * sets the TXN ID on an EE_Line_Item if passed a valid EE_Transaction object
545
+	 *
546
+	 * @param EE_Line_Item $line_item
547
+	 * @param EE_Transaction $transaction
548
+	 * @return void
549
+	 * @throws \EE_Error
550
+	 */
551
+	public static function set_TXN_ID(EE_Line_Item $line_item, $transaction = NULL)
552
+	{
553
+		if ($transaction) {
554
+			/** @type EEM_Transaction $EEM_Transaction */
555
+			$EEM_Transaction = EE_Registry::instance()->load_model('Transaction');
556
+			$TXN_ID = $EEM_Transaction->ensure_is_ID($transaction);
557
+			$line_item->set_TXN_ID($TXN_ID);
558
+		}
559
+	}
560
+
561
+
562
+	/**
563
+	 * Creates a new default total line item for the transaction,
564
+	 * and its tickets subtotal and taxes subtotal line items (and adds the
565
+	 * existing taxes as children of the taxes subtotal line item)
566
+	 *
567
+	 * @param EE_Transaction $transaction
568
+	 * @return \EE_Line_Item of type total
569
+	 * @throws \EE_Error
570
+	 */
571
+	public static function create_total_line_item($transaction = NULL)
572
+	{
573
+		$total_line_item = EE_Line_Item::new_instance(array(
574
+			'LIN_code' => 'total',
575
+			'LIN_name' => __('Grand Total', 'event_espresso'),
576
+			'LIN_type' => EEM_Line_Item::type_total,
577
+			'OBJ_type' => 'Transaction'
578
+		));
579
+		$total_line_item = apply_filters(
580
+			'FHEE__EEH_Line_Item__create_total_line_item__total_line_item',
581
+			$total_line_item
582
+		);
583
+		self::set_TXN_ID($total_line_item, $transaction);
584
+		self::create_pre_tax_subtotal($total_line_item, $transaction);
585
+		self::create_taxes_subtotal($total_line_item, $transaction);
586
+		return $total_line_item;
587
+	}
588
+
589
+
590
+	/**
591
+	 * Creates a default items subtotal line item
592
+	 *
593
+	 * @param EE_Line_Item $total_line_item
594
+	 * @param EE_Transaction $transaction
595
+	 * @return EE_Line_Item
596
+	 * @throws \EE_Error
597
+	 */
598
+	protected static function create_pre_tax_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
599
+	{
600
+		$pre_tax_line_item = EE_Line_Item::new_instance(array(
601
+			'LIN_code' => 'pre-tax-subtotal',
602
+			'LIN_name' => __('Pre-Tax Subtotal', 'event_espresso'),
603
+			'LIN_type' => EEM_Line_Item::type_sub_total
604
+		));
605
+		$pre_tax_line_item = apply_filters(
606
+			'FHEE__EEH_Line_Item__create_pre_tax_subtotal__pre_tax_line_item',
607
+			$pre_tax_line_item
608
+		);
609
+		self::set_TXN_ID($pre_tax_line_item, $transaction);
610
+		$total_line_item->add_child_line_item($pre_tax_line_item);
611
+		self::create_event_subtotal($pre_tax_line_item, $transaction);
612
+		return $pre_tax_line_item;
613
+	}
614
+
615
+
616
+	/**
617
+	 * Creates a line item for the taxes subtotal and finds all the tax prices
618
+	 * and applies taxes to it
619
+	 *
620
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
621
+	 * @param EE_Transaction $transaction
622
+	 * @return EE_Line_Item
623
+	 * @throws \EE_Error
624
+	 */
625
+	protected static function create_taxes_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
626
+	{
627
+		$tax_line_item = EE_Line_Item::new_instance(array(
628
+			'LIN_code' => 'taxes',
629
+			'LIN_name' => __('Taxes', 'event_espresso'),
630
+			'LIN_type' => EEM_Line_Item::type_tax_sub_total,
631
+			'LIN_order' => 1000,//this should always come last
632
+		));
633
+		$tax_line_item = apply_filters(
634
+			'FHEE__EEH_Line_Item__create_taxes_subtotal__tax_line_item',
635
+			$tax_line_item
636
+		);
637
+		self::set_TXN_ID($tax_line_item, $transaction);
638
+		$total_line_item->add_child_line_item($tax_line_item);
639
+		//and lastly, add the actual taxes
640
+		self::apply_taxes($total_line_item);
641
+		return $tax_line_item;
642
+	}
643
+
644
+
645
+	/**
646
+	 * Creates a default items subtotal line item
647
+	 *
648
+	 * @param EE_Line_Item $pre_tax_line_item
649
+	 * @param EE_Transaction $transaction
650
+	 * @param EE_Event $event
651
+	 * @return EE_Line_Item
652
+	 * @throws \EE_Error
653
+	 */
654
+	public static function create_event_subtotal(EE_Line_Item $pre_tax_line_item, $transaction = NULL, $event = NULL)
655
+	{
656
+		$event_line_item = EE_Line_Item::new_instance(array(
657
+			'LIN_code' => self::get_event_code($event),
658
+			'LIN_name' => self::get_event_name($event),
659
+			'LIN_desc' => self::get_event_desc($event),
660
+			'LIN_type' => EEM_Line_Item::type_sub_total,
661
+			'OBJ_type' => 'Event',
662
+			'OBJ_ID' => $event instanceof EE_Event ? $event->ID() : 0
663
+		));
664
+		$event_line_item = apply_filters(
665
+			'FHEE__EEH_Line_Item__create_event_subtotal__event_line_item',
666
+			$event_line_item
667
+		);
668
+		self::set_TXN_ID($event_line_item, $transaction);
669
+		$pre_tax_line_item->add_child_line_item($event_line_item);
670
+		return $event_line_item;
671
+	}
672
+
673
+
674
+	/**
675
+	 * Gets what the event ticket's code SHOULD be
676
+	 *
677
+	 * @param EE_Event $event
678
+	 * @return string
679
+	 * @throws \EE_Error
680
+	 */
681
+	public static function get_event_code($event)
682
+	{
683
+		return 'event-' . ($event instanceof EE_Event ? $event->ID() : '0');
684
+	}
685
+
686
+	/**
687
+	 * Gets the event name
688
+	 * @param EE_Event $event
689
+	 * @return string
690
+	 */
691
+	public static function get_event_name($event)
692
+	{
693
+		return $event instanceof EE_Event ? $event->name() : __('Event', 'event_espresso');
694
+	}
695
+
696
+	/**
697
+	 * Gets the event excerpt
698
+	 * @param EE_Event $event
699
+	 * @return string
700
+	 */
701
+	public static function get_event_desc($event)
702
+	{
703
+		return $event instanceof EE_Event ? $event->short_description() : '';
704
+	}
705
+
706
+	/**
707
+	 * Given the grand total line item and a ticket, finds the event sub-total
708
+	 * line item the ticket's purchase should be added onto
709
+	 *
710
+	 * @access public
711
+	 * @param EE_Line_Item $grand_total the grand total line item
712
+	 * @param EE_Ticket $ticket
713
+	 * @throws \EE_Error
714
+	 * @return EE_Line_Item
715
+	 */
716
+	public static function get_event_line_item_for_ticket(EE_Line_Item $grand_total, EE_Ticket $ticket)
717
+	{
718
+		$first_datetime = $ticket->first_datetime();
719
+		if (!$first_datetime instanceof EE_Datetime) {
720
+			throw new EE_Error(
721
+				sprintf(__('The supplied ticket (ID %d) has no datetimes', 'event_espresso'), $ticket->ID())
722
+			);
723
+		}
724
+		$event = $first_datetime->event();
725
+		if (!$event instanceof EE_Event) {
726
+			throw new EE_Error(
727
+				sprintf(
728
+					__('The supplied ticket (ID %d) has no event data associated with it.', 'event_espresso'),
729
+					$ticket->ID()
730
+				)
731
+			);
732
+		}
733
+		$events_sub_total = EEH_Line_Item::get_event_line_item($grand_total, $event);
734
+		if (!$events_sub_total instanceof EE_Line_Item) {
735
+			throw new EE_Error(
736
+				sprintf(
737
+					__('There is no events sub-total for ticket %s on total line item %d', 'event_espresso'),
738
+					$ticket->ID(),
739
+					$grand_total->ID()
740
+				)
741
+			);
742
+		}
743
+		return $events_sub_total;
744
+	}
745
+
746
+
747
+	/**
748
+	 * Gets the event line item
749
+	 *
750
+	 * @param EE_Line_Item $grand_total
751
+	 * @param EE_Event $event
752
+	 * @return EE_Line_Item for the event subtotal which is a child of $grand_total
753
+	 * @throws \EE_Error
754
+	 */
755
+	public static function get_event_line_item(EE_Line_Item $grand_total, $event)
756
+	{
757
+		/** @type EE_Event $event */
758
+		$event = EEM_Event::instance()->ensure_is_obj($event, true);
759
+		$event_line_item = NULL;
760
+		$found = false;
761
+		foreach (EEH_Line_Item::get_event_subtotals($grand_total) as $event_line_item) {
762
+			// default event subtotal, we should only ever find this the first time this method is called
763
+			if (!$event_line_item->OBJ_ID()) {
764
+				// let's use this! but first... set the event details
765
+				EEH_Line_Item::set_event_subtotal_details($event_line_item, $event);
766
+				$found = true;
767
+				break;
768
+			} else if ($event_line_item->OBJ_ID() === $event->ID()) {
769
+				// found existing line item for this event in the cart, so break out of loop and use this one
770
+				$found = true;
771
+				break;
772
+			}
773
+		}
774
+		if (!$found) {
775
+			//there is no event sub-total yet, so add it
776
+			$pre_tax_subtotal = EEH_Line_Item::get_pre_tax_subtotal($grand_total);
777
+			// create a new "event" subtotal below that
778
+			$event_line_item = EEH_Line_Item::create_event_subtotal($pre_tax_subtotal, null, $event);
779
+			// and set the event details
780
+			EEH_Line_Item::set_event_subtotal_details($event_line_item, $event);
781
+		}
782
+		return $event_line_item;
783
+	}
784
+
785
+
786
+	/**
787
+	 * Creates a default items subtotal line item
788
+	 *
789
+	 * @param EE_Line_Item $event_line_item
790
+	 * @param EE_Event $event
791
+	 * @param EE_Transaction $transaction
792
+	 * @return EE_Line_Item
793
+	 * @throws \EE_Error
794
+	 */
795
+	public static function set_event_subtotal_details(
796
+		EE_Line_Item $event_line_item,
797
+		EE_Event $event,
798
+		$transaction = null
799
+	)
800
+	{
801
+		if ($event instanceof EE_Event) {
802
+			$event_line_item->set_code(self::get_event_code($event));
803
+			$event_line_item->set_name(self::get_event_name($event));
804
+			$event_line_item->set_desc(self::get_event_desc($event));
805
+			$event_line_item->set_OBJ_ID($event->ID());
806
+		}
807
+		self::set_TXN_ID($event_line_item, $transaction);
808
+	}
809
+
810
+
811
+	/**
812
+	 * Finds what taxes should apply, adds them as tax line items under the taxes sub-total,
813
+	 * and recalculates the taxes sub-total and the grand total. Resets the taxes, so
814
+	 * any old taxes are removed
815
+	 *
816
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
817
+	 * @throws \EE_Error
818
+	 */
819
+	public static function apply_taxes(EE_Line_Item $total_line_item)
820
+	{
821
+		/** @type EEM_Price $EEM_Price */
822
+		$EEM_Price = EE_Registry::instance()->load_model('Price');
823
+		// get array of taxes via Price Model
824
+		$ordered_taxes = $EEM_Price->get_all_prices_that_are_taxes();
825
+		ksort($ordered_taxes);
826
+		$taxes_line_item = self::get_taxes_subtotal($total_line_item);
827
+		//just to be safe, remove its old tax line items
828
+		$taxes_line_item->delete_children_line_items();
829
+		//loop thru taxes
830
+		foreach ($ordered_taxes as $order => $taxes) {
831
+			foreach ($taxes as $tax) {
832
+				if ($tax instanceof EE_Price) {
833
+					$tax_line_item = EE_Line_Item::new_instance(
834
+						array(
835
+							'LIN_name' => $tax->name(),
836
+							'LIN_desc' => $tax->desc(),
837
+							'LIN_percent' => $tax->amount(),
838
+							'LIN_is_taxable' => false,
839
+							'LIN_order' => $order,
840
+							'LIN_total' => 0,
841
+							'LIN_type' => EEM_Line_Item::type_tax,
842
+							'OBJ_type' => 'Price',
843
+							'OBJ_ID' => $tax->ID()
844
+						)
845
+					);
846
+					$tax_line_item = apply_filters(
847
+						'FHEE__EEH_Line_Item__apply_taxes__tax_line_item',
848
+						$tax_line_item
849
+					);
850
+					$taxes_line_item->add_child_line_item($tax_line_item);
851
+				}
852
+			}
853
+		}
854
+		$total_line_item->recalculate_total_including_taxes();
855
+	}
856
+
857
+
858
+	/**
859
+	 * Ensures that taxes have been applied to the order, if not applies them.
860
+	 * Returns the total amount of tax
861
+	 *
862
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
863
+	 * @return float
864
+	 * @throws \EE_Error
865
+	 */
866
+	public static function ensure_taxes_applied($total_line_item)
867
+	{
868
+		$taxes_subtotal = self::get_taxes_subtotal($total_line_item);
869
+		if (!$taxes_subtotal->children()) {
870
+			self::apply_taxes($total_line_item);
871
+		}
872
+		return $taxes_subtotal->total();
873
+	}
874
+
875
+
876
+	/**
877
+	 * Deletes ALL children of the passed line item
878
+	 *
879
+	 * @param EE_Line_Item $parent_line_item
880
+	 * @return bool
881
+	 * @throws \EE_Error
882
+	 */
883
+	public static function delete_all_child_items(EE_Line_Item $parent_line_item)
884
+	{
885
+		$deleted = 0;
886
+		foreach ($parent_line_item->children() as $child_line_item) {
887
+			if ($child_line_item instanceof EE_Line_Item) {
888
+				$deleted += EEH_Line_Item::delete_all_child_items($child_line_item);
889
+				if ($child_line_item->ID()) {
890
+					$child_line_item->delete();
891
+					unset($child_line_item);
892
+				} else {
893
+					$parent_line_item->delete_child_line_item($child_line_item->code());
894
+				}
895
+				$deleted++;
896
+			}
897
+		}
898
+		return $deleted;
899
+	}
900
+
901
+
902
+	/**
903
+	 * Deletes the line items as indicated by the line item code(s) provided,
904
+	 * regardless of where they're found in the line item tree. Automatically
905
+	 * re-calculates the line item totals and updates the related transaction. But
906
+	 * DOES NOT automatically upgrade the transaction's registrations' final prices (which
907
+	 * should probably change because of this).
908
+	 * You should call EE_Registration_Processor::calculate_reg_final_prices_per_line_item()
909
+	 * after using this, to keep the registration final prices in-sync with the transaction's total.
910
+	 * @param EE_Line_Item $total_line_item of type EEM_Line_Item::type_total
911
+	 * @param array|bool|string $line_item_codes
912
+	 * @return int number of items successfully removed
913
+	 */
914
+	public static function delete_items(EE_Line_Item $total_line_item, $line_item_codes = FALSE)
915
+	{
916
+
917
+		if ($total_line_item->type() !== EEM_Line_Item::type_total) {
918
+			EE_Error::doing_it_wrong(
919
+				'EEH_Line_Item::delete_items',
920
+				__(
921
+					'This static method should only be called with a TOTAL line item, otherwise we won\'t recalculate the totals correctly',
922
+					'event_espresso'
923
+				),
924
+				'4.6.18'
925
+			);
926
+		}
927
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
928
+
929
+		// check if only a single line_item_id was passed
930
+		if (!empty($line_item_codes) && !is_array($line_item_codes)) {
931
+			// place single line_item_id in an array to appear as multiple line_item_ids
932
+			$line_item_codes = array($line_item_codes);
933
+		}
934
+		$removals = 0;
935
+		// cycle thru line_item_ids
936
+		foreach ($line_item_codes as $line_item_id) {
937
+			$removals += $total_line_item->delete_child_line_item($line_item_id);
938
+		}
939
+
940
+		if ($removals > 0) {
941
+			$total_line_item->recalculate_taxes_and_tax_total();
942
+			return $removals;
943
+		} else {
944
+			return FALSE;
945
+		}
946
+	}
947
+
948
+
949
+	/**
950
+	 * Overwrites the previous tax by clearing out the old taxes, and creates a new
951
+	 * tax and updates the total line item accordingly
952
+	 *
953
+	 * @param EE_Line_Item $total_line_item
954
+	 * @param float $amount
955
+	 * @param string $name
956
+	 * @param string $description
957
+	 * @param string $code
958
+	 * @param boolean $add_to_existing_line_item
959
+	 *                          if true, and a duplicate line item with the same code is found,
960
+	 *                          $amount will be added onto it; otherwise will simply set the taxes to match $amount
961
+	 * @return EE_Line_Item the new tax line item created
962
+	 * @throws \EE_Error
963
+	 */
964
+	public static function set_total_tax_to(
965
+		EE_Line_Item $total_line_item,
966
+		$amount,
967
+		$name = null,
968
+		$description = null,
969
+		$code = null,
970
+		$add_to_existing_line_item = false
971
+	)
972
+	{
973
+		$tax_subtotal = self::get_taxes_subtotal($total_line_item);
974
+		$taxable_total = $total_line_item->taxable_total();
975
+
976
+		if ($add_to_existing_line_item) {
977
+			$new_tax = $tax_subtotal->get_child_line_item($code);
978
+			EEM_Line_Item::instance()->delete(
979
+				array(array('LIN_code' => array('!=', $code), 'LIN_parent' => $tax_subtotal->ID()))
980
+			);
981
+		} else {
982
+			$new_tax = null;
983
+			$tax_subtotal->delete_children_line_items();
984
+		}
985
+		if ($new_tax) {
986
+			$new_tax->set_total($new_tax->total() + $amount);
987
+			$new_tax->set_percent($taxable_total ? $new_tax->total() / $taxable_total * 100 : 0);
988
+		} else {
989
+			//no existing tax item. Create it
990
+			$new_tax = EE_Line_Item::new_instance(array(
991
+				'TXN_ID' => $total_line_item->TXN_ID(),
992
+				'LIN_name' => $name ? $name : __('Tax', 'event_espresso'),
993
+				'LIN_desc' => $description ? $description : '',
994
+				'LIN_percent' => $taxable_total ? ($amount / $taxable_total * 100) : 0,
995
+				'LIN_total' => $amount,
996
+				'LIN_parent' => $tax_subtotal->ID(),
997
+				'LIN_type' => EEM_Line_Item::type_tax,
998
+				'LIN_code' => $code
999
+			));
1000
+		}
1001
+
1002
+		$new_tax = apply_filters(
1003
+			'FHEE__EEH_Line_Item__set_total_tax_to__new_tax_subtotal',
1004
+			$new_tax,
1005
+			$total_line_item
1006
+		);
1007
+		$new_tax->save();
1008
+		$tax_subtotal->set_total($new_tax->total());
1009
+		$tax_subtotal->save();
1010
+		$total_line_item->recalculate_total_including_taxes();
1011
+		return $new_tax;
1012
+	}
1013
+
1014
+
1015
+	/**
1016
+	 * Makes all the line items which are children of $line_item taxable (or not).
1017
+	 * Does NOT save the line items
1018
+	 * @param EE_Line_Item $line_item
1019
+	 * @param string $code_substring_for_whitelist if this string is part of the line item's code
1020
+	 *  it will be whitelisted (ie, except from becoming taxable)
1021
+	 * @param boolean $taxable
1022
+	 */
1023
+	public static function set_line_items_taxable(
1024
+		EE_Line_Item $line_item,
1025
+		$taxable = true,
1026
+		$code_substring_for_whitelist = null
1027
+	)
1028
+	{
1029
+		$whitelisted = false;
1030
+		if ($code_substring_for_whitelist !== null) {
1031
+			$whitelisted = strpos($line_item->code(), $code_substring_for_whitelist) !== false ? true : false;
1032
+		}
1033
+		if (!$whitelisted && $line_item->is_line_item()) {
1034
+			$line_item->set_is_taxable($taxable);
1035
+		}
1036
+		foreach ($line_item->children() as $child_line_item) {
1037
+			EEH_Line_Item::set_line_items_taxable($child_line_item, $taxable, $code_substring_for_whitelist);
1038
+		}
1039
+	}
1040
+
1041
+
1042
+	/**
1043
+	 * Gets all descendants that are event subtotals
1044
+	 *
1045
+	 * @uses  EEH_Line_Item::get_subtotals_of_object_type()
1046
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1047
+	 * @return EE_Line_Item[]
1048
+	 */
1049
+	public static function get_event_subtotals(EE_Line_Item $parent_line_item)
1050
+	{
1051
+		return self::get_subtotals_of_object_type($parent_line_item, 'Event');
1052
+	}
1053
+
1054
+
1055
+	/**
1056
+	 * Gets all descendants subtotals that match the supplied object type
1057
+	 *
1058
+	 * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1059
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1060
+	 * @param string $obj_type
1061
+	 * @return EE_Line_Item[]
1062
+	 */
1063
+	public static function get_subtotals_of_object_type(EE_Line_Item $parent_line_item, $obj_type = '')
1064
+	{
1065
+		return self::_get_descendants_by_type_and_object_type(
1066
+			$parent_line_item,
1067
+			EEM_Line_Item::type_sub_total,
1068
+			$obj_type
1069
+		);
1070
+	}
1071
+
1072
+
1073
+	/**
1074
+	 * Gets all descendants that are tickets
1075
+	 *
1076
+	 * @uses  EEH_Line_Item::get_line_items_of_object_type()
1077
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1078
+	 * @return EE_Line_Item[]
1079
+	 */
1080
+	public static function get_ticket_line_items(EE_Line_Item $parent_line_item)
1081
+	{
1082
+		return self::get_line_items_of_object_type($parent_line_item, 'Ticket');
1083
+	}
1084
+
1085
+
1086
+	/**
1087
+	 * Gets all descendants subtotals that match the supplied object type
1088
+	 *
1089
+	 * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1090
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1091
+	 * @param string $obj_type
1092
+	 * @return EE_Line_Item[]
1093
+	 */
1094
+	public static function get_line_items_of_object_type(EE_Line_Item $parent_line_item, $obj_type = '')
1095
+	{
1096
+		return self::_get_descendants_by_type_and_object_type($parent_line_item, EEM_Line_Item::type_line_item, $obj_type);
1097
+	}
1098
+
1099
+
1100
+	/**
1101
+	 * Gets all the descendants (ie, children or children of children etc) that are of the type 'tax'
1102
+	 * @uses  EEH_Line_Item::get_descendants_of_type()
1103
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1104
+	 * @return EE_Line_Item[]
1105
+	 */
1106
+	public static function get_tax_descendants(EE_Line_Item $parent_line_item)
1107
+	{
1108
+		return EEH_Line_Item::get_descendants_of_type($parent_line_item, EEM_Line_Item::type_tax);
1109
+	}
1110
+
1111
+
1112
+	/**
1113
+	 * Gets all the real items purchased which are children of this item
1114
+	 * @uses  EEH_Line_Item::get_descendants_of_type()
1115
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1116
+	 * @return EE_Line_Item[]
1117
+	 */
1118
+	public static function get_line_item_descendants(EE_Line_Item $parent_line_item)
1119
+	{
1120
+		return EEH_Line_Item::get_descendants_of_type($parent_line_item, EEM_Line_Item::type_line_item);
1121
+	}
1122
+
1123
+
1124
+	/**
1125
+	 * Gets all descendants of supplied line item that match the supplied line item type
1126
+	 *
1127
+	 * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1128
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1129
+	 * @param string $line_item_type one of the EEM_Line_Item constants
1130
+	 * @return EE_Line_Item[]
1131
+	 */
1132
+	public static function get_descendants_of_type(EE_Line_Item $parent_line_item, $line_item_type)
1133
+	{
1134
+		return self::_get_descendants_by_type_and_object_type($parent_line_item, $line_item_type, NULL);
1135
+	}
1136
+
1137
+
1138
+	/**
1139
+	 * Gets all descendants of supplied line item that match the supplied line item type and possibly the object type as well
1140
+	 *
1141
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1142
+	 * @param string $line_item_type one of the EEM_Line_Item constants
1143
+	 * @param string | NULL $obj_type object model class name (minus prefix) or NULL to ignore object type when searching
1144
+	 * @return EE_Line_Item[]
1145
+	 */
1146
+	protected static function _get_descendants_by_type_and_object_type(
1147
+		EE_Line_Item $parent_line_item,
1148
+		$line_item_type,
1149
+		$obj_type = null
1150
+	)
1151
+	{
1152
+		$objects = array();
1153
+		foreach ($parent_line_item->children() as $child_line_item) {
1154
+			if ($child_line_item instanceof EE_Line_Item) {
1155
+				if (
1156
+					$child_line_item->type() === $line_item_type
1157
+					&& (
1158
+						$child_line_item->OBJ_type() === $obj_type || $obj_type === null
1159
+					)
1160
+				) {
1161
+					$objects[] = $child_line_item;
1162
+				} else {
1163
+					//go-through-all-its children looking for more matches
1164
+					$objects = array_merge(
1165
+						$objects,
1166
+						self::_get_descendants_by_type_and_object_type(
1167
+							$child_line_item,
1168
+							$line_item_type,
1169
+							$obj_type
1170
+						)
1171
+					);
1172
+				}
1173
+			}
1174
+		}
1175
+		return $objects;
1176
+	}
1177
+
1178
+
1179
+	/**
1180
+	 * Gets all descendants subtotals that match the supplied object type
1181
+	 *
1182
+	 * @uses  EEH_Line_Item::_get_descendants_by_type_and_object_type()
1183
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1184
+	 * @param string $OBJ_type object type (like Event)
1185
+	 * @param array $OBJ_IDs array of OBJ_IDs
1186
+	 * @return EE_Line_Item[]
1187
+	 */
1188
+	public static function get_line_items_by_object_type_and_IDs(
1189
+		EE_Line_Item $parent_line_item,
1190
+		$OBJ_type = '',
1191
+		$OBJ_IDs = array()
1192
+	)
1193
+	{
1194
+		return self::_get_descendants_by_object_type_and_object_ID($parent_line_item, $OBJ_type, $OBJ_IDs);
1195
+	}
1196
+
1197
+
1198
+	/**
1199
+	 * Gets all descendants of supplied line item that match the supplied line item type and possibly the object type as well
1200
+	 *
1201
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1202
+	 * @param string $OBJ_type object type (like Event)
1203
+	 * @param array $OBJ_IDs array of OBJ_IDs
1204
+	 * @return EE_Line_Item[]
1205
+	 */
1206
+	protected static function _get_descendants_by_object_type_and_object_ID(
1207
+		EE_Line_Item $parent_line_item,
1208
+		$OBJ_type,
1209
+		$OBJ_IDs
1210
+	)
1211
+	{
1212
+		$objects = array();
1213
+		foreach ($parent_line_item->children() as $child_line_item) {
1214
+			if ($child_line_item instanceof EE_Line_Item) {
1215
+				if (
1216
+					$child_line_item->OBJ_type() === $OBJ_type
1217
+					&& is_array($OBJ_IDs)
1218
+					&& in_array($child_line_item->OBJ_ID(), $OBJ_IDs)
1219
+				) {
1220
+					$objects[] = $child_line_item;
1221
+				} else {
1222
+					//go-through-all-its children looking for more matches
1223
+					$objects = array_merge(
1224
+						$objects,
1225
+						self::_get_descendants_by_object_type_and_object_ID(
1226
+							$child_line_item,
1227
+							$OBJ_type,
1228
+							$OBJ_IDs
1229
+						)
1230
+					);
1231
+				}
1232
+			}
1233
+		}
1234
+		return $objects;
1235
+	}
1236
+
1237
+
1238
+	/**
1239
+	 * Uses a breadth-first-search in order to find the nearest descendant of
1240
+	 * the specified type and returns it, else NULL
1241
+	 *
1242
+	 * @uses  EEH_Line_Item::_get_nearest_descendant()
1243
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1244
+	 * @param string $type like one of the EEM_Line_Item::type_*
1245
+	 * @return EE_Line_Item
1246
+	 */
1247
+	public static function get_nearest_descendant_of_type(EE_Line_Item $parent_line_item, $type)
1248
+	{
1249
+		return self::_get_nearest_descendant($parent_line_item, 'LIN_type', $type);
1250
+	}
1251
+
1252
+
1253
+	/**
1254
+	 * Uses a breadth-first-search in order to find the nearest descendant
1255
+	 * having the specified LIN_code and returns it, else NULL
1256
+	 *
1257
+	 * @uses  EEH_Line_Item::_get_nearest_descendant()
1258
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1259
+	 * @param string $code any value used for LIN_code
1260
+	 * @return EE_Line_Item
1261
+	 */
1262
+	public static function get_nearest_descendant_having_code(EE_Line_Item $parent_line_item, $code)
1263
+	{
1264
+		return self::_get_nearest_descendant($parent_line_item, 'LIN_code', $code);
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 * Uses a breadth-first-search in order to find the nearest descendant
1270
+	 * having the specified LIN_code and returns it, else NULL
1271
+	 *
1272
+	 * @param \EE_Line_Item $parent_line_item - the line item to find descendants of
1273
+	 * @param string $search_field name of EE_Line_Item property
1274
+	 * @param string $value any value stored in $search_field
1275
+	 * @return EE_Line_Item
1276
+	 */
1277
+	protected static function _get_nearest_descendant(EE_Line_Item $parent_line_item, $search_field, $value)
1278
+	{
1279
+		foreach ($parent_line_item->children() as $child) {
1280
+			if ($child->get($search_field) == $value) {
1281
+				return $child;
1282
+			}
1283
+		}
1284
+		foreach ($parent_line_item->children() as $child) {
1285
+			$descendant_found = self::_get_nearest_descendant($child, $search_field, $value);
1286
+			if ($descendant_found) {
1287
+				return $descendant_found;
1288
+			}
1289
+		}
1290
+		return NULL;
1291
+	}
1292
+
1293
+
1294
+	/**
1295
+	 * if passed line item has a TXN ID, uses that to jump directly to the grand total line item for the transaction,
1296
+	 * else recursively walks up the line item tree until a parent of type total is found,
1297
+	 *
1298
+	 * @param EE_Line_Item $line_item
1299
+	 * @return \EE_Line_Item
1300
+	 * @throws \EE_Error
1301
+	 */
1302
+	public static function find_transaction_grand_total_for_line_item(EE_Line_Item $line_item)
1303
+	{
1304
+		if ($line_item->TXN_ID()) {
1305
+			$total_line_item = $line_item->transaction()->total_line_item(false);
1306
+			if ($total_line_item instanceof EE_Line_Item) {
1307
+				return $total_line_item;
1308
+			}
1309
+		} else {
1310
+			$line_item_parent = $line_item->parent();
1311
+			if ($line_item_parent instanceof EE_Line_Item) {
1312
+				if ($line_item_parent->is_total()) {
1313
+					return $line_item_parent;
1314
+				}
1315
+				return EEH_Line_Item::find_transaction_grand_total_for_line_item($line_item_parent);
1316
+			}
1317
+		}
1318
+		throw new EE_Error(
1319
+			sprintf(
1320
+				__('A valid grand total for line item %1$d was not found.', 'event_espresso'),
1321
+				$line_item->ID()
1322
+			)
1323
+		);
1324
+	}
1325
+
1326
+
1327
+	/**
1328
+	 * Prints out a representation of the line item tree
1329
+	 *
1330
+	 * @param EE_Line_Item $line_item
1331
+	 * @param int $indentation
1332
+	 * @return void
1333
+	 * @throws \EE_Error
1334
+	 */
1335
+	public static function visualize(EE_Line_Item $line_item, $indentation = 0)
1336
+	{
1337
+		echo defined('EE_TESTS_DIR') ? "\n" : '<br />';
1338
+		if (!$indentation) {
1339
+			echo defined('EE_TESTS_DIR') ? "\n" : '<br />';
1340
+		}
1341
+		for ($i = 0; $i < $indentation; $i++) {
1342
+			echo ". ";
1343
+		}
1344
+		$breakdown = '';
1345
+		if ($line_item->is_line_item()) {
1346
+			if ($line_item->is_percent()) {
1347
+				$breakdown = "{$line_item->percent()}%";
1348
+			} else {
1349
+				$breakdown = '$' . "{$line_item->unit_price()} x {$line_item->quantity()}";
1350
+			}
1351
+		}
1352
+		echo $line_item->name() . " [ ID:{$line_item->ID()} | qty:{$line_item->quantity()} ] {$line_item->type()} : " . '$' . "{$line_item->total()}";
1353
+		if ($breakdown) {
1354
+			echo " ( {$breakdown} )";
1355
+		}
1356
+		if ($line_item->is_taxable()) {
1357
+			echo "  * taxable";
1358
+		}
1359
+		if ($line_item->children()) {
1360
+			foreach ($line_item->children() as $child) {
1361
+				self::visualize($child, $indentation + 1);
1362
+			}
1363
+		}
1364
+	}
1365
+
1366
+
1367
+	/**
1368
+	 * Calculates the registration's final price, taking into account that they
1369
+	 * need to not only help pay for their OWN ticket, but also any transaction-wide surcharges and taxes,
1370
+	 * and receive a portion of any transaction-wide discounts.
1371
+	 * eg1, if I buy a $1 ticket and brent buys a $9 ticket, and we receive a $5 discount
1372
+	 * then I'll get 1/10 of that $5 discount, which is $0.50, and brent will get
1373
+	 * 9/10ths of that $5 discount, which is $4.50. So my final price should be $0.50
1374
+	 * and brent's final price should be $5.50.
1375
+	 *
1376
+	 * In order to do this, we basically need to traverse the line item tree calculating
1377
+	 * the running totals (just as if we were recalculating the total), but when we identify
1378
+	 * regular line items, we need to keep track of their share of the grand total.
1379
+	 * Also, we need to keep track of the TAXABLE total for each ticket purchase, so
1380
+	 * we can know how to apply taxes to it. (Note: "taxable total" does not equal the "pretax total"
1381
+	 * when there are non-taxable items; otherwise they would be the same)
1382
+	 *
1383
+	 * @param EE_Line_Item $line_item
1384
+	 * @param array $billable_ticket_quantities array of EE_Ticket IDs and their corresponding quantity that
1385
+	 *                                                                            can be included in price calculations at this moment
1386
+	 * @return array        keys are line items for tickets IDs and values are their share of the running total,
1387
+	 *                                          plus the key 'total', and 'taxable' which also has keys of all the ticket IDs. Eg
1388
+	 *                                          array(
1389
+	 *                                          12 => 4.3
1390
+	 *                                          23 => 8.0
1391
+	 *                                          'total' => 16.6,
1392
+	 *                                          'taxable' => array(
1393
+	 *                                          12 => 10,
1394
+	 *                                          23 => 4
1395
+	 *                                          ).
1396
+	 *                                          So to find which registrations have which final price, we need to find which line item
1397
+	 *                                          is theirs, which can be done with
1398
+	 *                                          `EEM_Line_Item::instance()->get_line_item_for_registration( $registration );`
1399
+	 */
1400
+	public static function calculate_reg_final_prices_per_line_item(EE_Line_Item $line_item, $billable_ticket_quantities = array())
1401
+	{
1402
+		//init running grand total if not already
1403
+		if (!isset($running_totals['total'])) {
1404
+			$running_totals['total'] = 0;
1405
+		}
1406
+		if (!isset($running_totals['taxable'])) {
1407
+			$running_totals['taxable'] = array('total' => 0);
1408
+		}
1409
+		foreach ($line_item->children() as $child_line_item) {
1410
+			switch ($child_line_item->type()) {
1411
+
1412
+				case EEM_Line_Item::type_sub_total :
1413
+					$running_totals_from_subtotal = EEH_Line_Item::calculate_reg_final_prices_per_line_item($child_line_item, $billable_ticket_quantities);
1414
+					//combine arrays but preserve numeric keys
1415
+					$running_totals = array_replace_recursive($running_totals_from_subtotal, $running_totals);
1416
+					$running_totals['total'] += $running_totals_from_subtotal['total'];
1417
+					$running_totals['taxable']['total'] += $running_totals_from_subtotal['taxable']['total'];
1418
+					break;
1419
+
1420
+				case EEM_Line_Item::type_tax_sub_total :
1421
+
1422
+					//find how much the taxes percentage is
1423
+					if ($child_line_item->percent() !== 0) {
1424
+						$tax_percent_decimal = $child_line_item->percent() / 100;
1425
+					} else {
1426
+						$tax_percent_decimal = EE_Taxes::get_total_taxes_percentage() / 100;
1427
+					}
1428
+					//and apply to all the taxable totals, and add to the pretax totals
1429
+					foreach ($running_totals as $line_item_id => $this_running_total) {
1430
+						//"total" and "taxable" array key is an exception
1431
+						if ($line_item_id === 'taxable') {
1432
+							continue;
1433
+						}
1434
+						$taxable_total = $running_totals['taxable'][$line_item_id];
1435
+						$running_totals[$line_item_id] += ($taxable_total * $tax_percent_decimal);
1436
+					}
1437
+					break;
1438
+
1439
+				case EEM_Line_Item::type_line_item :
1440
+
1441
+					// ticket line items or ????
1442
+					if ($child_line_item->OBJ_type() === 'Ticket') {
1443
+						// kk it's a ticket
1444
+						if (isset($running_totals[$child_line_item->ID()])) {
1445
+							//huh? that shouldn't happen.
1446
+							$running_totals['total'] += $child_line_item->total();
1447
+						} else {
1448
+							//its not in our running totals yet. great.
1449
+							if ($child_line_item->is_taxable()) {
1450
+								$taxable_amount = $child_line_item->unit_price();
1451
+							} else {
1452
+								$taxable_amount = 0;
1453
+							}
1454
+							// are we only calculating totals for some tickets?
1455
+							if (isset($billable_ticket_quantities[$child_line_item->OBJ_ID()])) {
1456
+								$quantity = $billable_ticket_quantities[$child_line_item->OBJ_ID()];
1457
+								$running_totals[$child_line_item->ID()] = $quantity
1458
+									? $child_line_item->unit_price()
1459
+									: 0;
1460
+								$running_totals['taxable'][$child_line_item->ID()] = $quantity
1461
+									? $taxable_amount
1462
+									: 0;
1463
+							} else {
1464
+								$quantity = $child_line_item->quantity();
1465
+								$running_totals[$child_line_item->ID()] = $child_line_item->unit_price();
1466
+								$running_totals['taxable'][$child_line_item->ID()] = $taxable_amount;
1467
+							}
1468
+							$running_totals['taxable']['total'] += $taxable_amount * $quantity;
1469
+							$running_totals['total'] += $child_line_item->unit_price() * $quantity;
1470
+						}
1471
+					} else {
1472
+						// it's some other type of item added to the cart
1473
+						// it should affect the running totals
1474
+						// basically we want to convert it into a PERCENT modifier. Because
1475
+						// more clearly affect all registration's final price equally
1476
+						$line_items_percent_of_running_total = $running_totals['total'] > 0
1477
+							? ($child_line_item->total() / $running_totals['total']) + 1
1478
+							: 1;
1479
+						foreach ($running_totals as $line_item_id => $this_running_total) {
1480
+							//the "taxable" array key is an exception
1481
+							if ($line_item_id === 'taxable') {
1482
+								continue;
1483
+							}
1484
+							// update the running totals
1485
+							// yes this actually even works for the running grand total!
1486
+							$running_totals[$line_item_id] =
1487
+								$line_items_percent_of_running_total * $this_running_total;
1488
+
1489
+							if ($child_line_item->is_taxable()) {
1490
+								$running_totals['taxable'][$line_item_id] =
1491
+									$line_items_percent_of_running_total * $running_totals['taxable'][$line_item_id];
1492
+							}
1493
+						}
1494
+					}
1495
+					break;
1496
+			}
1497
+		}
1498
+		return $running_totals;
1499
+	}
1500
+
1501
+
1502
+	/**
1503
+	 * @param \EE_Line_Item $total_line_item
1504
+	 * @param \EE_Line_Item $ticket_line_item
1505
+	 * @return float | null
1506
+	 * @throws \OutOfRangeException
1507
+	 */
1508
+	public static function calculate_final_price_for_ticket_line_item(\EE_Line_Item $total_line_item, \EE_Line_Item $ticket_line_item)
1509
+	{
1510
+		static $final_prices_per_ticket_line_item = array();
1511
+		if (empty($final_prices_per_ticket_line_item)) {
1512
+			$final_prices_per_ticket_line_item = \EEH_Line_Item::calculate_reg_final_prices_per_line_item(
1513
+				$total_line_item
1514
+			);
1515
+		}
1516
+		//ok now find this new registration's final price
1517
+		if (isset($final_prices_per_ticket_line_item[$ticket_line_item->ID()])) {
1518
+			return $final_prices_per_ticket_line_item[$ticket_line_item->ID()];
1519
+		}
1520
+		$message = sprintf(
1521
+			__(
1522
+				'The final price for the ticket line item (ID:%1$d) could not be calculated.',
1523
+				'event_espresso'
1524
+			),
1525
+			$ticket_line_item->ID()
1526
+		);
1527
+		if (WP_DEBUG) {
1528
+			$message .= '<br>' . print_r($final_prices_per_ticket_line_item, true);
1529
+			throw new \OutOfRangeException($message);
1530
+		} else {
1531
+			EE_Log::instance()->log(__CLASS__, __FUNCTION__, $message);
1532
+		}
1533
+		return null;
1534
+	}
1535
+
1536
+
1537
+	/**
1538
+	 * Creates a duplicate of the line item tree, except only includes billable items
1539
+	 * and the portion of line items attributed to billable things
1540
+	 *
1541
+	 * @param EE_Line_Item $line_item
1542
+	 * @param EE_Registration[] $registrations
1543
+	 * @return \EE_Line_Item
1544
+	 * @throws \EE_Error
1545
+	 */
1546
+	public static function billable_line_item_tree(EE_Line_Item $line_item, $registrations)
1547
+	{
1548
+		$copy_li = EEH_Line_Item::billable_line_item($line_item, $registrations);
1549
+		foreach ($line_item->children() as $child_li) {
1550
+			$copy_li->add_child_line_item(EEH_Line_Item::billable_line_item_tree($child_li, $registrations));
1551
+		}
1552
+		//if this is the grand total line item, make sure the totals all add up
1553
+		//(we could have duplicated this logic AS we copied the line items, but
1554
+		//it seems DRYer this way)
1555
+		if ($copy_li->type() === EEM_Line_Item::type_total) {
1556
+			$copy_li->recalculate_total_including_taxes();
1557
+		}
1558
+		return $copy_li;
1559
+	}
1560
+
1561
+
1562
+	/**
1563
+	 * Creates a new, unsaved line item from $line_item that factors in the
1564
+	 * number of billable registrations on $registrations.
1565
+	 *
1566
+	 * @param EE_Line_Item $line_item
1567
+	 * @return EE_Line_Item
1568
+	 * @throws \EE_Error
1569
+	 * @param EE_Registration[] $registrations
1570
+	 */
1571
+	public static function billable_line_item(EE_Line_Item $line_item, $registrations)
1572
+	{
1573
+		$new_li_fields = $line_item->model_field_array();
1574
+		if ($line_item->type() === EEM_Line_Item::type_line_item &&
1575
+			$line_item->OBJ_type() === 'Ticket'
1576
+		) {
1577
+			$count = 0;
1578
+			foreach ($registrations as $registration) {
1579
+				if ($line_item->OBJ_ID() === $registration->ticket_ID() &&
1580
+					in_array($registration->status_ID(), EEM_Registration::reg_statuses_that_allow_payment())
1581
+				) {
1582
+					$count++;
1583
+				}
1584
+			}
1585
+			$new_li_fields['LIN_quantity'] = $count;
1586
+		}
1587
+		//don't set the total. We'll leave that up to the code that calculates it
1588
+		unset($new_li_fields['LIN_ID'], $new_li_fields['LIN_parent'], $new_li_fields['LIN_total']);
1589
+		return EE_Line_Item::new_instance($new_li_fields);
1590
+	}
1591
+
1592
+
1593
+	/**
1594
+	 * Returns a modified line item tree where all the subtotals which have a total of 0
1595
+	 * are removed, and line items with a quantity of 0
1596
+	 *
1597
+	 * @param EE_Line_Item $line_item |null
1598
+	 * @return \EE_Line_Item|null
1599
+	 * @throws \EE_Error
1600
+	 */
1601
+	public static function non_empty_line_items(EE_Line_Item $line_item)
1602
+	{
1603
+		$copied_li = EEH_Line_Item::non_empty_line_item($line_item);
1604
+		if ($copied_li === null) {
1605
+			return null;
1606
+		}
1607
+		//if this is an event subtotal, we want to only include it if it
1608
+		//has a non-zero total and at least one ticket line item child
1609
+		$ticket_children = 0;
1610
+		foreach ($line_item->children() as $child_li) {
1611
+			$child_li_copy = EEH_Line_Item::non_empty_line_items($child_li);
1612
+			if ($child_li_copy !== null) {
1613
+				$copied_li->add_child_line_item($child_li_copy);
1614
+				if ($child_li_copy->type() === EEM_Line_Item::type_line_item &&
1615
+					$child_li_copy->OBJ_type() === 'Ticket'
1616
+				) {
1617
+					$ticket_children++;
1618
+				}
1619
+			}
1620
+		}
1621
+		//if this is an event subtotal with NO ticket children
1622
+		//we basically want to ignore it
1623
+		if (
1624
+			$ticket_children === 0
1625
+			&& $line_item->type() === EEM_Line_Item::type_sub_total
1626
+			&& $line_item->OBJ_type() === 'Event'
1627
+			&& $line_item->total() === 0
1628
+		) {
1629
+			return null;
1630
+		}
1631
+		return $copied_li;
1632
+	}
1633
+
1634
+
1635
+	/**
1636
+	 * Creates a new, unsaved line item, but if it's a ticket line item
1637
+	 * with a total of 0, or a subtotal of 0, returns null instead
1638
+	 *
1639
+	 * @param EE_Line_Item $line_item
1640
+	 * @return EE_Line_Item
1641
+	 * @throws \EE_Error
1642
+	 */
1643
+	public static function non_empty_line_item(EE_Line_Item $line_item)
1644
+	{
1645
+		if ($line_item->type() === EEM_Line_Item::type_line_item &&
1646
+			$line_item->OBJ_type() === 'Ticket' &&
1647
+			$line_item->quantity() === 0
1648
+		) {
1649
+			return null;
1650
+		}
1651
+		$new_li_fields = $line_item->model_field_array();
1652
+		//don't set the total. We'll leave that up to the code that calculates it
1653
+		unset($new_li_fields['LIN_ID'], $new_li_fields['LIN_parent']);
1654
+		return EE_Line_Item::new_instance($new_li_fields);
1655
+	}
1656
+
1657
+
1658
+
1659
+	/**************************************** @DEPRECATED METHODS *************************************** */
1660
+	/**
1661
+	 * @deprecated
1662
+	 * @param EE_Line_Item $total_line_item
1663
+	 * @return \EE_Line_Item
1664
+	 * @throws \EE_Error
1665
+	 */
1666
+	public static function get_items_subtotal(EE_Line_Item $total_line_item)
1667
+	{
1668
+		EE_Error::doing_it_wrong('EEH_Line_Item::get_items_subtotal()', __('Method replaced with EEH_Line_Item::get_pre_tax_subtotal()', 'event_espresso'), '4.6.0');
1669
+		return self::get_pre_tax_subtotal($total_line_item);
1670
+	}
1671
+
1672
+
1673
+	/**
1674
+	 * @deprecated
1675
+	 * @param EE_Transaction $transaction
1676
+	 * @return \EE_Line_Item
1677
+	 * @throws \EE_Error
1678
+	 */
1679
+	public static function create_default_total_line_item($transaction = NULL)
1680
+	{
1681
+		EE_Error::doing_it_wrong('EEH_Line_Item::create_default_total_line_item()', __('Method replaced with EEH_Line_Item::create_total_line_item()', 'event_espresso'), '4.6.0');
1682
+		return self::create_total_line_item($transaction);
1683
+	}
1684
+
1685
+
1686
+	/**
1687
+	 * @deprecated
1688
+	 * @param EE_Line_Item $total_line_item
1689
+	 * @param EE_Transaction $transaction
1690
+	 * @return \EE_Line_Item
1691
+	 * @throws \EE_Error
1692
+	 */
1693
+	public static function create_default_tickets_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
1694
+	{
1695
+		EE_Error::doing_it_wrong('EEH_Line_Item::create_default_tickets_subtotal()', __('Method replaced with EEH_Line_Item::create_pre_tax_subtotal()', 'event_espresso'), '4.6.0');
1696
+		return self::create_pre_tax_subtotal($total_line_item, $transaction);
1697
+	}
1698
+
1699
+
1700
+	/**
1701
+	 * @deprecated
1702
+	 * @param EE_Line_Item $total_line_item
1703
+	 * @param EE_Transaction $transaction
1704
+	 * @return \EE_Line_Item
1705
+	 * @throws \EE_Error
1706
+	 */
1707
+	public static function create_default_taxes_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
1708
+	{
1709
+		EE_Error::doing_it_wrong('EEH_Line_Item::create_default_taxes_subtotal()', __('Method replaced with EEH_Line_Item::create_taxes_subtotal()', 'event_espresso'), '4.6.0');
1710
+		return self::create_taxes_subtotal($total_line_item, $transaction);
1711
+	}
1712
+
1713
+
1714
+	/**
1715
+	 * @deprecated
1716
+	 * @param EE_Line_Item $total_line_item
1717
+	 * @param EE_Transaction $transaction
1718
+	 * @return \EE_Line_Item
1719
+	 * @throws \EE_Error
1720
+	 */
1721
+	public static function create_default_event_subtotal(EE_Line_Item $total_line_item, $transaction = NULL)
1722
+	{
1723
+		EE_Error::doing_it_wrong('EEH_Line_Item::create_default_event_subtotal()', __('Method replaced with EEH_Line_Item::create_event_subtotal()', 'event_espresso'), '4.6.0');
1724
+		return self::create_event_subtotal($total_line_item, $transaction);
1725
+	}
1726 1726
 
1727 1727
 
1728 1728
 }
Please login to merge, or discard this patch.
Spacing   +31 added lines, -31 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@  discard block
 block discarded – undo
1
-<?php if (!defined('EVENT_ESPRESSO_VERSION')) {
1
+<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2 2
     exit('No direct script access allowed');
3 3
 }
4 4
 
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
             'LIN_percent' => null,
60 60
             'LIN_is_taxable' => $taxable,
61 61
             'LIN_order' => $items_subtotal instanceof EE_Line_Item ? count($items_subtotal->children()) : 0,
62
-            'LIN_total' => (float)$unit_price * (int)$quantity,
62
+            'LIN_total' => (float) $unit_price * (int) $quantity,
63 63
             'LIN_type' => EEM_Line_Item::type_line_item,
64 64
             'LIN_code' => $code,
65 65
         ));
@@ -98,7 +98,7 @@  discard block
 block discarded – undo
98 98
             'LIN_percent' => $percentage_amount,
99 99
             'LIN_quantity' => NULL,
100 100
             'LIN_is_taxable' => $taxable,
101
-            'LIN_total' => (float)($percentage_amount * ($parent_line_item->total() / 100)),
101
+            'LIN_total' => (float) ($percentage_amount * ($parent_line_item->total() / 100)),
102 102
             'LIN_type' => EEM_Line_Item::type_line_item,
103 103
             'LIN_parent' => $parent_line_item->ID()
104 104
         ));
@@ -128,13 +128,13 @@  discard block
 block discarded – undo
128 128
      */
129 129
     public static function add_ticket_purchase(EE_Line_Item $total_line_item, EE_Ticket $ticket, $qty = 1)
130 130
     {
131
-        if (!$total_line_item instanceof EE_Line_Item || !$total_line_item->is_total()) {
131
+        if ( ! $total_line_item instanceof EE_Line_Item || ! $total_line_item->is_total()) {
132 132
             throw new EE_Error(sprintf(__('A valid line item total is required in order to add tickets. A line item of type "%s" was passed.', 'event_espresso'), $ticket->ID(), $total_line_item->ID()));
133 133
         }
134 134
         // either increment the qty for an existing ticket
135 135
         $line_item = self::increment_ticket_qty_if_already_in_cart($total_line_item, $ticket, $qty);
136 136
         // or add a new one
137
-        if (!$line_item instanceof EE_Line_Item) {
137
+        if ( ! $line_item instanceof EE_Line_Item) {
138 138
             $line_item = self::create_ticket_line_item($total_line_item, $ticket, $qty);
139 139
         }
140 140
         $total_line_item->recalculate_total_including_taxes();
@@ -155,10 +155,10 @@  discard block
 block discarded – undo
155 155
         $line_item = null;
156 156
         if ($total_line_item instanceof EE_Line_Item && $total_line_item->is_total()) {
157 157
             $ticket_line_items = EEH_Line_Item::get_ticket_line_items($total_line_item);
158
-            foreach ((array)$ticket_line_items as $ticket_line_item) {
158
+            foreach ((array) $ticket_line_items as $ticket_line_item) {
159 159
                 if (
160 160
                     $ticket_line_item instanceof EE_Line_Item
161
-                    && (int)$ticket_line_item->OBJ_ID() === (int)$ticket->ID()
161
+                    && (int) $ticket_line_item->OBJ_ID() === (int) $ticket->ID()
162 162
                 ) {
163 163
                     $line_item = $ticket_line_item;
164 164
                     break;
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
      */
185 185
     public static function increment_quantity(EE_Line_Item $line_item, $qty = 1)
186 186
     {
187
-        if (!$line_item->is_percent()) {
187
+        if ( ! $line_item->is_percent()) {
188 188
             $qty += $line_item->quantity();
189 189
             $line_item->set_quantity($qty);
190 190
             $line_item->set_total($line_item->unit_price() * $qty);
@@ -209,7 +209,7 @@  discard block
 block discarded – undo
209 209
      */
210 210
     public static function decrement_quantity(EE_Line_Item $line_item, $qty = 1)
211 211
     {
212
-        if (!$line_item->is_percent()) {
212
+        if ( ! $line_item->is_percent()) {
213 213
             $qty = $line_item->quantity() - $qty;
214 214
             $qty = max($qty, 0);
215 215
             $line_item->set_quantity($qty);
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
      */
235 235
     public static function update_quantity(EE_Line_Item $line_item, $new_quantity)
236 236
     {
237
-        if (!$line_item->is_percent()) {
237
+        if ( ! $line_item->is_percent()) {
238 238
             $line_item->set_quantity($new_quantity);
239 239
             $line_item->set_total($line_item->unit_price() * $new_quantity);
240 240
             $line_item->save();
@@ -270,7 +270,7 @@  discard block
 block discarded – undo
270 270
         // add $ticket to cart
271 271
         $line_item = EE_Line_Item::new_instance(array(
272 272
             'LIN_name' => $ticket->name(),
273
-            'LIN_desc' => $ticket->description() !== '' ? $ticket->description() . ' ' . $event : $event,
273
+            'LIN_desc' => $ticket->description() !== '' ? $ticket->description().' '.$event : $event,
274 274
             'LIN_unit_price' => $ticket->price(),
275 275
             'LIN_quantity' => $qty,
276 276
             'LIN_is_taxable' => $ticket->taxable(),
@@ -380,8 +380,8 @@  discard block
 block discarded – undo
380 380
         foreach ($ticket_line_item->children() as $child_line_item) {
381 381
             if (
382 382
                 $child_line_item->is_sub_line_item()
383
-                && !$child_line_item->is_percent()
384
-                && !$child_line_item->is_cancellation()
383
+                && ! $child_line_item->is_percent()
384
+                && ! $child_line_item->is_cancellation()
385 385
             ) {
386 386
                 $child_line_item->set_quantity($child_line_item->quantity() - $qty);
387 387
             }
@@ -403,7 +403,7 @@  discard block
 block discarded – undo
403 403
                 'LIN_desc' => sprintf(
404 404
                     _x('Cancelled %1$s : %2$s', 'Cancelled Ticket Name : 2015-01-01 11:11', 'event_espresso'),
405 405
                     $ticket_line_item->name(),
406
-                    current_time(get_option('date_format') . ' ' . get_option('time_format'))
406
+                    current_time(get_option('date_format').' '.get_option('time_format'))
407 407
                 ),
408 408
                 'LIN_unit_price' => 0, // $ticket_line_item->unit_price()
409 409
                 'LIN_quantity' => $qty,
@@ -456,7 +456,7 @@  discard block
 block discarded – undo
456 456
         );
457 457
         $cancellation_line_item = reset($cancellation_line_item);
458 458
         // verify that this ticket was indeed previously cancelled
459
-        if (!$cancellation_line_item instanceof EE_Line_Item) {
459
+        if ( ! $cancellation_line_item instanceof EE_Line_Item) {
460 460
             return false;
461 461
         }
462 462
         if ($cancellation_line_item->quantity() > $qty) {
@@ -628,7 +628,7 @@  discard block
 block discarded – undo
628 628
             'LIN_code' => 'taxes',
629 629
             'LIN_name' => __('Taxes', 'event_espresso'),
630 630
             'LIN_type' => EEM_Line_Item::type_tax_sub_total,
631
-            'LIN_order' => 1000,//this should always come last
631
+            'LIN_order' => 1000, //this should always come last
632 632
         ));
633 633
         $tax_line_item = apply_filters(
634 634
             'FHEE__EEH_Line_Item__create_taxes_subtotal__tax_line_item',
@@ -680,7 +680,7 @@  discard block
 block discarded – undo
680 680
      */
681 681
     public static function get_event_code($event)
682 682
     {
683
-        return 'event-' . ($event instanceof EE_Event ? $event->ID() : '0');
683
+        return 'event-'.($event instanceof EE_Event ? $event->ID() : '0');
684 684
     }
685 685
 
686 686
     /**
@@ -716,13 +716,13 @@  discard block
 block discarded – undo
716 716
     public static function get_event_line_item_for_ticket(EE_Line_Item $grand_total, EE_Ticket $ticket)
717 717
     {
718 718
         $first_datetime = $ticket->first_datetime();
719
-        if (!$first_datetime instanceof EE_Datetime) {
719
+        if ( ! $first_datetime instanceof EE_Datetime) {
720 720
             throw new EE_Error(
721 721
                 sprintf(__('The supplied ticket (ID %d) has no datetimes', 'event_espresso'), $ticket->ID())
722 722
             );
723 723
         }
724 724
         $event = $first_datetime->event();
725
-        if (!$event instanceof EE_Event) {
725
+        if ( ! $event instanceof EE_Event) {
726 726
             throw new EE_Error(
727 727
                 sprintf(
728 728
                     __('The supplied ticket (ID %d) has no event data associated with it.', 'event_espresso'),
@@ -731,7 +731,7 @@  discard block
 block discarded – undo
731 731
             );
732 732
         }
733 733
         $events_sub_total = EEH_Line_Item::get_event_line_item($grand_total, $event);
734
-        if (!$events_sub_total instanceof EE_Line_Item) {
734
+        if ( ! $events_sub_total instanceof EE_Line_Item) {
735 735
             throw new EE_Error(
736 736
                 sprintf(
737 737
                     __('There is no events sub-total for ticket %s on total line item %d', 'event_espresso'),
@@ -760,7 +760,7 @@  discard block
 block discarded – undo
760 760
         $found = false;
761 761
         foreach (EEH_Line_Item::get_event_subtotals($grand_total) as $event_line_item) {
762 762
             // default event subtotal, we should only ever find this the first time this method is called
763
-            if (!$event_line_item->OBJ_ID()) {
763
+            if ( ! $event_line_item->OBJ_ID()) {
764 764
                 // let's use this! but first... set the event details
765 765
                 EEH_Line_Item::set_event_subtotal_details($event_line_item, $event);
766 766
                 $found = true;
@@ -771,7 +771,7 @@  discard block
 block discarded – undo
771 771
                 break;
772 772
             }
773 773
         }
774
-        if (!$found) {
774
+        if ( ! $found) {
775 775
             //there is no event sub-total yet, so add it
776 776
             $pre_tax_subtotal = EEH_Line_Item::get_pre_tax_subtotal($grand_total);
777 777
             // create a new "event" subtotal below that
@@ -866,7 +866,7 @@  discard block
 block discarded – undo
866 866
     public static function ensure_taxes_applied($total_line_item)
867 867
     {
868 868
         $taxes_subtotal = self::get_taxes_subtotal($total_line_item);
869
-        if (!$taxes_subtotal->children()) {
869
+        if ( ! $taxes_subtotal->children()) {
870 870
             self::apply_taxes($total_line_item);
871 871
         }
872 872
         return $taxes_subtotal->total();
@@ -927,7 +927,7 @@  discard block
 block discarded – undo
927 927
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
928 928
 
929 929
         // check if only a single line_item_id was passed
930
-        if (!empty($line_item_codes) && !is_array($line_item_codes)) {
930
+        if ( ! empty($line_item_codes) && ! is_array($line_item_codes)) {
931 931
             // place single line_item_id in an array to appear as multiple line_item_ids
932 932
             $line_item_codes = array($line_item_codes);
933 933
         }
@@ -1030,7 +1030,7 @@  discard block
 block discarded – undo
1030 1030
         if ($code_substring_for_whitelist !== null) {
1031 1031
             $whitelisted = strpos($line_item->code(), $code_substring_for_whitelist) !== false ? true : false;
1032 1032
         }
1033
-        if (!$whitelisted && $line_item->is_line_item()) {
1033
+        if ( ! $whitelisted && $line_item->is_line_item()) {
1034 1034
             $line_item->set_is_taxable($taxable);
1035 1035
         }
1036 1036
         foreach ($line_item->children() as $child_line_item) {
@@ -1335,7 +1335,7 @@  discard block
 block discarded – undo
1335 1335
     public static function visualize(EE_Line_Item $line_item, $indentation = 0)
1336 1336
     {
1337 1337
         echo defined('EE_TESTS_DIR') ? "\n" : '<br />';
1338
-        if (!$indentation) {
1338
+        if ( ! $indentation) {
1339 1339
             echo defined('EE_TESTS_DIR') ? "\n" : '<br />';
1340 1340
         }
1341 1341
         for ($i = 0; $i < $indentation; $i++) {
@@ -1346,10 +1346,10 @@  discard block
 block discarded – undo
1346 1346
             if ($line_item->is_percent()) {
1347 1347
                 $breakdown = "{$line_item->percent()}%";
1348 1348
             } else {
1349
-                $breakdown = '$' . "{$line_item->unit_price()} x {$line_item->quantity()}";
1349
+                $breakdown = '$'."{$line_item->unit_price()} x {$line_item->quantity()}";
1350 1350
             }
1351 1351
         }
1352
-        echo $line_item->name() . " [ ID:{$line_item->ID()} | qty:{$line_item->quantity()} ] {$line_item->type()} : " . '$' . "{$line_item->total()}";
1352
+        echo $line_item->name()." [ ID:{$line_item->ID()} | qty:{$line_item->quantity()} ] {$line_item->type()} : ".'$'."{$line_item->total()}";
1353 1353
         if ($breakdown) {
1354 1354
             echo " ( {$breakdown} )";
1355 1355
         }
@@ -1400,10 +1400,10 @@  discard block
 block discarded – undo
1400 1400
     public static function calculate_reg_final_prices_per_line_item(EE_Line_Item $line_item, $billable_ticket_quantities = array())
1401 1401
     {
1402 1402
         //init running grand total if not already
1403
-        if (!isset($running_totals['total'])) {
1403
+        if ( ! isset($running_totals['total'])) {
1404 1404
             $running_totals['total'] = 0;
1405 1405
         }
1406
-        if (!isset($running_totals['taxable'])) {
1406
+        if ( ! isset($running_totals['taxable'])) {
1407 1407
             $running_totals['taxable'] = array('total' => 0);
1408 1408
         }
1409 1409
         foreach ($line_item->children() as $child_line_item) {
@@ -1525,7 +1525,7 @@  discard block
 block discarded – undo
1525 1525
             $ticket_line_item->ID()
1526 1526
         );
1527 1527
         if (WP_DEBUG) {
1528
-            $message .= '<br>' . print_r($final_prices_per_ticket_line_item, true);
1528
+            $message .= '<br>'.print_r($final_prices_per_ticket_line_item, true);
1529 1529
             throw new \OutOfRangeException($message);
1530 1530
         } else {
1531 1531
             EE_Log::instance()->log(__CLASS__, __FUNCTION__, $message);
Please login to merge, or discard this patch.
core/db_models/EEM_Line_Item.model.php 3 patches
Indentation   +375 added lines, -375 removed lines patch added patch discarded remove patch
@@ -41,384 +41,384 @@
 block discarded – undo
41 41
 class EEM_Line_Item extends EEM_Base
42 42
 {
43 43
 
44
-    /**
45
-     * Tax sub-total is just the total of all the taxes, which should be children
46
-     * of this line item. There should only ever be one tax sub-total, and it should
47
-     * be a direct child of
48
-     */
49
-    const type_tax_sub_total = 'tax-sub-total';
50
-
51
-    /**
52
-     * Tax line items indicate a tax applied to all the taxable line items.
53
-     * Should not have any children line items.
54
-     */
55
-    const type_tax = 'tax';
56
-
57
-    /**
58
-     * Indicating individual items purchased, or discounts or surcharges.
59
-     * The sum of all the regular line items  plus the tax items should equal
60
-     * the grand total.
61
-     * Possible children fo sub-line-items and cancellations.
62
-     */
63
-    const type_line_item = 'line-item';
64
-
65
-    /**
66
-     * line item indicating all the factors that make a single line item.
67
-     * Sub-line items should have NO children line items.
68
-     */
69
-    const type_sub_line_item = 'sub-item';
70
-
71
-    /**
72
-     * line item indicating a sub-total (eg total for an event, or before taxes).
73
-     * Direct children can be line items and other sub-totals
74
-     *
75
-     */
76
-    const type_sub_total = 'sub-total';
77
-
78
-    /**
79
-     * line item for teh grand total of an order. Its direct children
80
-     * should be tax subtotals and subtotals, and possibly a regular line item
81
-     * indicating a transaction-wide discount/surcharge
82
-     */
83
-    const type_total = 'total';
84
-
85
-    /**
86
-     * When a line item is cancelled, a sub-line-item of type 'cancellation'
87
-     * should be created, indicating the quantity that were cancelled
88
-     * (because a line item could have a quantity of 1, and its cancellation item
89
-     * could be for 3, indicating that originally 4 were purchased, but 3 have been
90
-     * cancelled, and only one remains).
91
-     * When items are refunded, a cancellation line item should be made, which points
92
-     * to teh payment model object which actually refunded the payment.
93
-     * Cancellations should NOT have any children line items; the should NOT affect
94
-     * any calculations, and are only meant as a record that cancellations have occurred.
95
-     */
96
-    const type_cancellation = 'cancellation';
97
-
98
-    // private instance of the EEM_Line_Item object
99
-    protected static $_instance = NULL;
100
-
101
-
102
-    /**
103
-     *        private constructor to prevent direct creation
104
-     * @Constructor
105
-     * @access protected
106
-     * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved).  Note this just sends the timezone info to the date time model field objects.  Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option)
107
-     * @return \EEM_Line_Item
108
-     */
109
-    protected function __construct($timezone)
110
-    {
111
-        $this->singular_item = __('Line Item', 'event_espresso');
112
-        $this->plural_item = __('Line Items', 'event_espresso');
113
-
114
-        $this->_tables = array(
115
-            'Line_Item' => new EE_Primary_Table('esp_line_item', 'LIN_ID')
116
-        );
117
-        $line_items_can_be_for = apply_filters('FHEE__EEM_Line_Item__line_items_can_be_for', array('Ticket', 'Price', 'Event'));
118
-        $this->_fields = array(
119
-            'Line_Item' => array(
120
-                'LIN_ID' => new EE_Primary_Key_Int_Field('LIN_ID', __("ID", "event_espresso")),
121
-                'LIN_code' => new EE_Slug_Field('LIN_code', __("Code for index into Cart", "event_espresso"), TRUE),
122
-                'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', __("Transaction ID", "event_espresso"), TRUE, NULL, 'Transaction'),
123
-                'LIN_name' => new EE_Full_HTML_Field('LIN_name', __("Line Item Name", "event_espresso"), FALSE, ''),
124
-                'LIN_desc' => new EE_Full_HTML_Field('LIN_desc', __("Line Item Description", "event_espresso"), TRUE),
125
-                'LIN_unit_price' => new EE_Money_Field('LIN_unit_price', __("Unit Price", "event_espresso"), FALSE, 0),
126
-                'LIN_percent' => new EE_Float_Field('LIN_percent', __("Percent", "event_espresso"), FALSE, 0),
127
-                'LIN_is_taxable' => new EE_Boolean_Field('LIN_is_taxable', __("Taxable", "event_espresso"), FALSE, FALSE),
128
-                'LIN_order' => new EE_Integer_Field('LIN_order', __("Order of Application towards total of parent", "event_espresso"), FALSE, 1),
129
-                'LIN_total' => new EE_Money_Field('LIN_total', __("Total (unit price x quantity)", "event_espresso"), FALSE, 0),
130
-                'LIN_quantity' => new EE_Integer_Field('LIN_quantity', __("Quantity", "event_espresso"), TRUE, 1),
131
-                'LIN_parent' => new EE_Integer_Field('LIN_parent', __("Parent ID (this item goes towards that Line Item's total)", "event_espresso"), TRUE, NULL),
132
-                'LIN_type' => new EE_Enum_Text_Field('LIN_type', __("Type", "event_espresso"), FALSE, 'line-item', array(
133
-                        self::type_line_item => __("Line Item", "event_espresso"),
134
-                        self::type_sub_line_item => __("Sub-Item", "event_espresso"),
135
-                        self::type_sub_total => __("Subtotal", "event_espresso"),
136
-                        self::type_tax_sub_total => __("Tax Subtotal", "event_espresso"),
137
-                        self::type_tax => __("Tax", "event_espresso"),
138
-                        self::type_total => __("Total", "event_espresso"),
139
-                        self::type_cancellation => __('Cancellation', 'event_espresso')
140
-                    )
141
-                ),
142
-                'OBJ_ID' => new EE_Foreign_Key_Int_Field('OBJ_ID', __('ID of Item purchased.', 'event_espresso'), TRUE, NULL, $line_items_can_be_for),
143
-                'OBJ_type' => new EE_Any_Foreign_Model_Name_Field('OBJ_type', __("Model Name this Line Item is for", "event_espresso"), TRUE, NULL, $line_items_can_be_for),
144
-                'LIN_timestamp' => new EE_Datetime_Field('LIN_timestamp', __('When the line item was created', 'event_espresso'), false, EE_Datetime_Field::now, $timezone),
145
-            )
146
-        );
147
-        $this->_model_relations = array(
148
-            'Transaction' => new EE_Belongs_To_Relation(),
149
-            'Ticket' => new EE_Belongs_To_Any_Relation(),
150
-            'Price' => new EE_Belongs_To_Any_Relation(),
151
-            'Event' => new EE_Belongs_To_Any_Relation()
152
-        );
153
-        $this->_model_chain_to_wp_user = 'Transaction.Registration.Event';
154
-        $this->_caps_slug = 'transactions';
155
-        parent::__construct($timezone);
156
-    }
157
-
158
-
159
-    /**
160
-     * Gets all the line items for this transaction of the given type
161
-     * @param string $line_item_type like one of EEM_Line_Item::type_*
162
-     * @param EE_Transaction|int $transaction
163
-     * @return EE_Line_Item[]
164
-     */
165
-    public function get_all_of_type_for_transaction($line_item_type, $transaction)
166
-    {
167
-        $transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
168
-        return $this->get_all(array(array(
169
-            'LIN_type' => $line_item_type,
170
-            'TXN_ID' => $transaction
171
-        )));
172
-    }
173
-
174
-
175
-    /**
176
-     * Gets all line items unrelated to tickets that are normal line items
177
-     * (eg shipping, promotions, and miscellaneous other stuff should probably fit in this category)
178
-     * @param EE_Transaction|int $transaction
179
-     * @return EE_Line_Item[]
180
-     */
181
-    public function get_all_non_ticket_line_items_for_transaction($transaction)
182
-    {
183
-        $transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
184
-        return $this->get_all(array(array(
185
-            'LIN_type' => self::type_line_item,
186
-            'TXN_ID' => $transaction,
187
-            'OR' => array(
188
-                'OBJ_type*notticket' => array('!=', 'Ticket'),
189
-                'OBJ_type*null' => array('IS_NULL'))
190
-        )));
191
-    }
192
-
193
-    /**
194
-     * Deletes line items with no transaction who have passed the transaction cutoff time.
195
-     * This needs to be very efficient
196
-     * because if there are spam bots afoot there will be LOTS of line items
197
-     * @return int count of how many deleted
198
-     */
199
-    public function delete_line_items_with_no_transaction()
200
-    {
201
-        /** @type WPDB $wpdb */
202
-        global $wpdb;
203
-        $time_to_leave_alone = apply_filters(
204
-            'FHEE__EEM_Line_Item__delete_line_items_with_no_transaction__time_to_leave_alone', WEEK_IN_SECONDS
205
-        );
206
-        $query = $wpdb->prepare(
207
-            'DELETE li
44
+	/**
45
+	 * Tax sub-total is just the total of all the taxes, which should be children
46
+	 * of this line item. There should only ever be one tax sub-total, and it should
47
+	 * be a direct child of
48
+	 */
49
+	const type_tax_sub_total = 'tax-sub-total';
50
+
51
+	/**
52
+	 * Tax line items indicate a tax applied to all the taxable line items.
53
+	 * Should not have any children line items.
54
+	 */
55
+	const type_tax = 'tax';
56
+
57
+	/**
58
+	 * Indicating individual items purchased, or discounts or surcharges.
59
+	 * The sum of all the regular line items  plus the tax items should equal
60
+	 * the grand total.
61
+	 * Possible children fo sub-line-items and cancellations.
62
+	 */
63
+	const type_line_item = 'line-item';
64
+
65
+	/**
66
+	 * line item indicating all the factors that make a single line item.
67
+	 * Sub-line items should have NO children line items.
68
+	 */
69
+	const type_sub_line_item = 'sub-item';
70
+
71
+	/**
72
+	 * line item indicating a sub-total (eg total for an event, or before taxes).
73
+	 * Direct children can be line items and other sub-totals
74
+	 *
75
+	 */
76
+	const type_sub_total = 'sub-total';
77
+
78
+	/**
79
+	 * line item for teh grand total of an order. Its direct children
80
+	 * should be tax subtotals and subtotals, and possibly a regular line item
81
+	 * indicating a transaction-wide discount/surcharge
82
+	 */
83
+	const type_total = 'total';
84
+
85
+	/**
86
+	 * When a line item is cancelled, a sub-line-item of type 'cancellation'
87
+	 * should be created, indicating the quantity that were cancelled
88
+	 * (because a line item could have a quantity of 1, and its cancellation item
89
+	 * could be for 3, indicating that originally 4 were purchased, but 3 have been
90
+	 * cancelled, and only one remains).
91
+	 * When items are refunded, a cancellation line item should be made, which points
92
+	 * to teh payment model object which actually refunded the payment.
93
+	 * Cancellations should NOT have any children line items; the should NOT affect
94
+	 * any calculations, and are only meant as a record that cancellations have occurred.
95
+	 */
96
+	const type_cancellation = 'cancellation';
97
+
98
+	// private instance of the EEM_Line_Item object
99
+	protected static $_instance = NULL;
100
+
101
+
102
+	/**
103
+	 *        private constructor to prevent direct creation
104
+	 * @Constructor
105
+	 * @access protected
106
+	 * @param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved).  Note this just sends the timezone info to the date time model field objects.  Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option)
107
+	 * @return \EEM_Line_Item
108
+	 */
109
+	protected function __construct($timezone)
110
+	{
111
+		$this->singular_item = __('Line Item', 'event_espresso');
112
+		$this->plural_item = __('Line Items', 'event_espresso');
113
+
114
+		$this->_tables = array(
115
+			'Line_Item' => new EE_Primary_Table('esp_line_item', 'LIN_ID')
116
+		);
117
+		$line_items_can_be_for = apply_filters('FHEE__EEM_Line_Item__line_items_can_be_for', array('Ticket', 'Price', 'Event'));
118
+		$this->_fields = array(
119
+			'Line_Item' => array(
120
+				'LIN_ID' => new EE_Primary_Key_Int_Field('LIN_ID', __("ID", "event_espresso")),
121
+				'LIN_code' => new EE_Slug_Field('LIN_code', __("Code for index into Cart", "event_espresso"), TRUE),
122
+				'TXN_ID' => new EE_Foreign_Key_Int_Field('TXN_ID', __("Transaction ID", "event_espresso"), TRUE, NULL, 'Transaction'),
123
+				'LIN_name' => new EE_Full_HTML_Field('LIN_name', __("Line Item Name", "event_espresso"), FALSE, ''),
124
+				'LIN_desc' => new EE_Full_HTML_Field('LIN_desc', __("Line Item Description", "event_espresso"), TRUE),
125
+				'LIN_unit_price' => new EE_Money_Field('LIN_unit_price', __("Unit Price", "event_espresso"), FALSE, 0),
126
+				'LIN_percent' => new EE_Float_Field('LIN_percent', __("Percent", "event_espresso"), FALSE, 0),
127
+				'LIN_is_taxable' => new EE_Boolean_Field('LIN_is_taxable', __("Taxable", "event_espresso"), FALSE, FALSE),
128
+				'LIN_order' => new EE_Integer_Field('LIN_order', __("Order of Application towards total of parent", "event_espresso"), FALSE, 1),
129
+				'LIN_total' => new EE_Money_Field('LIN_total', __("Total (unit price x quantity)", "event_espresso"), FALSE, 0),
130
+				'LIN_quantity' => new EE_Integer_Field('LIN_quantity', __("Quantity", "event_espresso"), TRUE, 1),
131
+				'LIN_parent' => new EE_Integer_Field('LIN_parent', __("Parent ID (this item goes towards that Line Item's total)", "event_espresso"), TRUE, NULL),
132
+				'LIN_type' => new EE_Enum_Text_Field('LIN_type', __("Type", "event_espresso"), FALSE, 'line-item', array(
133
+						self::type_line_item => __("Line Item", "event_espresso"),
134
+						self::type_sub_line_item => __("Sub-Item", "event_espresso"),
135
+						self::type_sub_total => __("Subtotal", "event_espresso"),
136
+						self::type_tax_sub_total => __("Tax Subtotal", "event_espresso"),
137
+						self::type_tax => __("Tax", "event_espresso"),
138
+						self::type_total => __("Total", "event_espresso"),
139
+						self::type_cancellation => __('Cancellation', 'event_espresso')
140
+					)
141
+				),
142
+				'OBJ_ID' => new EE_Foreign_Key_Int_Field('OBJ_ID', __('ID of Item purchased.', 'event_espresso'), TRUE, NULL, $line_items_can_be_for),
143
+				'OBJ_type' => new EE_Any_Foreign_Model_Name_Field('OBJ_type', __("Model Name this Line Item is for", "event_espresso"), TRUE, NULL, $line_items_can_be_for),
144
+				'LIN_timestamp' => new EE_Datetime_Field('LIN_timestamp', __('When the line item was created', 'event_espresso'), false, EE_Datetime_Field::now, $timezone),
145
+			)
146
+		);
147
+		$this->_model_relations = array(
148
+			'Transaction' => new EE_Belongs_To_Relation(),
149
+			'Ticket' => new EE_Belongs_To_Any_Relation(),
150
+			'Price' => new EE_Belongs_To_Any_Relation(),
151
+			'Event' => new EE_Belongs_To_Any_Relation()
152
+		);
153
+		$this->_model_chain_to_wp_user = 'Transaction.Registration.Event';
154
+		$this->_caps_slug = 'transactions';
155
+		parent::__construct($timezone);
156
+	}
157
+
158
+
159
+	/**
160
+	 * Gets all the line items for this transaction of the given type
161
+	 * @param string $line_item_type like one of EEM_Line_Item::type_*
162
+	 * @param EE_Transaction|int $transaction
163
+	 * @return EE_Line_Item[]
164
+	 */
165
+	public function get_all_of_type_for_transaction($line_item_type, $transaction)
166
+	{
167
+		$transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
168
+		return $this->get_all(array(array(
169
+			'LIN_type' => $line_item_type,
170
+			'TXN_ID' => $transaction
171
+		)));
172
+	}
173
+
174
+
175
+	/**
176
+	 * Gets all line items unrelated to tickets that are normal line items
177
+	 * (eg shipping, promotions, and miscellaneous other stuff should probably fit in this category)
178
+	 * @param EE_Transaction|int $transaction
179
+	 * @return EE_Line_Item[]
180
+	 */
181
+	public function get_all_non_ticket_line_items_for_transaction($transaction)
182
+	{
183
+		$transaction = EEM_Transaction::instance()->ensure_is_ID($transaction);
184
+		return $this->get_all(array(array(
185
+			'LIN_type' => self::type_line_item,
186
+			'TXN_ID' => $transaction,
187
+			'OR' => array(
188
+				'OBJ_type*notticket' => array('!=', 'Ticket'),
189
+				'OBJ_type*null' => array('IS_NULL'))
190
+		)));
191
+	}
192
+
193
+	/**
194
+	 * Deletes line items with no transaction who have passed the transaction cutoff time.
195
+	 * This needs to be very efficient
196
+	 * because if there are spam bots afoot there will be LOTS of line items
197
+	 * @return int count of how many deleted
198
+	 */
199
+	public function delete_line_items_with_no_transaction()
200
+	{
201
+		/** @type WPDB $wpdb */
202
+		global $wpdb;
203
+		$time_to_leave_alone = apply_filters(
204
+			'FHEE__EEM_Line_Item__delete_line_items_with_no_transaction__time_to_leave_alone', WEEK_IN_SECONDS
205
+		);
206
+		$query = $wpdb->prepare(
207
+			'DELETE li
208 208
 				FROM ' . $this->table() . ' li
209 209
 				LEFT JOIN ' . EEM_Transaction::instance()->table() . ' t ON li.TXN_ID = t.TXN_ID
210 210
 				WHERE t.TXN_ID IS NULL AND li.LIN_timestamp < %s',
211
-            // use GMT time because that's what TXN_timestamps are in
212
-            date('Y-m-d H:i:s', time() - $time_to_leave_alone)
213
-        );
214
-        return $wpdb->query($query);
215
-    }
216
-
217
-
218
-    /**
219
-     * get_line_item_for_transaction_object
220
-     * Gets a transaction's line item record for a specific object such as a EE_Event or EE_Ticket
221
-     *
222
-     * @param int $TXN_ID
223
-     * @param \EE_Base_Class $object
224
-     * @return EE_Line_Item[]
225
-     */
226
-    public function get_line_item_for_transaction_object($TXN_ID, EE_Base_Class $object)
227
-    {
228
-        return $this->get_all(array(array(
229
-            'TXN_ID' => $TXN_ID,
230
-            'OBJ_type' => str_replace('EE_', '', get_class($object)),
231
-            'OBJ_ID' => $object->ID()
232
-        )));
233
-    }
234
-
235
-
236
-    /**
237
-     * get_object_line_items_for_transaction
238
-     * Gets all of the the object line items for a transaction, based on an object type plus an array of object IDs
239
-     *
240
-     * @param int $TXN_ID
241
-     * @param string $OBJ_type
242
-     * @param array $OBJ_IDs
243
-     * @return EE_Line_Item[]
244
-     */
245
-    public function get_object_line_items_for_transaction($TXN_ID, $OBJ_type = 'Event', $OBJ_IDs = array())
246
-    {
247
-        $query_params = array(
248
-            'OBJ_type' => $OBJ_type,
249
-            // if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query
250
-            'OBJ_ID' => is_array($OBJ_IDs) && !isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
251
-        );
252
-        if ($TXN_ID) {
253
-            $query_params['TXN_ID'] = $TXN_ID;
254
-        }
255
-        return $this->get_all(array($query_params));
256
-    }
257
-
258
-
259
-    /**
260
-     * get_all_ticket_line_items_for_transaction
261
-     *
262
-     * @param EE_Transaction $transaction
263
-     * @return EE_Line_Item[]
264
-     */
265
-    public function get_all_ticket_line_items_for_transaction(EE_Transaction $transaction)
266
-    {
267
-        return $this->get_all(array(
268
-            array(
269
-                'TXN_ID' => $transaction->ID(),
270
-                'OBJ_type' => 'Ticket',
271
-            )
272
-        ));
273
-    }
274
-
275
-
276
-    /**
277
-     * get_ticket_line_item_for_transaction
278
-     *
279
-     * @param int $TXN_ID
280
-     * @param int $TKT_ID
281
-     * @return \EE_Line_Item
282
-     */
283
-    public function get_ticket_line_item_for_transaction($TXN_ID, $TKT_ID)
284
-    {
285
-        return $this->get_one(array(
286
-            array(
287
-                'TXN_ID' => EEM_Transaction::instance()->ensure_is_ID($TXN_ID),
288
-                'OBJ_ID' => $TKT_ID,
289
-                'OBJ_type' => 'Ticket',
290
-            )
291
-        ));
292
-    }
293
-
294
-
295
-    /**
296
-     * get_existing_promotion_line_item
297
-     * searches the cart for existing line items for the specified promotion
298
-     *
299
-     * @since   1.0.0
300
-     *
301
-     * @param EE_Line_Item $parent_line_item
302
-     * @param EE_Promotion $promotion
303
-     * @return EE_Line_Item
304
-     */
305
-    public function get_existing_promotion_line_item(EE_Line_Item $parent_line_item, EE_Promotion $promotion)
306
-    {
307
-        return $this->get_one(array(
308
-            array(
309
-                'TXN_ID' => $parent_line_item->TXN_ID(),
310
-                'LIN_parent' => $parent_line_item->ID(),
311
-                'OBJ_type' => 'Promotion',
312
-                'OBJ_ID' => $promotion->ID()
313
-            )
314
-        ));
315
-    }
316
-
317
-
318
-    /**
319
-     * get_all_promotion_line_items
320
-     * searches the cart for any and all existing promotion line items
321
-     *
322
-     * @since   1.0.0
323
-     *
324
-     * @param EE_Line_Item $parent_line_item
325
-     * @return EE_Line_Item[]
326
-     */
327
-    public function get_all_promotion_line_items(EE_Line_Item $parent_line_item)
328
-    {
329
-        return $this->get_all(array(
330
-            array(
331
-                'TXN_ID' => $parent_line_item->TXN_ID(),
332
-                'LIN_parent' => $parent_line_item->ID(),
333
-                'OBJ_type' => 'Promotion'
334
-            )
335
-        ));
336
-    }
337
-
338
-    /**
339
-     * Gets the registration's corresponding line item.
340
-     * Note: basically does NOT support having multiple line items for a single ticket,
341
-     * which would happen if some of the registrations had a price modifier while others didn't.
342
-     * In order to support that, we'd probably need a LIN_ID on registrations or something.
343
-     * @param EE_Registration $registration
344
-     * @return EE_Line_ITem
345
-     */
346
-    public function get_line_item_for_registration(EE_Registration $registration)
347
-    {
348
-        return $this->get_one($this->line_item_for_registration_query_params($registration));
349
-    }
350
-
351
-    /**
352
-     * Gets the query params used to retrieve a specific line item for the given registration
353
-     * @param EE_Registration $registration
354
-     * @param array $original_query_params any extra query params you'd like to be merged with
355
-     * @return array like EEM_Base::get_all()'s $query_params
356
-     */
357
-    public function line_item_for_registration_query_params(EE_Registration $registration, $original_query_params = array())
358
-    {
359
-        return array_replace_recursive($original_query_params, array(
360
-            array(
361
-                'OBJ_ID' => $registration->ticket_ID(),
362
-                'OBJ_type' => 'Ticket',
363
-                'TXN_ID' => $registration->transaction_ID()
364
-            )
365
-        ));
366
-    }
367
-
368
-
369
-    /**
370
-     * @return EE_Base_Class[]|EE_Line_Item[]
371
-     * @throws \EE_Error
372
-     */
373
-    public function get_total_line_items_with_no_transaction()
374
-    {
375
-        return $this->get_total_line_items_for_carts();
376
-    }
377
-
378
-
379
-    /**
380
-     * @return EE_Base_Class[]|EE_Line_Item[]
381
-     * @throws \EE_Error
382
-     */
383
-    public function get_total_line_items_for_active_carts()
384
-    {
385
-        return $this->get_total_line_items_for_carts(false);
386
-    }
387
-
388
-
389
-    /**
390
-     * @return EE_Base_Class[]|EE_Line_Item[]
391
-     * @throws \EE_Error
392
-     */
393
-    public function get_total_line_items_for_expired_carts()
394
-    {
395
-        return $this->get_total_line_items_for_carts(true);
396
-    }
397
-
398
-
399
-    /**
400
-     * Returns an array of grand total line items where the TXN_ID is 0.
401
-     * If $expired is set to true, then only line items for expired sessions will be returned.
402
-     * If $expired is set to false, then only line items for active sessions will be returned.
403
-     *
404
-     * @param bool|null $expired
405
-     * @return EE_Base_Class[]|EE_Line_Item[]
406
-     * @throws \EE_Error
407
-     */
408
-    private function get_total_line_items_for_carts($expired = null)
409
-    {
410
-        $where_params = array(
411
-            'TXN_ID' => 0,
412
-            'LIN_type' => 'total',
413
-        );
414
-        if ($expired !== null) {
415
-            $where_params['LIN_timestamp'] = array(
416
-                $expired ? '<=' : '>',
417
-                time() - EE_Registry::instance()->SSN->lifespan(),
418
-            );
419
-        }
420
-        return $this->get_all(array($where_params));
421
-    }
211
+			// use GMT time because that's what TXN_timestamps are in
212
+			date('Y-m-d H:i:s', time() - $time_to_leave_alone)
213
+		);
214
+		return $wpdb->query($query);
215
+	}
216
+
217
+
218
+	/**
219
+	 * get_line_item_for_transaction_object
220
+	 * Gets a transaction's line item record for a specific object such as a EE_Event or EE_Ticket
221
+	 *
222
+	 * @param int $TXN_ID
223
+	 * @param \EE_Base_Class $object
224
+	 * @return EE_Line_Item[]
225
+	 */
226
+	public function get_line_item_for_transaction_object($TXN_ID, EE_Base_Class $object)
227
+	{
228
+		return $this->get_all(array(array(
229
+			'TXN_ID' => $TXN_ID,
230
+			'OBJ_type' => str_replace('EE_', '', get_class($object)),
231
+			'OBJ_ID' => $object->ID()
232
+		)));
233
+	}
234
+
235
+
236
+	/**
237
+	 * get_object_line_items_for_transaction
238
+	 * Gets all of the the object line items for a transaction, based on an object type plus an array of object IDs
239
+	 *
240
+	 * @param int $TXN_ID
241
+	 * @param string $OBJ_type
242
+	 * @param array $OBJ_IDs
243
+	 * @return EE_Line_Item[]
244
+	 */
245
+	public function get_object_line_items_for_transaction($TXN_ID, $OBJ_type = 'Event', $OBJ_IDs = array())
246
+	{
247
+		$query_params = array(
248
+			'OBJ_type' => $OBJ_type,
249
+			// if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query
250
+			'OBJ_ID' => is_array($OBJ_IDs) && !isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
251
+		);
252
+		if ($TXN_ID) {
253
+			$query_params['TXN_ID'] = $TXN_ID;
254
+		}
255
+		return $this->get_all(array($query_params));
256
+	}
257
+
258
+
259
+	/**
260
+	 * get_all_ticket_line_items_for_transaction
261
+	 *
262
+	 * @param EE_Transaction $transaction
263
+	 * @return EE_Line_Item[]
264
+	 */
265
+	public function get_all_ticket_line_items_for_transaction(EE_Transaction $transaction)
266
+	{
267
+		return $this->get_all(array(
268
+			array(
269
+				'TXN_ID' => $transaction->ID(),
270
+				'OBJ_type' => 'Ticket',
271
+			)
272
+		));
273
+	}
274
+
275
+
276
+	/**
277
+	 * get_ticket_line_item_for_transaction
278
+	 *
279
+	 * @param int $TXN_ID
280
+	 * @param int $TKT_ID
281
+	 * @return \EE_Line_Item
282
+	 */
283
+	public function get_ticket_line_item_for_transaction($TXN_ID, $TKT_ID)
284
+	{
285
+		return $this->get_one(array(
286
+			array(
287
+				'TXN_ID' => EEM_Transaction::instance()->ensure_is_ID($TXN_ID),
288
+				'OBJ_ID' => $TKT_ID,
289
+				'OBJ_type' => 'Ticket',
290
+			)
291
+		));
292
+	}
293
+
294
+
295
+	/**
296
+	 * get_existing_promotion_line_item
297
+	 * searches the cart for existing line items for the specified promotion
298
+	 *
299
+	 * @since   1.0.0
300
+	 *
301
+	 * @param EE_Line_Item $parent_line_item
302
+	 * @param EE_Promotion $promotion
303
+	 * @return EE_Line_Item
304
+	 */
305
+	public function get_existing_promotion_line_item(EE_Line_Item $parent_line_item, EE_Promotion $promotion)
306
+	{
307
+		return $this->get_one(array(
308
+			array(
309
+				'TXN_ID' => $parent_line_item->TXN_ID(),
310
+				'LIN_parent' => $parent_line_item->ID(),
311
+				'OBJ_type' => 'Promotion',
312
+				'OBJ_ID' => $promotion->ID()
313
+			)
314
+		));
315
+	}
316
+
317
+
318
+	/**
319
+	 * get_all_promotion_line_items
320
+	 * searches the cart for any and all existing promotion line items
321
+	 *
322
+	 * @since   1.0.0
323
+	 *
324
+	 * @param EE_Line_Item $parent_line_item
325
+	 * @return EE_Line_Item[]
326
+	 */
327
+	public function get_all_promotion_line_items(EE_Line_Item $parent_line_item)
328
+	{
329
+		return $this->get_all(array(
330
+			array(
331
+				'TXN_ID' => $parent_line_item->TXN_ID(),
332
+				'LIN_parent' => $parent_line_item->ID(),
333
+				'OBJ_type' => 'Promotion'
334
+			)
335
+		));
336
+	}
337
+
338
+	/**
339
+	 * Gets the registration's corresponding line item.
340
+	 * Note: basically does NOT support having multiple line items for a single ticket,
341
+	 * which would happen if some of the registrations had a price modifier while others didn't.
342
+	 * In order to support that, we'd probably need a LIN_ID on registrations or something.
343
+	 * @param EE_Registration $registration
344
+	 * @return EE_Line_ITem
345
+	 */
346
+	public function get_line_item_for_registration(EE_Registration $registration)
347
+	{
348
+		return $this->get_one($this->line_item_for_registration_query_params($registration));
349
+	}
350
+
351
+	/**
352
+	 * Gets the query params used to retrieve a specific line item for the given registration
353
+	 * @param EE_Registration $registration
354
+	 * @param array $original_query_params any extra query params you'd like to be merged with
355
+	 * @return array like EEM_Base::get_all()'s $query_params
356
+	 */
357
+	public function line_item_for_registration_query_params(EE_Registration $registration, $original_query_params = array())
358
+	{
359
+		return array_replace_recursive($original_query_params, array(
360
+			array(
361
+				'OBJ_ID' => $registration->ticket_ID(),
362
+				'OBJ_type' => 'Ticket',
363
+				'TXN_ID' => $registration->transaction_ID()
364
+			)
365
+		));
366
+	}
367
+
368
+
369
+	/**
370
+	 * @return EE_Base_Class[]|EE_Line_Item[]
371
+	 * @throws \EE_Error
372
+	 */
373
+	public function get_total_line_items_with_no_transaction()
374
+	{
375
+		return $this->get_total_line_items_for_carts();
376
+	}
377
+
378
+
379
+	/**
380
+	 * @return EE_Base_Class[]|EE_Line_Item[]
381
+	 * @throws \EE_Error
382
+	 */
383
+	public function get_total_line_items_for_active_carts()
384
+	{
385
+		return $this->get_total_line_items_for_carts(false);
386
+	}
387
+
388
+
389
+	/**
390
+	 * @return EE_Base_Class[]|EE_Line_Item[]
391
+	 * @throws \EE_Error
392
+	 */
393
+	public function get_total_line_items_for_expired_carts()
394
+	{
395
+		return $this->get_total_line_items_for_carts(true);
396
+	}
397
+
398
+
399
+	/**
400
+	 * Returns an array of grand total line items where the TXN_ID is 0.
401
+	 * If $expired is set to true, then only line items for expired sessions will be returned.
402
+	 * If $expired is set to false, then only line items for active sessions will be returned.
403
+	 *
404
+	 * @param bool|null $expired
405
+	 * @return EE_Base_Class[]|EE_Line_Item[]
406
+	 * @throws \EE_Error
407
+	 */
408
+	private function get_total_line_items_for_carts($expired = null)
409
+	{
410
+		$where_params = array(
411
+			'TXN_ID' => 0,
412
+			'LIN_type' => 'total',
413
+		);
414
+		if ($expired !== null) {
415
+			$where_params['LIN_timestamp'] = array(
416
+				$expired ? '<=' : '>',
417
+				time() - EE_Registry::instance()->SSN->lifespan(),
418
+			);
419
+		}
420
+		return $this->get_all(array($where_params));
421
+	}
422 422
 
423 423
 
424 424
 }
425 425
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@  discard block
 block discarded – undo
1
-<?php if (!defined('EVENT_ESPRESSO_VERSION')) exit('No direct script access allowed');
1
+<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) exit('No direct script access allowed');
2 2
 
3 3
 /**
4 4
  * Event Espresso
@@ -205,8 +205,8 @@  discard block
 block discarded – undo
205 205
         );
206 206
         $query = $wpdb->prepare(
207 207
             'DELETE li
208
-				FROM ' . $this->table() . ' li
209
-				LEFT JOIN ' . EEM_Transaction::instance()->table() . ' t ON li.TXN_ID = t.TXN_ID
208
+				FROM ' . $this->table().' li
209
+				LEFT JOIN ' . EEM_Transaction::instance()->table().' t ON li.TXN_ID = t.TXN_ID
210 210
 				WHERE t.TXN_ID IS NULL AND li.LIN_timestamp < %s',
211 211
             // use GMT time because that's what TXN_timestamps are in
212 212
             date('Y-m-d H:i:s', time() - $time_to_leave_alone)
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
         $query_params = array(
248 248
             'OBJ_type' => $OBJ_type,
249 249
             // if incoming $OBJ_IDs is an array, then make sure it is formatted correctly for the query
250
-            'OBJ_ID' => is_array($OBJ_IDs) && !isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
250
+            'OBJ_ID' => is_array($OBJ_IDs) && ! isset($OBJ_IDs['IN']) ? array('IN', $OBJ_IDs) : $OBJ_IDs
251 251
         );
252 252
         if ($TXN_ID) {
253 253
             $query_params['TXN_ID'] = $TXN_ID;
Please login to merge, or discard this patch.
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,4 +1,6 @@
 block discarded – undo
1
-<?php if (!defined('EVENT_ESPRESSO_VERSION')) exit('No direct script access allowed');
1
+<?php if (!defined('EVENT_ESPRESSO_VERSION')) {
2
+	exit('No direct script access allowed');
3
+}
2 4
 
3 5
 /**
4 6
  * Event Espresso
Please login to merge, or discard this patch.
core/domain/services/event/EventSpacesCalculator.php 2 patches
Indentation   +669 added lines, -669 removed lines patch added patch discarded remove patch
@@ -30,675 +30,675 @@
 block discarded – undo
30 30
 class EventSpacesCalculator
31 31
 {
32 32
 
33
-    /**
34
-     * @var EE_Event $event
35
-     */
36
-    private $event;
37
-
38
-    /**
39
-     * @var array $datetime_query_params
40
-     */
41
-    private $datetime_query_params;
42
-
43
-    /**
44
-     * @var EE_Ticket[] $active_tickets
45
-     */
46
-    private $active_tickets = array();
47
-
48
-    /**
49
-     * @var EE_Datetime[] $datetimes
50
-     */
51
-    private $datetimes = array();
52
-
53
-    /**
54
-     * Array of Ticket IDs grouped by Datetime
55
-     *
56
-     * @var array $datetimes
57
-     */
58
-    private $datetime_tickets = array();
59
-
60
-    /**
61
-     * Max spaces for each Datetime (reg limit - previous sold)
62
-     *
63
-     * @var array $datetime_spaces
64
-     */
65
-    private $datetime_spaces = array();
66
-
67
-    /**
68
-     * Array of Datetime IDs grouped by Ticket
69
-     *
70
-     * @var array[] $ticket_datetimes
71
-     */
72
-    private $ticket_datetimes = array();
73
-
74
-    /**
75
-     * maximum ticket quantities for each ticket (adjusted for reg limit)
76
-     *
77
-     * @var array $ticket_quantities
78
-     */
79
-    private $ticket_quantities = array();
80
-
81
-    /**
82
-     * total quantity of sold and reserved for each ticket
83
-     *
84
-     * @var array $tickets_sold
85
-     */
86
-    private $tickets_sold = array();
87
-
88
-    /**
89
-     * total spaces available across all datetimes
90
-     *
91
-     * @var array $total_spaces
92
-     */
93
-    private $total_spaces = array();
94
-
95
-    /**
96
-     * @var boolean $debug
97
-     */
98
-    private $debug = false; // true false
99
-
100
-    /**
101
-     * @var null|int $spaces_remaining
102
-     */
103
-    private $spaces_remaining;
104
-
105
-    /**
106
-     * @var null|int $total_spaces_available
107
-     */
108
-    private $total_spaces_available;
109
-
110
-
111
-
112
-    /**
113
-     * EventSpacesCalculator constructor.
114
-     *
115
-     * @param EE_Event $event
116
-     * @param array    $datetime_query_params
117
-     * @throws EE_Error
118
-     */
119
-    public function __construct(EE_Event $event, array $datetime_query_params = array())
120
-    {
121
-        $this->event                 = $event;
122
-        $this->datetime_query_params = $datetime_query_params + array('order_by' => array('DTT_reg_limit' => 'ASC'));
123
-        $this->setHooks();
124
-    }
125
-
126
-
127
-
128
-    /**
129
-     * @return void
130
-     */
131
-    private function setHooks()
132
-    {
133
-        add_action( 'AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
134
-        add_action( 'AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
135
-        add_action( 'AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
136
-        add_action( 'AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
137
-        add_action( 'AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
138
-        add_action( 'AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
139
-        add_action( 'AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
140
-        add_action( 'AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
141
-    }
142
-
143
-
144
-
145
-    /**
146
-     * @return void
147
-     */
148
-    public function clearResults()
149
-    {
150
-        $this->spaces_remaining = null;
151
-        $this->total_spaces_available = null;
152
-    }
153
-
154
-
155
-
156
-    /**
157
-     * @return EE_Ticket[]
158
-     * @throws EE_Error
159
-     * @throws InvalidDataTypeException
160
-     * @throws InvalidInterfaceException
161
-     * @throws InvalidArgumentException
162
-     */
163
-    public function getActiveTickets()
164
-    {
165
-        if (empty($this->active_tickets)) {
166
-            $this->active_tickets = $this->event->tickets(
167
-                array(
168
-                    array('TKT_deleted'  => false),
169
-                    'order_by' => array('TKT_qty' => 'ASC'),
170
-                )
171
-            );
172
-        }
173
-        return $this->active_tickets;
174
-    }
175
-
176
-
177
-
178
-    /**
179
-     * @param EE_Ticket[] $active_tickets
180
-     * @throws EE_Error
181
-     * @throws DomainException
182
-     * @throws UnexpectedEntityException
183
-     */
184
-    public function setActiveTickets(array $active_tickets = array())
185
-    {
186
-        if ( ! empty($active_tickets)) {
187
-            foreach ($active_tickets as $active_ticket) {
188
-                $this->validateTicket($active_ticket);
189
-            }
190
-            // sort incoming array by ticket quantity (asc)
191
-            usort(
192
-                $active_tickets,
193
-                function (EE_Ticket $a, EE_Ticket $b) {
194
-                    if ($a->qty() === $b->qty()) {
195
-                        return 0;
196
-                    }
197
-                    return ($a->qty() < $b->qty())
198
-                        ? -1
199
-                        : 1;
200
-                }
201
-            );
202
-        }
203
-        $this->active_tickets = $active_tickets;
204
-    }
205
-
206
-
207
-
208
-    /**
209
-     * @param $ticket
210
-     * @throws DomainException
211
-     * @throws EE_Error
212
-     * @throws UnexpectedEntityException
213
-     */
214
-    private function validateTicket($ticket)
215
-    {
216
-        if ( ! $ticket instanceof EE_Ticket) {
217
-            throw new DomainException(
218
-                esc_html__(
219
-                    'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
220
-                    'event_espresso'
221
-                )
222
-            );
223
-        }
224
-        if ($ticket->get_event_ID() !== $this->event->ID()) {
225
-            throw new DomainException(
226
-                sprintf(
227
-                    esc_html__(
228
-                        'An EE_Ticket for Event %1$d was supplied while calculating event space availability for Event %2$d.',
229
-                        'event_espresso'
230
-                    ),
231
-                    $ticket->get_event_ID(),
232
-                    $this->event->ID()
233
-                )
234
-            );
235
-        }
236
-    }
237
-
238
-
239
-
240
-    /**
241
-     * @return EE_Datetime[]
242
-     */
243
-    public function getDatetimes()
244
-    {
245
-        return $this->datetimes;
246
-    }
247
-
248
-
249
-
250
-    /**
251
-     * @param EE_Datetime $datetime
252
-     * @throws EE_Error
253
-     * @throws DomainException
254
-     */
255
-    public function setDatetime(EE_Datetime $datetime)
256
-    {
257
-        if ($datetime->event()->ID() !== $this->event->ID()) {
258
-            throw new DomainException(
259
-                sprintf(
260
-                    esc_html__(
261
-                        'An EE_Datetime for Event %1$d was supplied while calculating event space availability for Event %2$d.',
262
-                        'event_espresso'
263
-                    ),
264
-                    $datetime->event()->ID(),
265
-                    $this->event->ID()
266
-                )
267
-            );
268
-        }
269
-        $this->datetimes[ $datetime->ID() ] = $datetime;
270
-    }
271
-
272
-
273
-
274
-    /**
275
-     * calculate spaces remaining based on "saleable" tickets
276
-     *
277
-     * @return float|int
278
-     * @throws EE_Error
279
-     * @throws DomainException
280
-     * @throws UnexpectedEntityException
281
-     * @throws InvalidDataTypeException
282
-     * @throws InvalidInterfaceException
283
-     * @throws InvalidArgumentException
284
-     */
285
-    public function spacesRemaining()
286
-    {
287
-        if ($this->spaces_remaining === null) {
288
-            $this->initialize();
289
-            $this->spaces_remaining = $this->calculate();
290
-        }
291
-        return $this->spaces_remaining;
292
-    }
293
-
294
-
295
-
296
-    /**
297
-     * calculates total available spaces for an event with no regard for sold tickets
298
-     *
299
-     * @return int|float
300
-     * @throws EE_Error
301
-     * @throws DomainException
302
-     * @throws UnexpectedEntityException
303
-     * @throws InvalidDataTypeException
304
-     * @throws InvalidInterfaceException
305
-     * @throws InvalidArgumentException
306
-     */
307
-    public function totalSpacesAvailable()
308
-    {
309
-        if($this->total_spaces_available === null) {
310
-            $this->initialize();
311
-            $this->total_spaces_available = $this->calculate(false);
312
-        }
313
-        return $this->total_spaces_available;
314
-    }
315
-
316
-
317
-
318
-    /**
319
-     * Loops through the active tickets for the event
320
-     * and builds a series of data arrays that will be used for calculating
321
-     * the total maximum available spaces, as well as the spaces remaining.
322
-     * Because ticket quantities affect datetime spaces and vice versa,
323
-     * we need to be constantly updating these data arrays as things change,
324
-     * which is the entire reason for their existence.
325
-     *
326
-     * @throws EE_Error
327
-     * @throws DomainException
328
-     * @throws UnexpectedEntityException
329
-     * @throws InvalidDataTypeException
330
-     * @throws InvalidInterfaceException
331
-     * @throws InvalidArgumentException
332
-     */
333
-    private function initialize()
334
-    {
335
-        if ($this->debug) {
336
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
337
-        }
338
-        $this->datetime_tickets  = array();
339
-        $this->datetime_spaces   = array();
340
-        $this->ticket_datetimes  = array();
341
-        $this->ticket_quantities = array();
342
-        $this->tickets_sold      = array();
343
-        $this->total_spaces      = array();
344
-        $active_tickets          = $this->getActiveTickets();
345
-        if ( ! empty($active_tickets)) {
346
-            foreach ($active_tickets as $ticket) {
347
-                $this->validateTicket($ticket);
348
-                // we need to index our data arrays using strings for the purpose of sorting,
349
-                // but we also need them to be unique, so  we'll just prepend a letter T to the ID
350
-                $ticket_identifier = "T{$ticket->ID()}";
351
-                // to start, we'll just consider the raw qty to be the maximum availability for this ticket,
352
-                // unless the ticket is past its "sell until" date, in which case the qty will be 0
353
-                $max_tickets = $ticket->is_expired() ? 0 : $ticket->qty();
354
-                // but we'll adjust that after looping over each datetime for the ticket and checking reg limits
355
-                $ticket_datetimes = $ticket->datetimes($this->datetime_query_params);
356
-                foreach ($ticket_datetimes as $datetime) {
357
-                    // save all datetimes
358
-                    $this->setDatetime($datetime);
359
-                    $datetime_identifier = "D{$datetime->ID()}";
360
-                    $reg_limit           = $datetime->reg_limit();
361
-                    // ticket quantity can not exceed datetime reg limit
362
-                    $max_tickets = min($max_tickets, $reg_limit);
363
-                    // as described earlier, because we need to be able to constantly adjust numbers for things,
364
-                    // we are going to move all of our data into the following arrays:
365
-                    // datetime spaces initially represents the reg limit for each datetime,
366
-                    // but this will get adjusted as tickets are accounted for
367
-                    $this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
368
-                    // just an array of ticket IDs grouped by datetime
369
-                    $this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
370
-                    // and an array of datetime IDs grouped by ticket
371
-                    $this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
372
-                }
373
-                // total quantity of sold and reserved for each ticket
374
-                $this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
375
-                // and the maximum ticket quantities for each ticket (adjusted for reg limit)
376
-                $this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
377
-            }
378
-        }
379
-        // sort datetime spaces by reg limit, but maintain our string indexes
380
-        asort($this->datetime_spaces, SORT_NUMERIC);
381
-        // datetime tickets need to be sorted in the SAME order as the above array...
382
-        // so we'll just use array_merge() to take the structure of datetime_spaces
383
-        // but overwrite all of the data with that from datetime_tickets
384
-        $this->datetime_tickets = array_merge(
385
-            $this->datetime_spaces,
386
-            $this->datetime_tickets
387
-        );
388
-        if ($this->debug) {
389
-            \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
390
-            \EEH_Debug_Tools::printr($this->datetime_tickets, 'datetime_tickets', __FILE__, __LINE__);
391
-            \EEH_Debug_Tools::printr($this->ticket_quantities, 'ticket_quantities', __FILE__, __LINE__);
392
-        }
393
-    }
394
-
395
-
396
-
397
-    /**
398
-     * performs calculations on initialized data
399
-     *
400
-     * @param bool $consider_sold
401
-     * @return int|float
402
-     */
403
-    private function calculate($consider_sold = true)
404
-    {
405
-        if ($this->debug) {
406
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
407
-            \EEH_Debug_Tools::printr($consider_sold, '$consider_sold', __FILE__, __LINE__);
408
-        }
409
-        if ($consider_sold) {
410
-            // subtract amounts sold from all ticket quantities and datetime spaces
411
-            $this->adjustTicketQuantitiesDueToSales();
412
-        }
413
-        foreach ($this->datetime_tickets as $datetime_identifier => $tickets) {
414
-            $this->trackAvailableSpacesForDatetimes($datetime_identifier, $tickets);
415
-        }
416
-        // total spaces available is just the sum of the spaces available for each datetime
417
-        $spaces_remaining = array_sum($this->total_spaces);
418
-        if ($this->debug) {
419
-            \EEH_Debug_Tools::printr($this->total_spaces, '$this->total_spaces', __FILE__, __LINE__);
420
-            \EEH_Debug_Tools::printr($this->tickets_sold, '$this->tickets_sold', __FILE__, __LINE__);
421
-            \EEH_Debug_Tools::printr($spaces_remaining, '$spaces_remaining', __FILE__, __LINE__);
422
-        }
423
-        return $spaces_remaining;
424
-    }
425
-
426
-
427
-    /**
428
-     * subtracts amount of  tickets sold from ticket quantities and datetime spaces
429
-     */
430
-    private function adjustTicketQuantitiesDueToSales()
431
-    {
432
-        if ($this->debug) {
433
-            \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
434
-        }
435
-        foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
436
-            if (isset($this->ticket_quantities[ $ticket_identifier ])){
437
-                $this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
438
-                // don't let values go below zero
439
-                $this->ticket_quantities[ $ticket_identifier ] = max(
440
-                    $this->ticket_quantities[ $ticket_identifier ],
441
-                    0
442
-                );
443
-                if ($this->debug) {
444
-                    \EEH_Debug_Tools::printr("{$tickets_sold} sales for ticket {$ticket_identifier} ", 'subtracting', __FILE__, __LINE__);
445
-                }
446
-            }
447
-            if (
448
-                isset($this->ticket_datetimes[ $ticket_identifier ])
449
-                && is_array($this->ticket_datetimes[ $ticket_identifier ])
450
-            ){
451
-                foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
452
-                    if (isset($this->ticket_quantities[ $ticket_identifier ])) {
453
-                        $this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
454
-                        // don't let values go below zero
455
-                        $this->datetime_spaces[ $ticket_datetime ] = max(
456
-                            $this->datetime_spaces[ $ticket_datetime ],
457
-                            0
458
-                        );
459
-                        if ($this->debug) {
460
-                            \EEH_Debug_Tools::printr("{$tickets_sold} sales for datetime {$ticket_datetime} ",
461
-                                'subtracting', __FILE__, __LINE__);
462
-                        }
463
-                    }
464
-                }
465
-            }
466
-        }
467
-    }
468
-
469
-
470
-
471
-    /**
472
-     * @param string $datetime_identifier
473
-     * @param array  $tickets
474
-     */
475
-    private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
476
-    {
477
-        // make sure a reg limit is set for the datetime
478
-        $reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
479
-            ? $this->datetime_spaces[ $datetime_identifier ]
480
-            : 0;
481
-        // and bail if it is not
482
-        if ( ! $reg_limit) {
483
-            if ($this->debug) {
484
-                \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
485
-            }
486
-            return;
487
-        }
488
-        if ($this->debug) {
489
-            \EEH_Debug_Tools::printr($datetime_identifier, '* $datetime_identifier', __FILE__, __LINE__, 1);
490
-            \EEH_Debug_Tools::printr("{$reg_limit}", 'REG LIMIT', __FILE__, __LINE__);
491
-        }
492
-        // number of allocated spaces always starts at zero
493
-        $spaces_allocated                           = 0;
494
-        $this->total_spaces[ $datetime_identifier ] = 0;
495
-        foreach ($tickets as $ticket_identifier) {
496
-            $spaces_allocated = $this->calculateAvailableSpacesForTicket(
497
-                $datetime_identifier,
498
-                $reg_limit,
499
-                $ticket_identifier,
500
-                $spaces_allocated
501
-            );
502
-        }
503
-        // spaces can't be negative
504
-        $spaces_allocated = max($spaces_allocated, 0);
505
-        if ($spaces_allocated) {
506
-            // track any non-zero values
507
-            $this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
508
-            if ($this->debug) {
509
-                \EEH_Debug_Tools::printr((string)$spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
510
-            }
511
-        } else {
512
-            if ($this->debug) {
513
-                \EEH_Debug_Tools::printr(' ', ' . NO TICKETS AVAILABLE FOR DATETIME', __FILE__, __LINE__);
514
-            }
515
-        }
516
-        if ($this->debug) {
517
-            \EEH_Debug_Tools::printr($this->total_spaces[ $datetime_identifier ], '$total_spaces', __FILE__,
518
-                __LINE__);
519
-            \EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
520
-            \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
521
-        }
522
-    }
523
-
524
-
525
-
526
-    /**
527
-     * @param string $datetime_identifier
528
-     * @param int    $reg_limit
529
-     * @param string $ticket_identifier
530
-     * @param int    $spaces_allocated
531
-     * @return int
532
-     */
533
-    private function calculateAvailableSpacesForTicket(
534
-        $datetime_identifier,
535
-        $reg_limit,
536
-        $ticket_identifier,
537
-        $spaces_allocated
538
-    ) {
539
-        // make sure ticket quantity is set
540
-        $ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
541
-            ? $this->ticket_quantities[ $ticket_identifier ]
542
-            : 0;
543
-        if ($this->debug) {
544
-            \EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
545
-            \EEH_Debug_Tools::printr("{$ticket_quantity}", "ticket $ticket_identifier quantity: ",
546
-                __FILE__, __LINE__, 2);
547
-        }
548
-        if ($ticket_quantity) {
549
-            if ($this->debug) {
550
-                \EEH_Debug_Tools::printr(
551
-                    ($spaces_allocated <= $reg_limit)
552
-                        ? 'true'
553
-                        : 'false',
554
-                    ' . spaces_allocated <= reg_limit = ',
555
-                    __FILE__, __LINE__
556
-                );
557
-            }
558
-            // if the datetime is NOT at full capacity yet
559
-            if ($spaces_allocated <= $reg_limit) {
560
-                // then the maximum ticket quantity we can allocate is the lowest value of either:
561
-                //  the number of remaining spaces for the datetime, which is the limit - spaces already taken
562
-                //  or the maximum ticket quantity
563
-                $ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
564
-                // adjust the available quantity in our tracking array
565
-                $this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
566
-                // and increment spaces allocated for this datetime
567
-                $spaces_allocated += $ticket_quantity;
568
-                $at_capacity = $spaces_allocated >= $reg_limit;
569
-                if ($this->debug) {
570
-                    \EEH_Debug_Tools::printr("{$ticket_quantity} {$ticket_identifier} tickets", ' > > allocate ',
571
-                        __FILE__, __LINE__,   3);
572
-                    if ($at_capacity) {
573
-                        \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
574
-                    }
575
-                }
576
-                // now adjust all other datetimes that allow access to this ticket
577
-                $this->adjustDatetimes(
578
-                    $datetime_identifier,
579
-                    $ticket_identifier,
580
-                    $ticket_quantity,
581
-                    $at_capacity
582
-                );
583
-            }
584
-        }
585
-        return $spaces_allocated;
586
-    }
587
-
588
-
589
-
590
-    /**
591
-     * subtracts ticket amounts from all datetime reg limits
592
-     * that allow access to the ticket specified,
593
-     * because that ticket could be used
594
-     * to attend any of the datetimes it has access to
595
-     *
596
-     * @param string $datetime_identifier
597
-     * @param string $ticket_identifier
598
-     * @param bool   $at_capacity
599
-     * @param int    $ticket_quantity
600
-     */
601
-    private function adjustDatetimes(
602
-        $datetime_identifier,
603
-        $ticket_identifier,
604
-        $ticket_quantity,
605
-        $at_capacity
606
-    ) {
607
-        /** @var array $datetime_tickets */
608
-        foreach ($this->datetime_tickets as $datetime_ID => $datetime_tickets) {
609
-            if ($datetime_ID !== $datetime_identifier || ! is_array($datetime_tickets)) {
610
-                continue;
611
-            }
612
-            $adjusted = $this->adjustDatetimeSpaces(
613
-                $datetime_ID,
614
-                $ticket_identifier,
615
-                $ticket_quantity
616
-            );
617
-            // skip to next ticket if nothing changed
618
-            if (! ($adjusted || $at_capacity)) {
619
-                continue;
620
-            }
621
-            // then all of it's tickets are now unavailable
622
-            foreach ($datetime_tickets as $datetime_ticket) {
623
-                if (
624
-                    ($ticket_identifier === $datetime_ticket || $at_capacity)
625
-                    && isset($this->ticket_quantities[ $datetime_ticket ])
626
-                    && $this->ticket_quantities[ $datetime_ticket ] > 0
627
-                ) {
628
-                    if ($this->debug) {
629
-                        \EEH_Debug_Tools::printr($datetime_ticket, ' . . . adjust ticket quantities for', __FILE__,
630
-                            __LINE__);
631
-                    }
632
-                    // if this datetime is at full capacity, set any tracked available quantities to zero
633
-                    // otherwise just subtract the ticket quantity
634
-                    $new_quantity = $at_capacity
635
-                        ? 0
636
-                        : $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
637
-                    // don't let ticket quantity go below zero
638
-                    $this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
639
-                    if ($this->debug) {
640
-                        \EEH_Debug_Tools::printr(
641
-                            $at_capacity
642
-                                ? "0 because Datetime {$datetime_identifier} is at capacity"
643
-                                : "{$this->ticket_quantities[ $datetime_ticket ]}",
644
-                            " . . . . {$datetime_ticket} quantity set to ",
645
-                            __FILE__, __LINE__
646
-                        );
647
-                    }
648
-                }
649
-                // but we also need to adjust spaces for any other datetimes this ticket has access to
650
-                if ($datetime_ticket === $ticket_identifier) {
651
-                    if (isset($this->ticket_datetimes[ $datetime_ticket ])
652
-                        && is_array($this->ticket_datetimes[ $datetime_ticket ])
653
-                    ) {
654
-                        if ($this->debug) {
655
-                            \EEH_Debug_Tools::printr($datetime_ticket, ' . . adjust other Datetimes for', __FILE__,
656
-                                __LINE__);
657
-                        }
658
-                        foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
659
-                            // don't adjust the current datetime twice
660
-                            if ($datetime !== $datetime_identifier) {
661
-                                $this->adjustDatetimeSpaces(
662
-                                    $datetime,
663
-                                    $datetime_ticket,
664
-                                    $ticket_quantity
665
-                                );
666
-                            }
667
-                        }
668
-                    }
669
-                }
670
-            }
671
-        }
672
-    }
673
-
674
-    private function adjustDatetimeSpaces($datetime_identifier, $ticket_identifier, $ticket_quantity = 0)
675
-    {
676
-        // does datetime have spaces available?
677
-        // and does the supplied ticket have access to this datetime ?
678
-        if (
679
-            $this->datetime_spaces[ $datetime_identifier ] > 0
680
-            && isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
681
-            && in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
682
-            ) {
683
-            if ($this->debug) {
684
-                \EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
685
-                \EEH_Debug_Tools::printr("{$this->datetime_spaces[ $datetime_identifier ]}", " . . current  {$datetime_identifier} spaces available", __FILE__, __LINE__);
686
-            }
687
-            // then decrement the available spaces for the datetime
688
-            $this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
689
-            // but don't let quantities go below zero
690
-            $this->datetime_spaces[ $datetime_identifier ] = max(
691
-                $this->datetime_spaces[ $datetime_identifier ],
692
-                0
693
-            );
694
-            if ($this->debug) {
695
-                \EEH_Debug_Tools::printr("{$ticket_quantity}",
696
-                    " . . . {$datetime_identifier} capacity reduced by", __FILE__, __LINE__);
697
-            }
698
-            return true;
699
-        }
700
-        return false;
701
-    }
33
+	/**
34
+	 * @var EE_Event $event
35
+	 */
36
+	private $event;
37
+
38
+	/**
39
+	 * @var array $datetime_query_params
40
+	 */
41
+	private $datetime_query_params;
42
+
43
+	/**
44
+	 * @var EE_Ticket[] $active_tickets
45
+	 */
46
+	private $active_tickets = array();
47
+
48
+	/**
49
+	 * @var EE_Datetime[] $datetimes
50
+	 */
51
+	private $datetimes = array();
52
+
53
+	/**
54
+	 * Array of Ticket IDs grouped by Datetime
55
+	 *
56
+	 * @var array $datetimes
57
+	 */
58
+	private $datetime_tickets = array();
59
+
60
+	/**
61
+	 * Max spaces for each Datetime (reg limit - previous sold)
62
+	 *
63
+	 * @var array $datetime_spaces
64
+	 */
65
+	private $datetime_spaces = array();
66
+
67
+	/**
68
+	 * Array of Datetime IDs grouped by Ticket
69
+	 *
70
+	 * @var array[] $ticket_datetimes
71
+	 */
72
+	private $ticket_datetimes = array();
73
+
74
+	/**
75
+	 * maximum ticket quantities for each ticket (adjusted for reg limit)
76
+	 *
77
+	 * @var array $ticket_quantities
78
+	 */
79
+	private $ticket_quantities = array();
80
+
81
+	/**
82
+	 * total quantity of sold and reserved for each ticket
83
+	 *
84
+	 * @var array $tickets_sold
85
+	 */
86
+	private $tickets_sold = array();
87
+
88
+	/**
89
+	 * total spaces available across all datetimes
90
+	 *
91
+	 * @var array $total_spaces
92
+	 */
93
+	private $total_spaces = array();
94
+
95
+	/**
96
+	 * @var boolean $debug
97
+	 */
98
+	private $debug = false; // true false
99
+
100
+	/**
101
+	 * @var null|int $spaces_remaining
102
+	 */
103
+	private $spaces_remaining;
104
+
105
+	/**
106
+	 * @var null|int $total_spaces_available
107
+	 */
108
+	private $total_spaces_available;
109
+
110
+
111
+
112
+	/**
113
+	 * EventSpacesCalculator constructor.
114
+	 *
115
+	 * @param EE_Event $event
116
+	 * @param array    $datetime_query_params
117
+	 * @throws EE_Error
118
+	 */
119
+	public function __construct(EE_Event $event, array $datetime_query_params = array())
120
+	{
121
+		$this->event                 = $event;
122
+		$this->datetime_query_params = $datetime_query_params + array('order_by' => array('DTT_reg_limit' => 'ASC'));
123
+		$this->setHooks();
124
+	}
125
+
126
+
127
+
128
+	/**
129
+	 * @return void
130
+	 */
131
+	private function setHooks()
132
+	{
133
+		add_action( 'AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
134
+		add_action( 'AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
135
+		add_action( 'AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
136
+		add_action( 'AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
137
+		add_action( 'AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
138
+		add_action( 'AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
139
+		add_action( 'AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
140
+		add_action( 'AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
141
+	}
142
+
143
+
144
+
145
+	/**
146
+	 * @return void
147
+	 */
148
+	public function clearResults()
149
+	{
150
+		$this->spaces_remaining = null;
151
+		$this->total_spaces_available = null;
152
+	}
153
+
154
+
155
+
156
+	/**
157
+	 * @return EE_Ticket[]
158
+	 * @throws EE_Error
159
+	 * @throws InvalidDataTypeException
160
+	 * @throws InvalidInterfaceException
161
+	 * @throws InvalidArgumentException
162
+	 */
163
+	public function getActiveTickets()
164
+	{
165
+		if (empty($this->active_tickets)) {
166
+			$this->active_tickets = $this->event->tickets(
167
+				array(
168
+					array('TKT_deleted'  => false),
169
+					'order_by' => array('TKT_qty' => 'ASC'),
170
+				)
171
+			);
172
+		}
173
+		return $this->active_tickets;
174
+	}
175
+
176
+
177
+
178
+	/**
179
+	 * @param EE_Ticket[] $active_tickets
180
+	 * @throws EE_Error
181
+	 * @throws DomainException
182
+	 * @throws UnexpectedEntityException
183
+	 */
184
+	public function setActiveTickets(array $active_tickets = array())
185
+	{
186
+		if ( ! empty($active_tickets)) {
187
+			foreach ($active_tickets as $active_ticket) {
188
+				$this->validateTicket($active_ticket);
189
+			}
190
+			// sort incoming array by ticket quantity (asc)
191
+			usort(
192
+				$active_tickets,
193
+				function (EE_Ticket $a, EE_Ticket $b) {
194
+					if ($a->qty() === $b->qty()) {
195
+						return 0;
196
+					}
197
+					return ($a->qty() < $b->qty())
198
+						? -1
199
+						: 1;
200
+				}
201
+			);
202
+		}
203
+		$this->active_tickets = $active_tickets;
204
+	}
205
+
206
+
207
+
208
+	/**
209
+	 * @param $ticket
210
+	 * @throws DomainException
211
+	 * @throws EE_Error
212
+	 * @throws UnexpectedEntityException
213
+	 */
214
+	private function validateTicket($ticket)
215
+	{
216
+		if ( ! $ticket instanceof EE_Ticket) {
217
+			throw new DomainException(
218
+				esc_html__(
219
+					'Invalid Ticket. Only EE_Ticket objects can be used to calculate event space availability.',
220
+					'event_espresso'
221
+				)
222
+			);
223
+		}
224
+		if ($ticket->get_event_ID() !== $this->event->ID()) {
225
+			throw new DomainException(
226
+				sprintf(
227
+					esc_html__(
228
+						'An EE_Ticket for Event %1$d was supplied while calculating event space availability for Event %2$d.',
229
+						'event_espresso'
230
+					),
231
+					$ticket->get_event_ID(),
232
+					$this->event->ID()
233
+				)
234
+			);
235
+		}
236
+	}
237
+
238
+
239
+
240
+	/**
241
+	 * @return EE_Datetime[]
242
+	 */
243
+	public function getDatetimes()
244
+	{
245
+		return $this->datetimes;
246
+	}
247
+
248
+
249
+
250
+	/**
251
+	 * @param EE_Datetime $datetime
252
+	 * @throws EE_Error
253
+	 * @throws DomainException
254
+	 */
255
+	public function setDatetime(EE_Datetime $datetime)
256
+	{
257
+		if ($datetime->event()->ID() !== $this->event->ID()) {
258
+			throw new DomainException(
259
+				sprintf(
260
+					esc_html__(
261
+						'An EE_Datetime for Event %1$d was supplied while calculating event space availability for Event %2$d.',
262
+						'event_espresso'
263
+					),
264
+					$datetime->event()->ID(),
265
+					$this->event->ID()
266
+				)
267
+			);
268
+		}
269
+		$this->datetimes[ $datetime->ID() ] = $datetime;
270
+	}
271
+
272
+
273
+
274
+	/**
275
+	 * calculate spaces remaining based on "saleable" tickets
276
+	 *
277
+	 * @return float|int
278
+	 * @throws EE_Error
279
+	 * @throws DomainException
280
+	 * @throws UnexpectedEntityException
281
+	 * @throws InvalidDataTypeException
282
+	 * @throws InvalidInterfaceException
283
+	 * @throws InvalidArgumentException
284
+	 */
285
+	public function spacesRemaining()
286
+	{
287
+		if ($this->spaces_remaining === null) {
288
+			$this->initialize();
289
+			$this->spaces_remaining = $this->calculate();
290
+		}
291
+		return $this->spaces_remaining;
292
+	}
293
+
294
+
295
+
296
+	/**
297
+	 * calculates total available spaces for an event with no regard for sold tickets
298
+	 *
299
+	 * @return int|float
300
+	 * @throws EE_Error
301
+	 * @throws DomainException
302
+	 * @throws UnexpectedEntityException
303
+	 * @throws InvalidDataTypeException
304
+	 * @throws InvalidInterfaceException
305
+	 * @throws InvalidArgumentException
306
+	 */
307
+	public function totalSpacesAvailable()
308
+	{
309
+		if($this->total_spaces_available === null) {
310
+			$this->initialize();
311
+			$this->total_spaces_available = $this->calculate(false);
312
+		}
313
+		return $this->total_spaces_available;
314
+	}
315
+
316
+
317
+
318
+	/**
319
+	 * Loops through the active tickets for the event
320
+	 * and builds a series of data arrays that will be used for calculating
321
+	 * the total maximum available spaces, as well as the spaces remaining.
322
+	 * Because ticket quantities affect datetime spaces and vice versa,
323
+	 * we need to be constantly updating these data arrays as things change,
324
+	 * which is the entire reason for their existence.
325
+	 *
326
+	 * @throws EE_Error
327
+	 * @throws DomainException
328
+	 * @throws UnexpectedEntityException
329
+	 * @throws InvalidDataTypeException
330
+	 * @throws InvalidInterfaceException
331
+	 * @throws InvalidArgumentException
332
+	 */
333
+	private function initialize()
334
+	{
335
+		if ($this->debug) {
336
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
337
+		}
338
+		$this->datetime_tickets  = array();
339
+		$this->datetime_spaces   = array();
340
+		$this->ticket_datetimes  = array();
341
+		$this->ticket_quantities = array();
342
+		$this->tickets_sold      = array();
343
+		$this->total_spaces      = array();
344
+		$active_tickets          = $this->getActiveTickets();
345
+		if ( ! empty($active_tickets)) {
346
+			foreach ($active_tickets as $ticket) {
347
+				$this->validateTicket($ticket);
348
+				// we need to index our data arrays using strings for the purpose of sorting,
349
+				// but we also need them to be unique, so  we'll just prepend a letter T to the ID
350
+				$ticket_identifier = "T{$ticket->ID()}";
351
+				// to start, we'll just consider the raw qty to be the maximum availability for this ticket,
352
+				// unless the ticket is past its "sell until" date, in which case the qty will be 0
353
+				$max_tickets = $ticket->is_expired() ? 0 : $ticket->qty();
354
+				// but we'll adjust that after looping over each datetime for the ticket and checking reg limits
355
+				$ticket_datetimes = $ticket->datetimes($this->datetime_query_params);
356
+				foreach ($ticket_datetimes as $datetime) {
357
+					// save all datetimes
358
+					$this->setDatetime($datetime);
359
+					$datetime_identifier = "D{$datetime->ID()}";
360
+					$reg_limit           = $datetime->reg_limit();
361
+					// ticket quantity can not exceed datetime reg limit
362
+					$max_tickets = min($max_tickets, $reg_limit);
363
+					// as described earlier, because we need to be able to constantly adjust numbers for things,
364
+					// we are going to move all of our data into the following arrays:
365
+					// datetime spaces initially represents the reg limit for each datetime,
366
+					// but this will get adjusted as tickets are accounted for
367
+					$this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
368
+					// just an array of ticket IDs grouped by datetime
369
+					$this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
370
+					// and an array of datetime IDs grouped by ticket
371
+					$this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
372
+				}
373
+				// total quantity of sold and reserved for each ticket
374
+				$this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
375
+				// and the maximum ticket quantities for each ticket (adjusted for reg limit)
376
+				$this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
377
+			}
378
+		}
379
+		// sort datetime spaces by reg limit, but maintain our string indexes
380
+		asort($this->datetime_spaces, SORT_NUMERIC);
381
+		// datetime tickets need to be sorted in the SAME order as the above array...
382
+		// so we'll just use array_merge() to take the structure of datetime_spaces
383
+		// but overwrite all of the data with that from datetime_tickets
384
+		$this->datetime_tickets = array_merge(
385
+			$this->datetime_spaces,
386
+			$this->datetime_tickets
387
+		);
388
+		if ($this->debug) {
389
+			\EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
390
+			\EEH_Debug_Tools::printr($this->datetime_tickets, 'datetime_tickets', __FILE__, __LINE__);
391
+			\EEH_Debug_Tools::printr($this->ticket_quantities, 'ticket_quantities', __FILE__, __LINE__);
392
+		}
393
+	}
394
+
395
+
396
+
397
+	/**
398
+	 * performs calculations on initialized data
399
+	 *
400
+	 * @param bool $consider_sold
401
+	 * @return int|float
402
+	 */
403
+	private function calculate($consider_sold = true)
404
+	{
405
+		if ($this->debug) {
406
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
407
+			\EEH_Debug_Tools::printr($consider_sold, '$consider_sold', __FILE__, __LINE__);
408
+		}
409
+		if ($consider_sold) {
410
+			// subtract amounts sold from all ticket quantities and datetime spaces
411
+			$this->adjustTicketQuantitiesDueToSales();
412
+		}
413
+		foreach ($this->datetime_tickets as $datetime_identifier => $tickets) {
414
+			$this->trackAvailableSpacesForDatetimes($datetime_identifier, $tickets);
415
+		}
416
+		// total spaces available is just the sum of the spaces available for each datetime
417
+		$spaces_remaining = array_sum($this->total_spaces);
418
+		if ($this->debug) {
419
+			\EEH_Debug_Tools::printr($this->total_spaces, '$this->total_spaces', __FILE__, __LINE__);
420
+			\EEH_Debug_Tools::printr($this->tickets_sold, '$this->tickets_sold', __FILE__, __LINE__);
421
+			\EEH_Debug_Tools::printr($spaces_remaining, '$spaces_remaining', __FILE__, __LINE__);
422
+		}
423
+		return $spaces_remaining;
424
+	}
425
+
426
+
427
+	/**
428
+	 * subtracts amount of  tickets sold from ticket quantities and datetime spaces
429
+	 */
430
+	private function adjustTicketQuantitiesDueToSales()
431
+	{
432
+		if ($this->debug) {
433
+			\EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
434
+		}
435
+		foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
436
+			if (isset($this->ticket_quantities[ $ticket_identifier ])){
437
+				$this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
438
+				// don't let values go below zero
439
+				$this->ticket_quantities[ $ticket_identifier ] = max(
440
+					$this->ticket_quantities[ $ticket_identifier ],
441
+					0
442
+				);
443
+				if ($this->debug) {
444
+					\EEH_Debug_Tools::printr("{$tickets_sold} sales for ticket {$ticket_identifier} ", 'subtracting', __FILE__, __LINE__);
445
+				}
446
+			}
447
+			if (
448
+				isset($this->ticket_datetimes[ $ticket_identifier ])
449
+				&& is_array($this->ticket_datetimes[ $ticket_identifier ])
450
+			){
451
+				foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
452
+					if (isset($this->ticket_quantities[ $ticket_identifier ])) {
453
+						$this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
454
+						// don't let values go below zero
455
+						$this->datetime_spaces[ $ticket_datetime ] = max(
456
+							$this->datetime_spaces[ $ticket_datetime ],
457
+							0
458
+						);
459
+						if ($this->debug) {
460
+							\EEH_Debug_Tools::printr("{$tickets_sold} sales for datetime {$ticket_datetime} ",
461
+								'subtracting', __FILE__, __LINE__);
462
+						}
463
+					}
464
+				}
465
+			}
466
+		}
467
+	}
468
+
469
+
470
+
471
+	/**
472
+	 * @param string $datetime_identifier
473
+	 * @param array  $tickets
474
+	 */
475
+	private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
476
+	{
477
+		// make sure a reg limit is set for the datetime
478
+		$reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
479
+			? $this->datetime_spaces[ $datetime_identifier ]
480
+			: 0;
481
+		// and bail if it is not
482
+		if ( ! $reg_limit) {
483
+			if ($this->debug) {
484
+				\EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__);
485
+			}
486
+			return;
487
+		}
488
+		if ($this->debug) {
489
+			\EEH_Debug_Tools::printr($datetime_identifier, '* $datetime_identifier', __FILE__, __LINE__, 1);
490
+			\EEH_Debug_Tools::printr("{$reg_limit}", 'REG LIMIT', __FILE__, __LINE__);
491
+		}
492
+		// number of allocated spaces always starts at zero
493
+		$spaces_allocated                           = 0;
494
+		$this->total_spaces[ $datetime_identifier ] = 0;
495
+		foreach ($tickets as $ticket_identifier) {
496
+			$spaces_allocated = $this->calculateAvailableSpacesForTicket(
497
+				$datetime_identifier,
498
+				$reg_limit,
499
+				$ticket_identifier,
500
+				$spaces_allocated
501
+			);
502
+		}
503
+		// spaces can't be negative
504
+		$spaces_allocated = max($spaces_allocated, 0);
505
+		if ($spaces_allocated) {
506
+			// track any non-zero values
507
+			$this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
508
+			if ($this->debug) {
509
+				\EEH_Debug_Tools::printr((string)$spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
510
+			}
511
+		} else {
512
+			if ($this->debug) {
513
+				\EEH_Debug_Tools::printr(' ', ' . NO TICKETS AVAILABLE FOR DATETIME', __FILE__, __LINE__);
514
+			}
515
+		}
516
+		if ($this->debug) {
517
+			\EEH_Debug_Tools::printr($this->total_spaces[ $datetime_identifier ], '$total_spaces', __FILE__,
518
+				__LINE__);
519
+			\EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
520
+			\EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
521
+		}
522
+	}
523
+
524
+
525
+
526
+	/**
527
+	 * @param string $datetime_identifier
528
+	 * @param int    $reg_limit
529
+	 * @param string $ticket_identifier
530
+	 * @param int    $spaces_allocated
531
+	 * @return int
532
+	 */
533
+	private function calculateAvailableSpacesForTicket(
534
+		$datetime_identifier,
535
+		$reg_limit,
536
+		$ticket_identifier,
537
+		$spaces_allocated
538
+	) {
539
+		// make sure ticket quantity is set
540
+		$ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
541
+			? $this->ticket_quantities[ $ticket_identifier ]
542
+			: 0;
543
+		if ($this->debug) {
544
+			\EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
545
+			\EEH_Debug_Tools::printr("{$ticket_quantity}", "ticket $ticket_identifier quantity: ",
546
+				__FILE__, __LINE__, 2);
547
+		}
548
+		if ($ticket_quantity) {
549
+			if ($this->debug) {
550
+				\EEH_Debug_Tools::printr(
551
+					($spaces_allocated <= $reg_limit)
552
+						? 'true'
553
+						: 'false',
554
+					' . spaces_allocated <= reg_limit = ',
555
+					__FILE__, __LINE__
556
+				);
557
+			}
558
+			// if the datetime is NOT at full capacity yet
559
+			if ($spaces_allocated <= $reg_limit) {
560
+				// then the maximum ticket quantity we can allocate is the lowest value of either:
561
+				//  the number of remaining spaces for the datetime, which is the limit - spaces already taken
562
+				//  or the maximum ticket quantity
563
+				$ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
564
+				// adjust the available quantity in our tracking array
565
+				$this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
566
+				// and increment spaces allocated for this datetime
567
+				$spaces_allocated += $ticket_quantity;
568
+				$at_capacity = $spaces_allocated >= $reg_limit;
569
+				if ($this->debug) {
570
+					\EEH_Debug_Tools::printr("{$ticket_quantity} {$ticket_identifier} tickets", ' > > allocate ',
571
+						__FILE__, __LINE__,   3);
572
+					if ($at_capacity) {
573
+						\EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
574
+					}
575
+				}
576
+				// now adjust all other datetimes that allow access to this ticket
577
+				$this->adjustDatetimes(
578
+					$datetime_identifier,
579
+					$ticket_identifier,
580
+					$ticket_quantity,
581
+					$at_capacity
582
+				);
583
+			}
584
+		}
585
+		return $spaces_allocated;
586
+	}
587
+
588
+
589
+
590
+	/**
591
+	 * subtracts ticket amounts from all datetime reg limits
592
+	 * that allow access to the ticket specified,
593
+	 * because that ticket could be used
594
+	 * to attend any of the datetimes it has access to
595
+	 *
596
+	 * @param string $datetime_identifier
597
+	 * @param string $ticket_identifier
598
+	 * @param bool   $at_capacity
599
+	 * @param int    $ticket_quantity
600
+	 */
601
+	private function adjustDatetimes(
602
+		$datetime_identifier,
603
+		$ticket_identifier,
604
+		$ticket_quantity,
605
+		$at_capacity
606
+	) {
607
+		/** @var array $datetime_tickets */
608
+		foreach ($this->datetime_tickets as $datetime_ID => $datetime_tickets) {
609
+			if ($datetime_ID !== $datetime_identifier || ! is_array($datetime_tickets)) {
610
+				continue;
611
+			}
612
+			$adjusted = $this->adjustDatetimeSpaces(
613
+				$datetime_ID,
614
+				$ticket_identifier,
615
+				$ticket_quantity
616
+			);
617
+			// skip to next ticket if nothing changed
618
+			if (! ($adjusted || $at_capacity)) {
619
+				continue;
620
+			}
621
+			// then all of it's tickets are now unavailable
622
+			foreach ($datetime_tickets as $datetime_ticket) {
623
+				if (
624
+					($ticket_identifier === $datetime_ticket || $at_capacity)
625
+					&& isset($this->ticket_quantities[ $datetime_ticket ])
626
+					&& $this->ticket_quantities[ $datetime_ticket ] > 0
627
+				) {
628
+					if ($this->debug) {
629
+						\EEH_Debug_Tools::printr($datetime_ticket, ' . . . adjust ticket quantities for', __FILE__,
630
+							__LINE__);
631
+					}
632
+					// if this datetime is at full capacity, set any tracked available quantities to zero
633
+					// otherwise just subtract the ticket quantity
634
+					$new_quantity = $at_capacity
635
+						? 0
636
+						: $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
637
+					// don't let ticket quantity go below zero
638
+					$this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
639
+					if ($this->debug) {
640
+						\EEH_Debug_Tools::printr(
641
+							$at_capacity
642
+								? "0 because Datetime {$datetime_identifier} is at capacity"
643
+								: "{$this->ticket_quantities[ $datetime_ticket ]}",
644
+							" . . . . {$datetime_ticket} quantity set to ",
645
+							__FILE__, __LINE__
646
+						);
647
+					}
648
+				}
649
+				// but we also need to adjust spaces for any other datetimes this ticket has access to
650
+				if ($datetime_ticket === $ticket_identifier) {
651
+					if (isset($this->ticket_datetimes[ $datetime_ticket ])
652
+						&& is_array($this->ticket_datetimes[ $datetime_ticket ])
653
+					) {
654
+						if ($this->debug) {
655
+							\EEH_Debug_Tools::printr($datetime_ticket, ' . . adjust other Datetimes for', __FILE__,
656
+								__LINE__);
657
+						}
658
+						foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
659
+							// don't adjust the current datetime twice
660
+							if ($datetime !== $datetime_identifier) {
661
+								$this->adjustDatetimeSpaces(
662
+									$datetime,
663
+									$datetime_ticket,
664
+									$ticket_quantity
665
+								);
666
+							}
667
+						}
668
+					}
669
+				}
670
+			}
671
+		}
672
+	}
673
+
674
+	private function adjustDatetimeSpaces($datetime_identifier, $ticket_identifier, $ticket_quantity = 0)
675
+	{
676
+		// does datetime have spaces available?
677
+		// and does the supplied ticket have access to this datetime ?
678
+		if (
679
+			$this->datetime_spaces[ $datetime_identifier ] > 0
680
+			&& isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
681
+			&& in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
682
+			) {
683
+			if ($this->debug) {
684
+				\EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
685
+				\EEH_Debug_Tools::printr("{$this->datetime_spaces[ $datetime_identifier ]}", " . . current  {$datetime_identifier} spaces available", __FILE__, __LINE__);
686
+			}
687
+			// then decrement the available spaces for the datetime
688
+			$this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
689
+			// but don't let quantities go below zero
690
+			$this->datetime_spaces[ $datetime_identifier ] = max(
691
+				$this->datetime_spaces[ $datetime_identifier ],
692
+				0
693
+			);
694
+			if ($this->debug) {
695
+				\EEH_Debug_Tools::printr("{$ticket_quantity}",
696
+					" . . . {$datetime_identifier} capacity reduced by", __FILE__, __LINE__);
697
+			}
698
+			return true;
699
+		}
700
+		return false;
701
+	}
702 702
 
703 703
 }
704 704
 // Location: EventSpacesCalculator.php
Please login to merge, or discard this patch.
Spacing   +54 added lines, -54 removed lines patch added patch discarded remove patch
@@ -130,14 +130,14 @@  discard block
 block discarded – undo
130 130
      */
131 131
     private function setHooks()
132 132
     {
133
-        add_action( 'AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
134
-        add_action( 'AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
135
-        add_action( 'AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
136
-        add_action( 'AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
137
-        add_action( 'AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
138
-        add_action( 'AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
139
-        add_action( 'AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
140
-        add_action( 'AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
133
+        add_action('AHEE__EE_Ticket__increase_sold', array($this, 'clearResults'));
134
+        add_action('AHEE__EE_Ticket__decrease_sold', array($this, 'clearResults'));
135
+        add_action('AHEE__EE_Datetime__increase_sold', array($this, 'clearResults'));
136
+        add_action('AHEE__EE_Datetime__decrease_sold', array($this, 'clearResults'));
137
+        add_action('AHEE__EE_Ticket__increase_reserved', array($this, 'clearResults'));
138
+        add_action('AHEE__EE_Ticket__decrease_reserved', array($this, 'clearResults'));
139
+        add_action('AHEE__EE_Datetime__increase_reserved', array($this, 'clearResults'));
140
+        add_action('AHEE__EE_Datetime__decrease_reserved', array($this, 'clearResults'));
141 141
     }
142 142
 
143 143
 
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
             // sort incoming array by ticket quantity (asc)
191 191
             usort(
192 192
                 $active_tickets,
193
-                function (EE_Ticket $a, EE_Ticket $b) {
193
+                function(EE_Ticket $a, EE_Ticket $b) {
194 194
                     if ($a->qty() === $b->qty()) {
195 195
                         return 0;
196 196
                     }
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
                 )
267 267
             );
268 268
         }
269
-        $this->datetimes[ $datetime->ID() ] = $datetime;
269
+        $this->datetimes[$datetime->ID()] = $datetime;
270 270
     }
271 271
 
272 272
 
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
      */
307 307
     public function totalSpacesAvailable()
308 308
     {
309
-        if($this->total_spaces_available === null) {
309
+        if ($this->total_spaces_available === null) {
310 310
             $this->initialize();
311 311
             $this->total_spaces_available = $this->calculate(false);
312 312
         }
@@ -364,16 +364,16 @@  discard block
 block discarded – undo
364 364
                     // we are going to move all of our data into the following arrays:
365 365
                     // datetime spaces initially represents the reg limit for each datetime,
366 366
                     // but this will get adjusted as tickets are accounted for
367
-                    $this->datetime_spaces[ $datetime_identifier ] = $reg_limit;
367
+                    $this->datetime_spaces[$datetime_identifier] = $reg_limit;
368 368
                     // just an array of ticket IDs grouped by datetime
369
-                    $this->datetime_tickets[ $datetime_identifier ][] = $ticket_identifier;
369
+                    $this->datetime_tickets[$datetime_identifier][] = $ticket_identifier;
370 370
                     // and an array of datetime IDs grouped by ticket
371
-                    $this->ticket_datetimes[ $ticket_identifier ][] = $datetime_identifier;
371
+                    $this->ticket_datetimes[$ticket_identifier][] = $datetime_identifier;
372 372
                 }
373 373
                 // total quantity of sold and reserved for each ticket
374
-                $this->tickets_sold[ $ticket_identifier ] = $ticket->sold() + $ticket->reserved();
374
+                $this->tickets_sold[$ticket_identifier] = $ticket->sold() + $ticket->reserved();
375 375
                 // and the maximum ticket quantities for each ticket (adjusted for reg limit)
376
-                $this->ticket_quantities[ $ticket_identifier ] = $max_tickets;
376
+                $this->ticket_quantities[$ticket_identifier] = $max_tickets;
377 377
             }
378 378
         }
379 379
         // sort datetime spaces by reg limit, but maintain our string indexes
@@ -433,11 +433,11 @@  discard block
 block discarded – undo
433 433
             \EEH_Debug_Tools::printr(__FUNCTION__, __CLASS__, __FILE__, __LINE__, 2);
434 434
         }
435 435
         foreach ($this->tickets_sold as $ticket_identifier => $tickets_sold) {
436
-            if (isset($this->ticket_quantities[ $ticket_identifier ])){
437
-                $this->ticket_quantities[ $ticket_identifier ] -= $tickets_sold;
436
+            if (isset($this->ticket_quantities[$ticket_identifier])) {
437
+                $this->ticket_quantities[$ticket_identifier] -= $tickets_sold;
438 438
                 // don't let values go below zero
439
-                $this->ticket_quantities[ $ticket_identifier ] = max(
440
-                    $this->ticket_quantities[ $ticket_identifier ],
439
+                $this->ticket_quantities[$ticket_identifier] = max(
440
+                    $this->ticket_quantities[$ticket_identifier],
441 441
                     0
442 442
                 );
443 443
                 if ($this->debug) {
@@ -445,15 +445,15 @@  discard block
 block discarded – undo
445 445
                 }
446 446
             }
447 447
             if (
448
-                isset($this->ticket_datetimes[ $ticket_identifier ])
449
-                && is_array($this->ticket_datetimes[ $ticket_identifier ])
450
-            ){
451
-                foreach ($this->ticket_datetimes[ $ticket_identifier ] as $ticket_datetime) {
452
-                    if (isset($this->ticket_quantities[ $ticket_identifier ])) {
453
-                        $this->datetime_spaces[ $ticket_datetime ] -= $tickets_sold;
448
+                isset($this->ticket_datetimes[$ticket_identifier])
449
+                && is_array($this->ticket_datetimes[$ticket_identifier])
450
+            ) {
451
+                foreach ($this->ticket_datetimes[$ticket_identifier] as $ticket_datetime) {
452
+                    if (isset($this->ticket_quantities[$ticket_identifier])) {
453
+                        $this->datetime_spaces[$ticket_datetime] -= $tickets_sold;
454 454
                         // don't let values go below zero
455
-                        $this->datetime_spaces[ $ticket_datetime ] = max(
456
-                            $this->datetime_spaces[ $ticket_datetime ],
455
+                        $this->datetime_spaces[$ticket_datetime] = max(
456
+                            $this->datetime_spaces[$ticket_datetime],
457 457
                             0
458 458
                         );
459 459
                         if ($this->debug) {
@@ -475,8 +475,8 @@  discard block
 block discarded – undo
475 475
     private function trackAvailableSpacesForDatetimes($datetime_identifier, array $tickets)
476 476
     {
477 477
         // make sure a reg limit is set for the datetime
478
-        $reg_limit = isset($this->datetime_spaces[ $datetime_identifier ])
479
-            ? $this->datetime_spaces[ $datetime_identifier ]
478
+        $reg_limit = isset($this->datetime_spaces[$datetime_identifier])
479
+            ? $this->datetime_spaces[$datetime_identifier]
480 480
             : 0;
481 481
         // and bail if it is not
482 482
         if ( ! $reg_limit) {
@@ -491,7 +491,7 @@  discard block
 block discarded – undo
491 491
         }
492 492
         // number of allocated spaces always starts at zero
493 493
         $spaces_allocated                           = 0;
494
-        $this->total_spaces[ $datetime_identifier ] = 0;
494
+        $this->total_spaces[$datetime_identifier] = 0;
495 495
         foreach ($tickets as $ticket_identifier) {
496 496
             $spaces_allocated = $this->calculateAvailableSpacesForTicket(
497 497
                 $datetime_identifier,
@@ -504,9 +504,9 @@  discard block
 block discarded – undo
504 504
         $spaces_allocated = max($spaces_allocated, 0);
505 505
         if ($spaces_allocated) {
506 506
             // track any non-zero values
507
-            $this->total_spaces[ $datetime_identifier ] += $spaces_allocated;
507
+            $this->total_spaces[$datetime_identifier] += $spaces_allocated;
508 508
             if ($this->debug) {
509
-                \EEH_Debug_Tools::printr((string)$spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
509
+                \EEH_Debug_Tools::printr((string) $spaces_allocated, ' . $spaces_allocated: ', __FILE__, __LINE__);
510 510
             }
511 511
         } else {
512 512
             if ($this->debug) {
@@ -514,7 +514,7 @@  discard block
 block discarded – undo
514 514
             }
515 515
         }
516 516
         if ($this->debug) {
517
-            \EEH_Debug_Tools::printr($this->total_spaces[ $datetime_identifier ], '$total_spaces', __FILE__,
517
+            \EEH_Debug_Tools::printr($this->total_spaces[$datetime_identifier], '$total_spaces', __FILE__,
518 518
                 __LINE__);
519 519
             \EEH_Debug_Tools::printr($this->ticket_quantities, '$ticket_quantities', __FILE__, __LINE__);
520 520
             \EEH_Debug_Tools::printr($this->datetime_spaces, 'datetime_spaces', __FILE__, __LINE__);
@@ -537,8 +537,8 @@  discard block
 block discarded – undo
537 537
         $spaces_allocated
538 538
     ) {
539 539
         // make sure ticket quantity is set
540
-        $ticket_quantity = isset($this->ticket_quantities[ $ticket_identifier ])
541
-            ? $this->ticket_quantities[ $ticket_identifier ]
540
+        $ticket_quantity = isset($this->ticket_quantities[$ticket_identifier])
541
+            ? $this->ticket_quantities[$ticket_identifier]
542 542
             : 0;
543 543
         if ($this->debug) {
544 544
             \EEH_Debug_Tools::printr("{$spaces_allocated}", '$spaces_allocated', __FILE__, __LINE__);
@@ -562,13 +562,13 @@  discard block
 block discarded – undo
562 562
                 //  or the maximum ticket quantity
563 563
                 $ticket_quantity = min($reg_limit - $spaces_allocated, $ticket_quantity);
564 564
                 // adjust the available quantity in our tracking array
565
-                $this->ticket_quantities[ $ticket_identifier ] -= $ticket_quantity;
565
+                $this->ticket_quantities[$ticket_identifier] -= $ticket_quantity;
566 566
                 // and increment spaces allocated for this datetime
567 567
                 $spaces_allocated += $ticket_quantity;
568 568
                 $at_capacity = $spaces_allocated >= $reg_limit;
569 569
                 if ($this->debug) {
570 570
                     \EEH_Debug_Tools::printr("{$ticket_quantity} {$ticket_identifier} tickets", ' > > allocate ',
571
-                        __FILE__, __LINE__,   3);
571
+                        __FILE__, __LINE__, 3);
572 572
                     if ($at_capacity) {
573 573
                         \EEH_Debug_Tools::printr('AT CAPACITY', " . {$datetime_identifier}", __FILE__, __LINE__, 3);
574 574
                     }
@@ -615,15 +615,15 @@  discard block
 block discarded – undo
615 615
                 $ticket_quantity
616 616
             );
617 617
             // skip to next ticket if nothing changed
618
-            if (! ($adjusted || $at_capacity)) {
618
+            if ( ! ($adjusted || $at_capacity)) {
619 619
                 continue;
620 620
             }
621 621
             // then all of it's tickets are now unavailable
622 622
             foreach ($datetime_tickets as $datetime_ticket) {
623 623
                 if (
624 624
                     ($ticket_identifier === $datetime_ticket || $at_capacity)
625
-                    && isset($this->ticket_quantities[ $datetime_ticket ])
626
-                    && $this->ticket_quantities[ $datetime_ticket ] > 0
625
+                    && isset($this->ticket_quantities[$datetime_ticket])
626
+                    && $this->ticket_quantities[$datetime_ticket] > 0
627 627
                 ) {
628 628
                     if ($this->debug) {
629 629
                         \EEH_Debug_Tools::printr($datetime_ticket, ' . . . adjust ticket quantities for', __FILE__,
@@ -633,14 +633,14 @@  discard block
 block discarded – undo
633 633
                     // otherwise just subtract the ticket quantity
634 634
                     $new_quantity = $at_capacity
635 635
                         ? 0
636
-                        : $this->ticket_quantities[ $datetime_ticket ] - $ticket_quantity;
636
+                        : $this->ticket_quantities[$datetime_ticket] - $ticket_quantity;
637 637
                     // don't let ticket quantity go below zero
638
-                    $this->ticket_quantities[ $datetime_ticket ] = max($new_quantity, 0);
638
+                    $this->ticket_quantities[$datetime_ticket] = max($new_quantity, 0);
639 639
                     if ($this->debug) {
640 640
                         \EEH_Debug_Tools::printr(
641 641
                             $at_capacity
642 642
                                 ? "0 because Datetime {$datetime_identifier} is at capacity"
643
-                                : "{$this->ticket_quantities[ $datetime_ticket ]}",
643
+                                : "{$this->ticket_quantities[$datetime_ticket]}",
644 644
                             " . . . . {$datetime_ticket} quantity set to ",
645 645
                             __FILE__, __LINE__
646 646
                         );
@@ -648,14 +648,14 @@  discard block
 block discarded – undo
648 648
                 }
649 649
                 // but we also need to adjust spaces for any other datetimes this ticket has access to
650 650
                 if ($datetime_ticket === $ticket_identifier) {
651
-                    if (isset($this->ticket_datetimes[ $datetime_ticket ])
652
-                        && is_array($this->ticket_datetimes[ $datetime_ticket ])
651
+                    if (isset($this->ticket_datetimes[$datetime_ticket])
652
+                        && is_array($this->ticket_datetimes[$datetime_ticket])
653 653
                     ) {
654 654
                         if ($this->debug) {
655 655
                             \EEH_Debug_Tools::printr($datetime_ticket, ' . . adjust other Datetimes for', __FILE__,
656 656
                                 __LINE__);
657 657
                         }
658
-                        foreach ($this->ticket_datetimes[ $datetime_ticket ] as $datetime) {
658
+                        foreach ($this->ticket_datetimes[$datetime_ticket] as $datetime) {
659 659
                             // don't adjust the current datetime twice
660 660
                             if ($datetime !== $datetime_identifier) {
661 661
                                 $this->adjustDatetimeSpaces(
@@ -676,19 +676,19 @@  discard block
 block discarded – undo
676 676
         // does datetime have spaces available?
677 677
         // and does the supplied ticket have access to this datetime ?
678 678
         if (
679
-            $this->datetime_spaces[ $datetime_identifier ] > 0
680
-            && isset($this->datetime_spaces[ $datetime_identifier ], $this->datetime_tickets[ $datetime_identifier ])
681
-            && in_array($ticket_identifier, $this->datetime_tickets[ $datetime_identifier ], true)
679
+            $this->datetime_spaces[$datetime_identifier] > 0
680
+            && isset($this->datetime_spaces[$datetime_identifier], $this->datetime_tickets[$datetime_identifier])
681
+            && in_array($ticket_identifier, $this->datetime_tickets[$datetime_identifier], true)
682 682
             ) {
683 683
             if ($this->debug) {
684 684
                 \EEH_Debug_Tools::printr($datetime_identifier, ' . . adjust Datetime Spaces for', __FILE__, __LINE__);
685
-                \EEH_Debug_Tools::printr("{$this->datetime_spaces[ $datetime_identifier ]}", " . . current  {$datetime_identifier} spaces available", __FILE__, __LINE__);
685
+                \EEH_Debug_Tools::printr("{$this->datetime_spaces[$datetime_identifier]}", " . . current  {$datetime_identifier} spaces available", __FILE__, __LINE__);
686 686
             }
687 687
             // then decrement the available spaces for the datetime
688
-            $this->datetime_spaces[ $datetime_identifier ] -= $ticket_quantity;
688
+            $this->datetime_spaces[$datetime_identifier] -= $ticket_quantity;
689 689
             // but don't let quantities go below zero
690
-            $this->datetime_spaces[ $datetime_identifier ] = max(
691
-                $this->datetime_spaces[ $datetime_identifier ],
690
+            $this->datetime_spaces[$datetime_identifier] = max(
691
+                $this->datetime_spaces[$datetime_identifier],
692 692
                 0
693 693
             );
694 694
             if ($this->debug) {
Please login to merge, or discard this patch.
core/db_classes/EE_Event.class.php 2 patches
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@  discard block
 block discarded – undo
3 3
 use EventEspresso\core\domain\services\event\EventSpacesCalculator;
4 4
 use EventEspresso\core\exceptions\UnexpectedEntityException;
5 5
 
6
-if (!defined('EVENT_ESPRESSO_VERSION')) {
6
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
7 7
     exit('No direct script access allowed');
8 8
 }
9 9
 
@@ -75,7 +75,7 @@  discard block
 block discarded – undo
75 75
      */
76 76
     public function getAvailableSpacesCalculator()
77 77
     {
78
-        if(! $this->available_spaces_calculator instanceof EventSpacesCalculator){
78
+        if ( ! $this->available_spaces_calculator instanceof EventSpacesCalculator) {
79 79
             $this->available_spaces_calculator = new EventSpacesCalculator($this);
80 80
         }
81 81
         return $this->available_spaces_calculator;
@@ -118,7 +118,7 @@  discard block
 block discarded – undo
118 118
     public function set_status($new_status = null, $use_default = false)
119 119
     {
120 120
         // if nothing is set, and we aren't explicitly wanting to reset the status, then just leave
121
-        if (empty($new_status) && !$use_default) {
121
+        if (empty($new_status) && ! $use_default) {
122 122
             return;
123 123
         }
124 124
         // get current Event status
@@ -218,7 +218,7 @@  discard block
 block discarded – undo
218 218
      */
219 219
     public function primary_datetime($try_to_exclude_expired = true, $try_to_exclude_deleted = true)
220 220
     {
221
-        if (!empty ($this->_Primary_Datetime)) {
221
+        if ( ! empty ($this->_Primary_Datetime)) {
222 222
             return $this->_Primary_Datetime;
223 223
         }
224 224
         $this->_Primary_Datetime = EEM_Datetime::instance($this->_timezone)->get_primary_datetime_for_event(
@@ -241,7 +241,7 @@  discard block
 block discarded – undo
241 241
     {
242 242
         //first get all datetimes
243 243
         $datetimes = $this->datetimes_ordered();
244
-        if (!$datetimes) {
244
+        if ( ! $datetimes) {
245 245
             return array();
246 246
         }
247 247
         $datetime_ids = array();
@@ -345,7 +345,7 @@  discard block
 block discarded – undo
345 345
      */
346 346
     public function display_ticket_selector()
347 347
     {
348
-        return (bool)$this->get('EVT_display_ticket_selector');
348
+        return (bool) $this->get('EVT_display_ticket_selector');
349 349
     }
350 350
 
351 351
 
@@ -416,7 +416,7 @@  discard block
 block discarded – undo
416 416
     public function default_registration_status()
417 417
     {
418 418
         $event_default_registration_status = $this->get('EVT_default_registration_status');
419
-        return !empty($event_default_registration_status)
419
+        return ! empty($event_default_registration_status)
420 420
             ? $event_default_registration_status
421 421
             : EE_Registry::instance()->CFG->registration->default_STS_ID;
422 422
     }
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
     public function short_description($num_words = 55, $more = null, $not_full_desc = false)
433 433
     {
434 434
         $short_desc = $this->get('EVT_short_desc');
435
-        if (!empty($short_desc) || $not_full_desc) {
435
+        if ( ! empty($short_desc) || $not_full_desc) {
436 436
             return $short_desc;
437 437
         }
438 438
         $full_desc = $this->get('EVT_desc');
@@ -886,7 +886,7 @@  discard block
 block discarded – undo
886 886
         );
887 887
         $all_expired = true;
888 888
         foreach ($tickets as $ticket) {
889
-            if(!$ticket->is_expired()){
889
+            if ( ! $ticket->is_expired()) {
890 890
                 $all_expired = false;
891 891
                 break;
892 892
             }
@@ -977,7 +977,7 @@  discard block
 block discarded – undo
977 977
      */
978 978
     public function is_sold_out($actual = false)
979 979
     {
980
-        if (!$actual) {
980
+        if ( ! $actual) {
981 981
             return $this->status() === EEM_Event::sold_out;
982 982
         }
983 983
         return $this->perform_sold_out_status_check();
@@ -1022,11 +1022,11 @@  discard block
 block discarded – undo
1022 1022
     public function get_active_status($reset = false)
1023 1023
     {
1024 1024
         // if the active status has already been set, then just use that value (unless we are resetting it)
1025
-        if (!empty($this->_active_status) && !$reset) {
1025
+        if ( ! empty($this->_active_status) && ! $reset) {
1026 1026
             return $this->_active_status;
1027 1027
         }
1028 1028
         //first check if event id is present on this object
1029
-        if (!$this->ID()) {
1029
+        if ( ! $this->ID()) {
1030 1030
             return false;
1031 1031
         }
1032 1032
         $where_params_for_event = array(array('EVT_ID' => $this->ID()));
@@ -1103,7 +1103,7 @@  discard block
 block discarded – undo
1103 1103
     public function get_number_of_tickets_sold()
1104 1104
     {
1105 1105
         $tkt_sold = 0;
1106
-        if (!$this->ID()) {
1106
+        if ( ! $this->ID()) {
1107 1107
             return 0;
1108 1108
         }
1109 1109
         $datetimes = $this->datetimes();
@@ -1169,7 +1169,7 @@  discard block
 block discarded – undo
1169 1169
     {
1170 1170
         $earliest_ticket = $this->get_ticket_with_earliest_start_time();
1171 1171
         $latest_ticket = $this->get_ticket_with_latest_end_time();
1172
-        if (!$latest_ticket instanceof EE_Ticket && !$earliest_ticket instanceof EE_Ticket) {
1172
+        if ( ! $latest_ticket instanceof EE_Ticket && ! $earliest_ticket instanceof EE_Ticket) {
1173 1173
             return false;
1174 1174
         }
1175 1175
         //check on sale for these two tickets.
@@ -1235,7 +1235,7 @@  discard block
 block discarded – undo
1235 1235
      */
1236 1236
     public function question_groups($query_params = array())
1237 1237
     {
1238
-        $query_params = !empty($query_params) ? $query_params : array('order_by' => array('QSG_order' => 'ASC'));
1238
+        $query_params = ! empty($query_params) ? $query_params : array('order_by' => array('QSG_order' => 'ASC'));
1239 1239
         return $this->get_many_related('Question_Group', $query_params);
1240 1240
     }
1241 1241
 
Please login to merge, or discard this patch.
Indentation   +1335 added lines, -1335 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
 use EventEspresso\core\exceptions\UnexpectedEntityException;
5 5
 
6 6
 if (!defined('EVENT_ESPRESSO_VERSION')) {
7
-    exit('No direct script access allowed');
7
+	exit('No direct script access allowed');
8 8
 }
9 9
 
10 10
 
@@ -18,1339 +18,1339 @@  discard block
 block discarded – undo
18 18
 class EE_Event extends EE_CPT_Base implements EEI_Line_Item_Object, EEI_Admin_Links, EEI_Has_Icon, EEI_Event
19 19
 {
20 20
 
21
-    /**
22
-     * cached value for the the logical active status for the event
23
-     *
24
-     * @see get_active_status()
25
-     * @var string
26
-     */
27
-    protected $_active_status = '';
28
-
29
-    /**
30
-     * This is just used for caching the Primary Datetime for the Event on initial retrieval
31
-     *
32
-     * @var EE_Datetime
33
-     */
34
-    protected $_Primary_Datetime;
35
-
36
-    /**
37
-     * @var EventSpacesCalculator $available_spaces_calculator
38
-     */
39
-    protected $available_spaces_calculator;
40
-
41
-
42
-    /**
43
-     * @param array $props_n_values incoming values
44
-     * @param string $timezone incoming timezone (if not set the timezone set for the website will be
45
-     *                                        used.)
46
-     * @param array $date_formats incoming date_formats in an array where the first value is the
47
-     *                                        date_format and the second value is the time format
48
-     * @return EE_Event
49
-     * @throws EE_Error
50
-     */
51
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
52
-    {
53
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
54
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
55
-    }
56
-
57
-
58
-    /**
59
-     * @param array $props_n_values incoming values from the database
60
-     * @param string $timezone incoming timezone as set by the model.  If not set the timezone for
61
-     *                                the website will be used.
62
-     * @return EE_Event
63
-     * @throws EE_Error
64
-     */
65
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
66
-    {
67
-        return new self($props_n_values, true, $timezone);
68
-    }
69
-
70
-
71
-
72
-    /**
73
-     * @return EventSpacesCalculator
74
-     * @throws \EE_Error
75
-     */
76
-    public function getAvailableSpacesCalculator()
77
-    {
78
-        if(! $this->available_spaces_calculator instanceof EventSpacesCalculator){
79
-            $this->available_spaces_calculator = new EventSpacesCalculator($this);
80
-        }
81
-        return $this->available_spaces_calculator;
82
-    }
83
-
84
-
85
-
86
-    /**
87
-     * Overrides parent set() method so that all calls to set( 'status', $status ) can be routed to internal methods
88
-     *
89
-     * @param string $field_name
90
-     * @param mixed $field_value
91
-     * @param bool $use_default
92
-     * @throws EE_Error
93
-     */
94
-    public function set($field_name, $field_value, $use_default = false)
95
-    {
96
-        switch ($field_name) {
97
-            case 'status' :
98
-                $this->set_status($field_value, $use_default);
99
-                break;
100
-            default :
101
-                parent::set($field_name, $field_value, $use_default);
102
-        }
103
-    }
104
-
105
-
106
-    /**
107
-     *    set_status
108
-     * Checks if event status is being changed to SOLD OUT
109
-     * and updates event meta data with previous event status
110
-     * so that we can revert things if/when the event is no longer sold out
111
-     *
112
-     * @access public
113
-     * @param string $new_status
114
-     * @param bool $use_default
115
-     * @return void
116
-     * @throws EE_Error
117
-     */
118
-    public function set_status($new_status = null, $use_default = false)
119
-    {
120
-        // if nothing is set, and we aren't explicitly wanting to reset the status, then just leave
121
-        if (empty($new_status) && !$use_default) {
122
-            return;
123
-        }
124
-        // get current Event status
125
-        $old_status = $this->status();
126
-        // if status has changed
127
-        if ($old_status !== $new_status) {
128
-            // TO sold_out
129
-            if ($new_status === EEM_Event::sold_out) {
130
-                // save the previous event status so that we can revert if the event is no longer sold out
131
-                $this->add_post_meta('_previous_event_status', $old_status);
132
-                do_action('AHEE__EE_Event__set_status__to_sold_out', $this, $old_status, $new_status);
133
-                // OR FROM  sold_out
134
-            } else if ($old_status === EEM_Event::sold_out) {
135
-                $this->delete_post_meta('_previous_event_status');
136
-                do_action('AHEE__EE_Event__set_status__from_sold_out', $this, $old_status, $new_status);
137
-            }
138
-            //clear out the active status so that it gets reset the next time it is requested
139
-            $this->_active_status = null;
140
-            // update status
141
-            parent::set('status', $new_status, $use_default);
142
-            do_action('AHEE__EE_Event__set_status__after_update', $this);
143
-            return;
144
-        }
145
-        // even though the old value matches the new value, it's still good to
146
-        // allow the parent set method to have a say
147
-        parent::set('status', $new_status, $use_default);
148
-    }
149
-
150
-
151
-    /**
152
-     * Gets all the datetimes for this event
153
-     *
154
-     * @param array $query_params like EEM_Base::get_all
155
-     * @return EE_Base_Class[]|EE_Datetime[]
156
-     * @throws EE_Error
157
-     */
158
-    public function datetimes($query_params = array())
159
-    {
160
-        return $this->get_many_related('Datetime', $query_params);
161
-    }
162
-
163
-
164
-    /**
165
-     * Gets all the datetimes for this event, ordered by DTT_EVT_start in ascending order
166
-     *
167
-     * @return EE_Base_Class[]|EE_Datetime[]
168
-     * @throws EE_Error
169
-     */
170
-    public function datetimes_in_chronological_order()
171
-    {
172
-        return $this->get_many_related('Datetime', array('order_by' => array('DTT_EVT_start' => 'ASC')));
173
-    }
174
-
175
-
176
-    /**
177
-     * Gets all the datetimes for this event, ordered by the DTT_order on the datetime.
178
-     * @darren, we should probably UNSET timezone on the EEM_Datetime model
179
-     * after running our query, so that this timezone isn't set for EVERY query
180
-     * on EEM_Datetime for the rest of the request, no?
181
-     *
182
-     * @param boolean $show_expired whether or not to include expired events
183
-     * @param boolean $show_deleted whether or not to include deleted events
184
-     * @param null $limit
185
-     * @return EE_Datetime[]
186
-     * @throws EE_Error
187
-     */
188
-    public function datetimes_ordered($show_expired = true, $show_deleted = false, $limit = null)
189
-    {
190
-        return EEM_Datetime::instance($this->_timezone)->get_datetimes_for_event_ordered_by_DTT_order(
191
-            $this->ID(),
192
-            $show_expired,
193
-            $show_deleted,
194
-            $limit
195
-        );
196
-    }
197
-
198
-
199
-    /**
200
-     * Returns one related datetime. Mostly only used by some legacy code.
201
-     *
202
-     * @return EE_Base_Class|EE_Datetime
203
-     * @throws EE_Error
204
-     */
205
-    public function first_datetime()
206
-    {
207
-        return $this->get_first_related('Datetime');
208
-    }
209
-
210
-
211
-    /**
212
-     * Returns the 'primary' datetime for the event
213
-     *
214
-     * @param bool $try_to_exclude_expired
215
-     * @param bool $try_to_exclude_deleted
216
-     * @return EE_Datetime
217
-     * @throws EE_Error
218
-     */
219
-    public function primary_datetime($try_to_exclude_expired = true, $try_to_exclude_deleted = true)
220
-    {
221
-        if (!empty ($this->_Primary_Datetime)) {
222
-            return $this->_Primary_Datetime;
223
-        }
224
-        $this->_Primary_Datetime = EEM_Datetime::instance($this->_timezone)->get_primary_datetime_for_event(
225
-            $this->ID(),
226
-            $try_to_exclude_expired,
227
-            $try_to_exclude_deleted
228
-        );
229
-        return $this->_Primary_Datetime;
230
-    }
231
-
232
-
233
-    /**
234
-     * Gets all the tickets available for purchase of this event
235
-     *
236
-     * @param array $query_params like EEM_Base::get_all
237
-     * @return EE_Base_Class[]|EE_Ticket[]
238
-     * @throws EE_Error
239
-     */
240
-    public function tickets($query_params = array())
241
-    {
242
-        //first get all datetimes
243
-        $datetimes = $this->datetimes_ordered();
244
-        if (!$datetimes) {
245
-            return array();
246
-        }
247
-        $datetime_ids = array();
248
-        foreach ($datetimes as $datetime) {
249
-            $datetime_ids[] = $datetime->ID();
250
-        }
251
-        $where_params = array('Datetime.DTT_ID' => array('IN', $datetime_ids));
252
-        //if incoming $query_params has where conditions let's merge but not override existing.
253
-        if (is_array($query_params) && isset($query_params[0])) {
254
-            $where_params = array_merge($query_params[0], $where_params);
255
-            unset($query_params[0]);
256
-        }
257
-        //now add $where_params to $query_params
258
-        $query_params[0] = $where_params;
259
-        return EEM_Ticket::instance()->get_all($query_params);
260
-    }
261
-
262
-
263
-    /**
264
-     * get all unexpired untrashed tickets
265
-     *
266
-     * @return EE_Ticket[]
267
-     * @throws EE_Error
268
-     */
269
-    public function active_tickets()
270
-    {
271
-        return $this->tickets(array(
272
-            array(
273
-                'TKT_end_date' => array('>=', EEM_Ticket::instance()->current_time_for_query('TKT_end_date')),
274
-                'TKT_deleted' => false,
275
-            ),
276
-        ));
277
-    }
278
-
279
-
280
-    /**
281
-     * @return bool
282
-     * @throws EE_Error
283
-     */
284
-    public function additional_limit()
285
-    {
286
-        return $this->get('EVT_additional_limit');
287
-    }
288
-
289
-
290
-    /**
291
-     * @return bool
292
-     * @throws EE_Error
293
-     */
294
-    public function allow_overflow()
295
-    {
296
-        return $this->get('EVT_allow_overflow');
297
-    }
298
-
299
-
300
-    /**
301
-     * @return bool
302
-     * @throws EE_Error
303
-     */
304
-    public function created()
305
-    {
306
-        return $this->get('EVT_created');
307
-    }
308
-
309
-
310
-    /**
311
-     * @return bool
312
-     * @throws EE_Error
313
-     */
314
-    public function description()
315
-    {
316
-        return $this->get('EVT_desc');
317
-    }
318
-
319
-
320
-    /**
321
-     * Runs do_shortcode and wpautop on the description
322
-     *
323
-     * @return string of html
324
-     * @throws EE_Error
325
-     */
326
-    public function description_filtered()
327
-    {
328
-        return $this->get_pretty('EVT_desc');
329
-    }
330
-
331
-
332
-    /**
333
-     * @return bool
334
-     * @throws EE_Error
335
-     */
336
-    public function display_description()
337
-    {
338
-        return $this->get('EVT_display_desc');
339
-    }
340
-
341
-
342
-    /**
343
-     * @return bool
344
-     * @throws EE_Error
345
-     */
346
-    public function display_ticket_selector()
347
-    {
348
-        return (bool)$this->get('EVT_display_ticket_selector');
349
-    }
350
-
351
-
352
-    /**
353
-     * @return bool
354
-     * @throws EE_Error
355
-     */
356
-    public function external_url()
357
-    {
358
-        return $this->get('EVT_external_URL');
359
-    }
360
-
361
-
362
-    /**
363
-     * @return bool
364
-     * @throws EE_Error
365
-     */
366
-    public function member_only()
367
-    {
368
-        return $this->get('EVT_member_only');
369
-    }
370
-
371
-
372
-    /**
373
-     * @return bool
374
-     * @throws EE_Error
375
-     */
376
-    public function phone()
377
-    {
378
-        return $this->get('EVT_phone');
379
-    }
380
-
381
-
382
-    /**
383
-     * @return bool
384
-     * @throws EE_Error
385
-     */
386
-    public function modified()
387
-    {
388
-        return $this->get('EVT_modified');
389
-    }
390
-
391
-
392
-    /**
393
-     * @return bool
394
-     * @throws EE_Error
395
-     */
396
-    public function name()
397
-    {
398
-        return $this->get('EVT_name');
399
-    }
400
-
401
-
402
-    /**
403
-     * @return bool
404
-     * @throws EE_Error
405
-     */
406
-    public function order()
407
-    {
408
-        return $this->get('EVT_order');
409
-    }
410
-
411
-
412
-    /**
413
-     * @return bool|string
414
-     * @throws EE_Error
415
-     */
416
-    public function default_registration_status()
417
-    {
418
-        $event_default_registration_status = $this->get('EVT_default_registration_status');
419
-        return !empty($event_default_registration_status)
420
-            ? $event_default_registration_status
421
-            : EE_Registry::instance()->CFG->registration->default_STS_ID;
422
-    }
423
-
424
-
425
-    /**
426
-     * @param int $num_words
427
-     * @param null $more
428
-     * @param bool $not_full_desc
429
-     * @return bool|string
430
-     * @throws EE_Error
431
-     */
432
-    public function short_description($num_words = 55, $more = null, $not_full_desc = false)
433
-    {
434
-        $short_desc = $this->get('EVT_short_desc');
435
-        if (!empty($short_desc) || $not_full_desc) {
436
-            return $short_desc;
437
-        }
438
-        $full_desc = $this->get('EVT_desc');
439
-        return wp_trim_words($full_desc, $num_words, $more);
440
-    }
441
-
442
-
443
-    /**
444
-     * @return bool
445
-     * @throws EE_Error
446
-     */
447
-    public function slug()
448
-    {
449
-        return $this->get('EVT_slug');
450
-    }
451
-
452
-
453
-    /**
454
-     * @return bool
455
-     * @throws EE_Error
456
-     */
457
-    public function timezone_string()
458
-    {
459
-        return $this->get('EVT_timezone_string');
460
-    }
461
-
462
-
463
-    /**
464
-     * @return bool
465
-     * @throws EE_Error
466
-     */
467
-    public function visible_on()
468
-    {
469
-        return $this->get('EVT_visible_on');
470
-    }
471
-
472
-
473
-    /**
474
-     * @return int
475
-     * @throws EE_Error
476
-     */
477
-    public function wp_user()
478
-    {
479
-        return $this->get('EVT_wp_user');
480
-    }
481
-
482
-
483
-    /**
484
-     * @return bool
485
-     * @throws EE_Error
486
-     */
487
-    public function donations()
488
-    {
489
-        return $this->get('EVT_donations');
490
-    }
491
-
492
-
493
-    /**
494
-     * @param $limit
495
-     * @throws EE_Error
496
-     */
497
-    public function set_additional_limit($limit)
498
-    {
499
-        $this->set('EVT_additional_limit', $limit);
500
-    }
501
-
502
-
503
-    /**
504
-     * @param $created
505
-     * @throws EE_Error
506
-     */
507
-    public function set_created($created)
508
-    {
509
-        $this->set('EVT_created', $created);
510
-    }
511
-
512
-
513
-    /**
514
-     * @param $desc
515
-     * @throws EE_Error
516
-     */
517
-    public function set_description($desc)
518
-    {
519
-        $this->set('EVT_desc', $desc);
520
-    }
521
-
522
-
523
-    /**
524
-     * @param $display_desc
525
-     * @throws EE_Error
526
-     */
527
-    public function set_display_description($display_desc)
528
-    {
529
-        $this->set('EVT_display_desc', $display_desc);
530
-    }
531
-
532
-
533
-    /**
534
-     * @param $display_ticket_selector
535
-     * @throws EE_Error
536
-     */
537
-    public function set_display_ticket_selector($display_ticket_selector)
538
-    {
539
-        $this->set('EVT_display_ticket_selector', $display_ticket_selector);
540
-    }
541
-
542
-
543
-    /**
544
-     * @param $external_url
545
-     * @throws EE_Error
546
-     */
547
-    public function set_external_url($external_url)
548
-    {
549
-        $this->set('EVT_external_URL', $external_url);
550
-    }
551
-
552
-
553
-    /**
554
-     * @param $member_only
555
-     * @throws EE_Error
556
-     */
557
-    public function set_member_only($member_only)
558
-    {
559
-        $this->set('EVT_member_only', $member_only);
560
-    }
561
-
562
-
563
-    /**
564
-     * @param $event_phone
565
-     * @throws EE_Error
566
-     */
567
-    public function set_event_phone($event_phone)
568
-    {
569
-        $this->set('EVT_phone', $event_phone);
570
-    }
571
-
572
-
573
-    /**
574
-     * @param $modified
575
-     * @throws EE_Error
576
-     */
577
-    public function set_modified($modified)
578
-    {
579
-        $this->set('EVT_modified', $modified);
580
-    }
581
-
582
-
583
-    /**
584
-     * @param $name
585
-     * @throws EE_Error
586
-     */
587
-    public function set_name($name)
588
-    {
589
-        $this->set('EVT_name', $name);
590
-    }
591
-
592
-
593
-    /**
594
-     * @param $order
595
-     * @throws EE_Error
596
-     */
597
-    public function set_order($order)
598
-    {
599
-        $this->set('EVT_order', $order);
600
-    }
601
-
602
-
603
-    /**
604
-     * @param $short_desc
605
-     * @throws EE_Error
606
-     */
607
-    public function set_short_description($short_desc)
608
-    {
609
-        $this->set('EVT_short_desc', $short_desc);
610
-    }
611
-
612
-
613
-    /**
614
-     * @param $slug
615
-     * @throws EE_Error
616
-     */
617
-    public function set_slug($slug)
618
-    {
619
-        $this->set('EVT_slug', $slug);
620
-    }
621
-
622
-
623
-    /**
624
-     * @param $timezone_string
625
-     * @throws EE_Error
626
-     */
627
-    public function set_timezone_string($timezone_string)
628
-    {
629
-        $this->set('EVT_timezone_string', $timezone_string);
630
-    }
631
-
632
-
633
-    /**
634
-     * @param $visible_on
635
-     * @throws EE_Error
636
-     */
637
-    public function set_visible_on($visible_on)
638
-    {
639
-        $this->set('EVT_visible_on', $visible_on);
640
-    }
641
-
642
-
643
-    /**
644
-     * @param $wp_user
645
-     * @throws EE_Error
646
-     */
647
-    public function set_wp_user($wp_user)
648
-    {
649
-        $this->set('EVT_wp_user', $wp_user);
650
-    }
651
-
652
-
653
-    /**
654
-     * @param $default_registration_status
655
-     * @throws EE_Error
656
-     */
657
-    public function set_default_registration_status($default_registration_status)
658
-    {
659
-        $this->set('EVT_default_registration_status', $default_registration_status);
660
-    }
661
-
662
-
663
-    /**
664
-     * @param $donations
665
-     * @throws EE_Error
666
-     */
667
-    public function set_donations($donations)
668
-    {
669
-        $this->set('EVT_donations', $donations);
670
-    }
671
-
672
-
673
-    /**
674
-     * Adds a venue to this event
675
-     *
676
-     * @param EE_Venue /int $venue_id_or_obj
677
-     * @return EE_Base_Class|EE_Venue
678
-     * @throws EE_Error
679
-     */
680
-    public function add_venue($venue_id_or_obj)
681
-    {
682
-        return $this->_add_relation_to($venue_id_or_obj, 'Venue');
683
-    }
684
-
685
-
686
-    /**
687
-     * Removes a venue from the event
688
-     *
689
-     * @param EE_Venue /int $venue_id_or_obj
690
-     * @return EE_Base_Class|EE_Venue
691
-     * @throws EE_Error
692
-     */
693
-    public function remove_venue($venue_id_or_obj)
694
-    {
695
-        return $this->_remove_relation_to($venue_id_or_obj, 'Venue');
696
-    }
697
-
698
-
699
-    /**
700
-     * Gets all the venues related ot the event. May provide additional $query_params if desired
701
-     *
702
-     * @param array $query_params like EEM_Base::get_all's $query_params
703
-     * @return EE_Base_Class[]|EE_Venue[]
704
-     * @throws EE_Error
705
-     */
706
-    public function venues($query_params = array())
707
-    {
708
-        return $this->get_many_related('Venue', $query_params);
709
-    }
710
-
711
-
712
-    /**
713
-     * check if event id is present and if event is published
714
-     *
715
-     * @access public
716
-     * @return boolean true yes, false no
717
-     * @throws EE_Error
718
-     */
719
-    private function _has_ID_and_is_published()
720
-    {
721
-        // first check if event id is present and not NULL,
722
-        // then check if this event is published (or any of the equivalent "published" statuses)
723
-        return
724
-            $this->ID() && $this->ID() !== null
725
-            && (
726
-                $this->status() === 'publish'
727
-                || $this->status() === EEM_Event::sold_out
728
-                || $this->status() === EEM_Event::postponed
729
-                || $this->status() === EEM_Event::cancelled
730
-            );
731
-    }
732
-
733
-
734
-    /**
735
-     * This simply compares the internal dates with NOW and determines if the event is upcoming or not.
736
-     *
737
-     * @access public
738
-     * @return boolean true yes, false no
739
-     * @throws EE_Error
740
-     */
741
-    public function is_upcoming()
742
-    {
743
-        // check if event id is present and if this event is published
744
-        if ($this->is_inactive()) {
745
-            return false;
746
-        }
747
-        // set initial value
748
-        $upcoming = false;
749
-        //next let's get all datetimes and loop through them
750
-        $datetimes = $this->datetimes_in_chronological_order();
751
-        foreach ($datetimes as $datetime) {
752
-            if ($datetime instanceof EE_Datetime) {
753
-                //if this dtt is expired then we continue cause one of the other datetimes might be upcoming.
754
-                if ($datetime->is_expired()) {
755
-                    continue;
756
-                }
757
-                //if this dtt is active then we return false.
758
-                if ($datetime->is_active()) {
759
-                    return false;
760
-                }
761
-                //otherwise let's check upcoming status
762
-                $upcoming = $datetime->is_upcoming();
763
-            }
764
-        }
765
-        return $upcoming;
766
-    }
767
-
768
-
769
-    /**
770
-     * @return bool
771
-     * @throws EE_Error
772
-     */
773
-    public function is_active()
774
-    {
775
-        // check if event id is present and if this event is published
776
-        if ($this->is_inactive()) {
777
-            return false;
778
-        }
779
-        // set initial value
780
-        $active = false;
781
-        //next let's get all datetimes and loop through them
782
-        $datetimes = $this->datetimes_in_chronological_order();
783
-        foreach ($datetimes as $datetime) {
784
-            if ($datetime instanceof EE_Datetime) {
785
-                //if this dtt is expired then we continue cause one of the other datetimes might be active.
786
-                if ($datetime->is_expired()) {
787
-                    continue;
788
-                }
789
-                //if this dtt is upcoming then we return false.
790
-                if ($datetime->is_upcoming()) {
791
-                    return false;
792
-                }
793
-                //otherwise let's check active status
794
-                $active = $datetime->is_active();
795
-            }
796
-        }
797
-        return $active;
798
-    }
799
-
800
-
801
-    /**
802
-     * @return bool
803
-     * @throws EE_Error
804
-     */
805
-    public function is_expired()
806
-    {
807
-        // check if event id is present and if this event is published
808
-        if ($this->is_inactive()) {
809
-            return false;
810
-        }
811
-        // set initial value
812
-        $expired = false;
813
-        //first let's get all datetimes and loop through them
814
-        $datetimes = $this->datetimes_in_chronological_order();
815
-        foreach ($datetimes as $datetime) {
816
-            if ($datetime instanceof EE_Datetime) {
817
-                //if this dtt is upcoming or active then we return false.
818
-                if ($datetime->is_upcoming() || $datetime->is_active()) {
819
-                    return false;
820
-                }
821
-                //otherwise let's check active status
822
-                $expired = $datetime->is_expired();
823
-            }
824
-        }
825
-        return $expired;
826
-    }
827
-
828
-
829
-    /**
830
-     * @return bool
831
-     * @throws EE_Error
832
-     */
833
-    public function is_inactive()
834
-    {
835
-        // check if event id is present and if this event is published
836
-        if ($this->_has_ID_and_is_published()) {
837
-            return false;
838
-        }
839
-        return true;
840
-    }
841
-
842
-
843
-    /**
844
-     * calculate spaces remaining based on "saleable" tickets
845
-     *
846
-     * @param array $tickets
847
-     * @param bool $filtered
848
-     * @return int|float
849
-     * @throws EE_Error
850
-     * @throws DomainException
851
-     * @throws UnexpectedEntityException
852
-     */
853
-    public function spaces_remaining($tickets = array(), $filtered = true)
854
-    {
855
-        $this->getAvailableSpacesCalculator()->setActiveTickets($tickets);
856
-        $spaces_remaining = $this->getAvailableSpacesCalculator()->spacesRemaining();
857
-        return $filtered
858
-            ? apply_filters(
859
-                'FHEE_EE_Event__spaces_remaining',
860
-                $spaces_remaining,
861
-                $this,
862
-                $tickets
863
-            )
864
-            : $spaces_remaining;
865
-    }
866
-
867
-
868
-    /**
869
-     *    perform_sold_out_status_check
870
-     *    checks all of this events's datetime  reg_limit - sold values to determine if ANY datetimes have spaces available...
871
-     *    if NOT, then the event status will get toggled to 'sold_out'
872
-     *
873
-     * @return bool    return the ACTUAL sold out state.
874
-     * @throws EE_Error
875
-     * @throws DomainException
876
-     * @throws UnexpectedEntityException
877
-     */
878
-    public function perform_sold_out_status_check()
879
-    {
880
-        // get all unexpired untrashed tickets
881
-        $tickets = $this->tickets(
882
-            array(
883
-                array('TKT_deleted' => false),
884
-                'order_by' => array('TKT_qty' => 'ASC'),
885
-            )
886
-        );
887
-        $all_expired = true;
888
-        foreach ($tickets as $ticket) {
889
-            if(!$ticket->is_expired()){
890
-                $all_expired = false;
891
-                break;
892
-            }
893
-        }
894
-        // if all the tickets are just expired, then don't update the event status to sold out
895
-        if ($all_expired) {
896
-            return true;
897
-        }
898
-        $spaces_remaining = $this->spaces_remaining($tickets);
899
-        if ($spaces_remaining < 1) {
900
-            $this->set_status(EEM_Event::sold_out);
901
-            $this->save();
902
-            $sold_out = true;
903
-        } else {
904
-            $sold_out = false;
905
-            // was event previously marked as sold out ?
906
-            if ($this->status() === EEM_Event::sold_out) {
907
-                // revert status to previous value, if it was set
908
-                $previous_event_status = $this->get_post_meta('_previous_event_status', true);
909
-                if ($previous_event_status) {
910
-                    $this->set_status($previous_event_status);
911
-                    $this->save();
912
-                }
913
-            }
914
-        }
915
-        do_action('AHEE__EE_Event__perform_sold_out_status_check__end', $this, $sold_out, $spaces_remaining, $tickets);
916
-        return $sold_out;
917
-    }
918
-
919
-
920
-
921
-    /**
922
-     * This returns the total remaining spaces for sale on this event.
923
-     *
924
-     * @uses EE_Event::total_available_spaces()
925
-     * @return float|int
926
-     * @throws EE_Error
927
-     * @throws DomainException
928
-     * @throws UnexpectedEntityException
929
-     */
930
-    public function spaces_remaining_for_sale()
931
-    {
932
-        return $this->total_available_spaces(true);
933
-    }
934
-
935
-
936
-
937
-    /**
938
-     * This returns the total spaces available for an event
939
-     * while considering all the qtys on the tickets and the reg limits
940
-     * on the datetimes attached to this event.
941
-     *
942
-     * @param   bool $consider_sold Whether to consider any tickets that have already sold in our calculation.
943
-     *                              If this is false, then we return the most tickets that could ever be sold
944
-     *                              for this event with the datetime and tickets setup on the event under optimal
945
-     *                              selling conditions.  Otherwise we return a live calculation of spaces available
946
-     *                              based on tickets sold.  Depending on setup and stage of sales, this
947
-     *                              may appear to equal remaining tickets.  However, the more tickets are
948
-     *                              sold out, the more accurate the "live" total is.
949
-     * @return float|int
950
-     * @throws EE_Error
951
-     * @throws DomainException
952
-     * @throws UnexpectedEntityException
953
-     */
954
-    public function total_available_spaces($consider_sold = false)
955
-    {
956
-        $spaces_available = $consider_sold
957
-            ? $this->getAvailableSpacesCalculator()->spacesRemaining()
958
-            : $this->getAvailableSpacesCalculator()->totalSpacesAvailable();
959
-        return apply_filters(
960
-            'FHEE_EE_Event__total_available_spaces__spaces_available',
961
-            $spaces_available,
962
-            $this,
963
-            $this->getAvailableSpacesCalculator()->getDatetimes(),
964
-            $this->getAvailableSpacesCalculator()->getActiveTickets()
965
-        );
966
-    }
967
-
968
-
969
-    /**
970
-     * Checks if the event is set to sold out
971
-     *
972
-     * @param  bool $actual whether or not to perform calculations to not only figure the
973
-     *                      actual status but also to flip the status if necessary to sold
974
-     *                      out If false, we just check the existing status of the event
975
-     * @return boolean
976
-     * @throws EE_Error
977
-     */
978
-    public function is_sold_out($actual = false)
979
-    {
980
-        if (!$actual) {
981
-            return $this->status() === EEM_Event::sold_out;
982
-        }
983
-        return $this->perform_sold_out_status_check();
984
-    }
985
-
986
-
987
-    /**
988
-     * Checks if the event is marked as postponed
989
-     *
990
-     * @return boolean
991
-     */
992
-    public function is_postponed()
993
-    {
994
-        return $this->status() === EEM_Event::postponed;
995
-    }
996
-
997
-
998
-    /**
999
-     * Checks if the event is marked as cancelled
1000
-     *
1001
-     * @return boolean
1002
-     */
1003
-    public function is_cancelled()
1004
-    {
1005
-        return $this->status() === EEM_Event::cancelled;
1006
-    }
1007
-
1008
-
1009
-    /**
1010
-     * Get the logical active status in a hierarchical order for all the datetimes.  Note
1011
-     * Basically, we order the datetimes by EVT_start_date.  Then first test on whether the event is published.  If its
1012
-     * NOT published then we test for whether its expired or not.  IF it IS published then we test first on whether an
1013
-     * event has any active dates.  If no active dates then we check for any upcoming dates.  If no upcoming dates then
1014
-     * the event is considered expired.
1015
-     * NOTE: this method does NOT calculate whether the datetimes are sold out when event is published.  Sold Out is a status
1016
-     * set on the EVENT when it is not published and thus is done
1017
-     *
1018
-     * @param bool $reset
1019
-     * @return bool | string - based on EE_Datetime active constants or FALSE if error.
1020
-     * @throws EE_Error
1021
-     */
1022
-    public function get_active_status($reset = false)
1023
-    {
1024
-        // if the active status has already been set, then just use that value (unless we are resetting it)
1025
-        if (!empty($this->_active_status) && !$reset) {
1026
-            return $this->_active_status;
1027
-        }
1028
-        //first check if event id is present on this object
1029
-        if (!$this->ID()) {
1030
-            return false;
1031
-        }
1032
-        $where_params_for_event = array(array('EVT_ID' => $this->ID()));
1033
-        //if event is published:
1034
-        if ($this->status() === 'publish') {
1035
-            //active?
1036
-            if (EEM_Datetime::instance()->get_datetime_count_for_status(EE_Datetime::active, $where_params_for_event) > 0) {
1037
-                $this->_active_status = EE_Datetime::active;
1038
-            } else {
1039
-                //upcoming?
1040
-                if (EEM_Datetime::instance()->get_datetime_count_for_status(EE_Datetime::upcoming, $where_params_for_event) > 0) {
1041
-                    $this->_active_status = EE_Datetime::upcoming;
1042
-                } else {
1043
-                    //expired?
1044
-                    if (
1045
-                        EEM_Datetime::instance()->get_datetime_count_for_status(EE_Datetime::expired, $where_params_for_event) > 0
1046
-                    ) {
1047
-                        $this->_active_status = EE_Datetime::expired;
1048
-                    } else {
1049
-                        //it would be odd if things make it this far because it basically means there are no datetime's
1050
-                        //attached to the event.  So in this case it will just be considered inactive.
1051
-                        $this->_active_status = EE_Datetime::inactive;
1052
-                    }
1053
-                }
1054
-            }
1055
-        } else {
1056
-            //the event is not published, so let's just set it's active status according to its' post status
1057
-            switch ($this->status()) {
1058
-                case EEM_Event::sold_out :
1059
-                    $this->_active_status = EE_Datetime::sold_out;
1060
-                    break;
1061
-                case EEM_Event::cancelled :
1062
-                    $this->_active_status = EE_Datetime::cancelled;
1063
-                    break;
1064
-                case EEM_Event::postponed :
1065
-                    $this->_active_status = EE_Datetime::postponed;
1066
-                    break;
1067
-                default :
1068
-                    $this->_active_status = EE_Datetime::inactive;
1069
-            }
1070
-        }
1071
-        return $this->_active_status;
1072
-    }
1073
-
1074
-
1075
-    /**
1076
-     *    pretty_active_status
1077
-     *
1078
-     * @access public
1079
-     * @param boolean $echo whether to return (FALSE), or echo out the result (TRUE)
1080
-     * @return mixed void|string
1081
-     * @throws EE_Error
1082
-     */
1083
-    public function pretty_active_status($echo = true)
1084
-    {
1085
-        $active_status = $this->get_active_status();
1086
-        $status = '<span class="ee-status event-active-status-'
1087
-            . $active_status
1088
-            . '">'
1089
-            . EEH_Template::pretty_status($active_status, false, 'sentence')
1090
-            . '</span>';
1091
-        if ($echo) {
1092
-            echo $status;
1093
-            return '';
1094
-        }
1095
-        return $status;
1096
-    }
1097
-
1098
-
1099
-    /**
1100
-     * @return bool|int
1101
-     * @throws EE_Error
1102
-     */
1103
-    public function get_number_of_tickets_sold()
1104
-    {
1105
-        $tkt_sold = 0;
1106
-        if (!$this->ID()) {
1107
-            return 0;
1108
-        }
1109
-        $datetimes = $this->datetimes();
1110
-        foreach ($datetimes as $datetime) {
1111
-            if ($datetime instanceof EE_Datetime) {
1112
-                $tkt_sold += $datetime->sold();
1113
-            }
1114
-        }
1115
-        return $tkt_sold;
1116
-    }
1117
-
1118
-
1119
-    /**
1120
-     * This just returns a count of all the registrations for this event
1121
-     *
1122
-     * @access  public
1123
-     * @return int
1124
-     * @throws EE_Error
1125
-     */
1126
-    public function get_count_of_all_registrations()
1127
-    {
1128
-        return EEM_Event::instance()->count_related($this, 'Registration');
1129
-    }
1130
-
1131
-
1132
-    /**
1133
-     * This returns the ticket with the earliest start time that is
1134
-     * available for this event (across all datetimes attached to the event)
1135
-     *
1136
-     * @return EE_Base_Class|EE_Ticket|null
1137
-     * @throws EE_Error
1138
-     */
1139
-    public function get_ticket_with_earliest_start_time()
1140
-    {
1141
-        $where['Datetime.EVT_ID'] = $this->ID();
1142
-        $query_params = array($where, 'order_by' => array('TKT_start_date' => 'ASC'));
1143
-        return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1144
-    }
1145
-
1146
-
1147
-    /**
1148
-     * This returns the ticket with the latest end time that is available
1149
-     * for this event (across all datetimes attached to the event)
1150
-     *
1151
-     * @return EE_Base_Class|EE_Ticket|null
1152
-     * @throws EE_Error
1153
-     */
1154
-    public function get_ticket_with_latest_end_time()
1155
-    {
1156
-        $where['Datetime.EVT_ID'] = $this->ID();
1157
-        $query_params = array($where, 'order_by' => array('TKT_end_date' => 'DESC'));
1158
-        return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1159
-    }
1160
-
1161
-
1162
-    /**
1163
-     * This returns whether there are any tickets on sale for this event.
1164
-     *
1165
-     * @return bool true = YES tickets on sale.
1166
-     * @throws EE_Error
1167
-     */
1168
-    public function tickets_on_sale()
1169
-    {
1170
-        $earliest_ticket = $this->get_ticket_with_earliest_start_time();
1171
-        $latest_ticket = $this->get_ticket_with_latest_end_time();
1172
-        if (!$latest_ticket instanceof EE_Ticket && !$earliest_ticket instanceof EE_Ticket) {
1173
-            return false;
1174
-        }
1175
-        //check on sale for these two tickets.
1176
-        if ($latest_ticket->is_on_sale() || $earliest_ticket->is_on_sale()) {
1177
-            return true;
1178
-        }
1179
-        return false;
1180
-    }
1181
-
1182
-
1183
-    /**
1184
-     * Gets the URL for viewing this event on the front-end. Overrides parent
1185
-     * to check for an external URL first
1186
-     *
1187
-     * @return string
1188
-     * @throws EE_Error
1189
-     */
1190
-    public function get_permalink()
1191
-    {
1192
-        if ($this->external_url()) {
1193
-            return $this->external_url();
1194
-        }
1195
-        return parent::get_permalink();
1196
-    }
1197
-
1198
-
1199
-    /**
1200
-     * Gets the first term for 'espresso_event_categories' we can find
1201
-     *
1202
-     * @param array $query_params like EEM_Base::get_all
1203
-     * @return EE_Base_Class|EE_Term|null
1204
-     * @throws EE_Error
1205
-     */
1206
-    public function first_event_category($query_params = array())
1207
-    {
1208
-        $query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1209
-        $query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1210
-        return EEM_Term::instance()->get_one($query_params);
1211
-    }
1212
-
1213
-
1214
-    /**
1215
-     * Gets all terms for 'espresso_event_categories' we can find
1216
-     *
1217
-     * @param array $query_params
1218
-     * @return EE_Base_Class[]|EE_Term[]
1219
-     * @throws EE_Error
1220
-     */
1221
-    public function get_all_event_categories($query_params = array())
1222
-    {
1223
-        $query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1224
-        $query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1225
-        return EEM_Term::instance()->get_all($query_params);
1226
-    }
1227
-
1228
-
1229
-    /**
1230
-     * Adds a question group to this event
1231
-     *
1232
-     * @param EE_Question_Group|int $question_group_id_or_obj
1233
-     * @param bool                  $for_primary if true, the question group will be added for the primary
1234
-     *                                           registrant, if false will be added for others. default: false
1235
-     * @return EE_Base_Class|EE_Question_Group
1236
-     * @throws EE_Error
1237
-     */
1238
-    public function add_question_group($question_group_id_or_obj, $for_primary = false)
1239
-    {
1240
-        $extra = $for_primary
1241
-            ? array('EQG_primary' => 1)
1242
-            : array();
1243
-        return $this->_add_relation_to($question_group_id_or_obj, 'Question_Group', $extra);
1244
-    }
1245
-
1246
-
1247
-    /**
1248
-     * Removes a question group from the event
1249
-     *
1250
-     * @param EE_Question_Group|int $question_group_id_or_obj
1251
-     * @param bool                  $for_primary if true, the question group will be removed from the primary
1252
-     *                                           registrant, if false will be removed from others. default: false
1253
-     * @return EE_Base_Class|EE_Question_Group
1254
-     * @throws EE_Error
1255
-     */
1256
-    public function remove_question_group($question_group_id_or_obj, $for_primary = false)
1257
-    {
1258
-        $where = $for_primary
1259
-            ? array('EQG_primary' => 1)
1260
-            : array();
1261
-        return $this->_remove_relation_to($question_group_id_or_obj, 'Question_Group', $where);
1262
-    }
1263
-
1264
-
1265
-    /**
1266
-     * Gets all the question groups, ordering them by QSG_order ascending
1267
-     *
1268
-     * @param array $query_params @see EEM_Base::get_all
1269
-     * @return EE_Base_Class[]|EE_Question_Group[]
1270
-     * @throws EE_Error
1271
-     */
1272
-    public function question_groups($query_params = array())
1273
-    {
1274
-        $query_params = !empty($query_params) ? $query_params : array('order_by' => array('QSG_order' => 'ASC'));
1275
-        return $this->get_many_related('Question_Group', $query_params);
1276
-    }
1277
-
1278
-
1279
-    /**
1280
-     * Implementation for EEI_Has_Icon interface method.
1281
-     *
1282
-     * @see EEI_Visual_Representation for comments
1283
-     * @return string
1284
-     */
1285
-    public function get_icon()
1286
-    {
1287
-        return '<span class="dashicons dashicons-flag"></span>';
1288
-    }
1289
-
1290
-
1291
-    /**
1292
-     * Implementation for EEI_Admin_Links interface method.
1293
-     *
1294
-     * @see EEI_Admin_Links for comments
1295
-     * @return string
1296
-     * @throws EE_Error
1297
-     */
1298
-    public function get_admin_details_link()
1299
-    {
1300
-        return $this->get_admin_edit_link();
1301
-    }
1302
-
1303
-
1304
-    /**
1305
-     * Implementation for EEI_Admin_Links interface method.
1306
-     *
1307
-     * @see EEI_Admin_Links for comments
1308
-     * @return string
1309
-     * @throws EE_Error
1310
-     */
1311
-    public function get_admin_edit_link()
1312
-    {
1313
-        return EEH_URL::add_query_args_and_nonce(array(
1314
-            'page' => 'espresso_events',
1315
-            'action' => 'edit',
1316
-            'post' => $this->ID(),
1317
-        ),
1318
-            admin_url('admin.php')
1319
-        );
1320
-    }
1321
-
1322
-
1323
-    /**
1324
-     * Implementation for EEI_Admin_Links interface method.
1325
-     *
1326
-     * @see EEI_Admin_Links for comments
1327
-     * @return string
1328
-     */
1329
-    public function get_admin_settings_link()
1330
-    {
1331
-        return EEH_URL::add_query_args_and_nonce(array(
1332
-            'page' => 'espresso_events',
1333
-            'action' => 'default_event_settings',
1334
-        ),
1335
-            admin_url('admin.php')
1336
-        );
1337
-    }
1338
-
1339
-
1340
-    /**
1341
-     * Implementation for EEI_Admin_Links interface method.
1342
-     *
1343
-     * @see EEI_Admin_Links for comments
1344
-     * @return string
1345
-     */
1346
-    public function get_admin_overview_link()
1347
-    {
1348
-        return EEH_URL::add_query_args_and_nonce(array(
1349
-            'page' => 'espresso_events',
1350
-            'action' => 'default',
1351
-        ),
1352
-            admin_url('admin.php')
1353
-        );
1354
-    }
21
+	/**
22
+	 * cached value for the the logical active status for the event
23
+	 *
24
+	 * @see get_active_status()
25
+	 * @var string
26
+	 */
27
+	protected $_active_status = '';
28
+
29
+	/**
30
+	 * This is just used for caching the Primary Datetime for the Event on initial retrieval
31
+	 *
32
+	 * @var EE_Datetime
33
+	 */
34
+	protected $_Primary_Datetime;
35
+
36
+	/**
37
+	 * @var EventSpacesCalculator $available_spaces_calculator
38
+	 */
39
+	protected $available_spaces_calculator;
40
+
41
+
42
+	/**
43
+	 * @param array $props_n_values incoming values
44
+	 * @param string $timezone incoming timezone (if not set the timezone set for the website will be
45
+	 *                                        used.)
46
+	 * @param array $date_formats incoming date_formats in an array where the first value is the
47
+	 *                                        date_format and the second value is the time format
48
+	 * @return EE_Event
49
+	 * @throws EE_Error
50
+	 */
51
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
52
+	{
53
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
54
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
55
+	}
56
+
57
+
58
+	/**
59
+	 * @param array $props_n_values incoming values from the database
60
+	 * @param string $timezone incoming timezone as set by the model.  If not set the timezone for
61
+	 *                                the website will be used.
62
+	 * @return EE_Event
63
+	 * @throws EE_Error
64
+	 */
65
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
66
+	{
67
+		return new self($props_n_values, true, $timezone);
68
+	}
69
+
70
+
71
+
72
+	/**
73
+	 * @return EventSpacesCalculator
74
+	 * @throws \EE_Error
75
+	 */
76
+	public function getAvailableSpacesCalculator()
77
+	{
78
+		if(! $this->available_spaces_calculator instanceof EventSpacesCalculator){
79
+			$this->available_spaces_calculator = new EventSpacesCalculator($this);
80
+		}
81
+		return $this->available_spaces_calculator;
82
+	}
83
+
84
+
85
+
86
+	/**
87
+	 * Overrides parent set() method so that all calls to set( 'status', $status ) can be routed to internal methods
88
+	 *
89
+	 * @param string $field_name
90
+	 * @param mixed $field_value
91
+	 * @param bool $use_default
92
+	 * @throws EE_Error
93
+	 */
94
+	public function set($field_name, $field_value, $use_default = false)
95
+	{
96
+		switch ($field_name) {
97
+			case 'status' :
98
+				$this->set_status($field_value, $use_default);
99
+				break;
100
+			default :
101
+				parent::set($field_name, $field_value, $use_default);
102
+		}
103
+	}
104
+
105
+
106
+	/**
107
+	 *    set_status
108
+	 * Checks if event status is being changed to SOLD OUT
109
+	 * and updates event meta data with previous event status
110
+	 * so that we can revert things if/when the event is no longer sold out
111
+	 *
112
+	 * @access public
113
+	 * @param string $new_status
114
+	 * @param bool $use_default
115
+	 * @return void
116
+	 * @throws EE_Error
117
+	 */
118
+	public function set_status($new_status = null, $use_default = false)
119
+	{
120
+		// if nothing is set, and we aren't explicitly wanting to reset the status, then just leave
121
+		if (empty($new_status) && !$use_default) {
122
+			return;
123
+		}
124
+		// get current Event status
125
+		$old_status = $this->status();
126
+		// if status has changed
127
+		if ($old_status !== $new_status) {
128
+			// TO sold_out
129
+			if ($new_status === EEM_Event::sold_out) {
130
+				// save the previous event status so that we can revert if the event is no longer sold out
131
+				$this->add_post_meta('_previous_event_status', $old_status);
132
+				do_action('AHEE__EE_Event__set_status__to_sold_out', $this, $old_status, $new_status);
133
+				// OR FROM  sold_out
134
+			} else if ($old_status === EEM_Event::sold_out) {
135
+				$this->delete_post_meta('_previous_event_status');
136
+				do_action('AHEE__EE_Event__set_status__from_sold_out', $this, $old_status, $new_status);
137
+			}
138
+			//clear out the active status so that it gets reset the next time it is requested
139
+			$this->_active_status = null;
140
+			// update status
141
+			parent::set('status', $new_status, $use_default);
142
+			do_action('AHEE__EE_Event__set_status__after_update', $this);
143
+			return;
144
+		}
145
+		// even though the old value matches the new value, it's still good to
146
+		// allow the parent set method to have a say
147
+		parent::set('status', $new_status, $use_default);
148
+	}
149
+
150
+
151
+	/**
152
+	 * Gets all the datetimes for this event
153
+	 *
154
+	 * @param array $query_params like EEM_Base::get_all
155
+	 * @return EE_Base_Class[]|EE_Datetime[]
156
+	 * @throws EE_Error
157
+	 */
158
+	public function datetimes($query_params = array())
159
+	{
160
+		return $this->get_many_related('Datetime', $query_params);
161
+	}
162
+
163
+
164
+	/**
165
+	 * Gets all the datetimes for this event, ordered by DTT_EVT_start in ascending order
166
+	 *
167
+	 * @return EE_Base_Class[]|EE_Datetime[]
168
+	 * @throws EE_Error
169
+	 */
170
+	public function datetimes_in_chronological_order()
171
+	{
172
+		return $this->get_many_related('Datetime', array('order_by' => array('DTT_EVT_start' => 'ASC')));
173
+	}
174
+
175
+
176
+	/**
177
+	 * Gets all the datetimes for this event, ordered by the DTT_order on the datetime.
178
+	 * @darren, we should probably UNSET timezone on the EEM_Datetime model
179
+	 * after running our query, so that this timezone isn't set for EVERY query
180
+	 * on EEM_Datetime for the rest of the request, no?
181
+	 *
182
+	 * @param boolean $show_expired whether or not to include expired events
183
+	 * @param boolean $show_deleted whether or not to include deleted events
184
+	 * @param null $limit
185
+	 * @return EE_Datetime[]
186
+	 * @throws EE_Error
187
+	 */
188
+	public function datetimes_ordered($show_expired = true, $show_deleted = false, $limit = null)
189
+	{
190
+		return EEM_Datetime::instance($this->_timezone)->get_datetimes_for_event_ordered_by_DTT_order(
191
+			$this->ID(),
192
+			$show_expired,
193
+			$show_deleted,
194
+			$limit
195
+		);
196
+	}
197
+
198
+
199
+	/**
200
+	 * Returns one related datetime. Mostly only used by some legacy code.
201
+	 *
202
+	 * @return EE_Base_Class|EE_Datetime
203
+	 * @throws EE_Error
204
+	 */
205
+	public function first_datetime()
206
+	{
207
+		return $this->get_first_related('Datetime');
208
+	}
209
+
210
+
211
+	/**
212
+	 * Returns the 'primary' datetime for the event
213
+	 *
214
+	 * @param bool $try_to_exclude_expired
215
+	 * @param bool $try_to_exclude_deleted
216
+	 * @return EE_Datetime
217
+	 * @throws EE_Error
218
+	 */
219
+	public function primary_datetime($try_to_exclude_expired = true, $try_to_exclude_deleted = true)
220
+	{
221
+		if (!empty ($this->_Primary_Datetime)) {
222
+			return $this->_Primary_Datetime;
223
+		}
224
+		$this->_Primary_Datetime = EEM_Datetime::instance($this->_timezone)->get_primary_datetime_for_event(
225
+			$this->ID(),
226
+			$try_to_exclude_expired,
227
+			$try_to_exclude_deleted
228
+		);
229
+		return $this->_Primary_Datetime;
230
+	}
231
+
232
+
233
+	/**
234
+	 * Gets all the tickets available for purchase of this event
235
+	 *
236
+	 * @param array $query_params like EEM_Base::get_all
237
+	 * @return EE_Base_Class[]|EE_Ticket[]
238
+	 * @throws EE_Error
239
+	 */
240
+	public function tickets($query_params = array())
241
+	{
242
+		//first get all datetimes
243
+		$datetimes = $this->datetimes_ordered();
244
+		if (!$datetimes) {
245
+			return array();
246
+		}
247
+		$datetime_ids = array();
248
+		foreach ($datetimes as $datetime) {
249
+			$datetime_ids[] = $datetime->ID();
250
+		}
251
+		$where_params = array('Datetime.DTT_ID' => array('IN', $datetime_ids));
252
+		//if incoming $query_params has where conditions let's merge but not override existing.
253
+		if (is_array($query_params) && isset($query_params[0])) {
254
+			$where_params = array_merge($query_params[0], $where_params);
255
+			unset($query_params[0]);
256
+		}
257
+		//now add $where_params to $query_params
258
+		$query_params[0] = $where_params;
259
+		return EEM_Ticket::instance()->get_all($query_params);
260
+	}
261
+
262
+
263
+	/**
264
+	 * get all unexpired untrashed tickets
265
+	 *
266
+	 * @return EE_Ticket[]
267
+	 * @throws EE_Error
268
+	 */
269
+	public function active_tickets()
270
+	{
271
+		return $this->tickets(array(
272
+			array(
273
+				'TKT_end_date' => array('>=', EEM_Ticket::instance()->current_time_for_query('TKT_end_date')),
274
+				'TKT_deleted' => false,
275
+			),
276
+		));
277
+	}
278
+
279
+
280
+	/**
281
+	 * @return bool
282
+	 * @throws EE_Error
283
+	 */
284
+	public function additional_limit()
285
+	{
286
+		return $this->get('EVT_additional_limit');
287
+	}
288
+
289
+
290
+	/**
291
+	 * @return bool
292
+	 * @throws EE_Error
293
+	 */
294
+	public function allow_overflow()
295
+	{
296
+		return $this->get('EVT_allow_overflow');
297
+	}
298
+
299
+
300
+	/**
301
+	 * @return bool
302
+	 * @throws EE_Error
303
+	 */
304
+	public function created()
305
+	{
306
+		return $this->get('EVT_created');
307
+	}
308
+
309
+
310
+	/**
311
+	 * @return bool
312
+	 * @throws EE_Error
313
+	 */
314
+	public function description()
315
+	{
316
+		return $this->get('EVT_desc');
317
+	}
318
+
319
+
320
+	/**
321
+	 * Runs do_shortcode and wpautop on the description
322
+	 *
323
+	 * @return string of html
324
+	 * @throws EE_Error
325
+	 */
326
+	public function description_filtered()
327
+	{
328
+		return $this->get_pretty('EVT_desc');
329
+	}
330
+
331
+
332
+	/**
333
+	 * @return bool
334
+	 * @throws EE_Error
335
+	 */
336
+	public function display_description()
337
+	{
338
+		return $this->get('EVT_display_desc');
339
+	}
340
+
341
+
342
+	/**
343
+	 * @return bool
344
+	 * @throws EE_Error
345
+	 */
346
+	public function display_ticket_selector()
347
+	{
348
+		return (bool)$this->get('EVT_display_ticket_selector');
349
+	}
350
+
351
+
352
+	/**
353
+	 * @return bool
354
+	 * @throws EE_Error
355
+	 */
356
+	public function external_url()
357
+	{
358
+		return $this->get('EVT_external_URL');
359
+	}
360
+
361
+
362
+	/**
363
+	 * @return bool
364
+	 * @throws EE_Error
365
+	 */
366
+	public function member_only()
367
+	{
368
+		return $this->get('EVT_member_only');
369
+	}
370
+
371
+
372
+	/**
373
+	 * @return bool
374
+	 * @throws EE_Error
375
+	 */
376
+	public function phone()
377
+	{
378
+		return $this->get('EVT_phone');
379
+	}
380
+
381
+
382
+	/**
383
+	 * @return bool
384
+	 * @throws EE_Error
385
+	 */
386
+	public function modified()
387
+	{
388
+		return $this->get('EVT_modified');
389
+	}
390
+
391
+
392
+	/**
393
+	 * @return bool
394
+	 * @throws EE_Error
395
+	 */
396
+	public function name()
397
+	{
398
+		return $this->get('EVT_name');
399
+	}
400
+
401
+
402
+	/**
403
+	 * @return bool
404
+	 * @throws EE_Error
405
+	 */
406
+	public function order()
407
+	{
408
+		return $this->get('EVT_order');
409
+	}
410
+
411
+
412
+	/**
413
+	 * @return bool|string
414
+	 * @throws EE_Error
415
+	 */
416
+	public function default_registration_status()
417
+	{
418
+		$event_default_registration_status = $this->get('EVT_default_registration_status');
419
+		return !empty($event_default_registration_status)
420
+			? $event_default_registration_status
421
+			: EE_Registry::instance()->CFG->registration->default_STS_ID;
422
+	}
423
+
424
+
425
+	/**
426
+	 * @param int $num_words
427
+	 * @param null $more
428
+	 * @param bool $not_full_desc
429
+	 * @return bool|string
430
+	 * @throws EE_Error
431
+	 */
432
+	public function short_description($num_words = 55, $more = null, $not_full_desc = false)
433
+	{
434
+		$short_desc = $this->get('EVT_short_desc');
435
+		if (!empty($short_desc) || $not_full_desc) {
436
+			return $short_desc;
437
+		}
438
+		$full_desc = $this->get('EVT_desc');
439
+		return wp_trim_words($full_desc, $num_words, $more);
440
+	}
441
+
442
+
443
+	/**
444
+	 * @return bool
445
+	 * @throws EE_Error
446
+	 */
447
+	public function slug()
448
+	{
449
+		return $this->get('EVT_slug');
450
+	}
451
+
452
+
453
+	/**
454
+	 * @return bool
455
+	 * @throws EE_Error
456
+	 */
457
+	public function timezone_string()
458
+	{
459
+		return $this->get('EVT_timezone_string');
460
+	}
461
+
462
+
463
+	/**
464
+	 * @return bool
465
+	 * @throws EE_Error
466
+	 */
467
+	public function visible_on()
468
+	{
469
+		return $this->get('EVT_visible_on');
470
+	}
471
+
472
+
473
+	/**
474
+	 * @return int
475
+	 * @throws EE_Error
476
+	 */
477
+	public function wp_user()
478
+	{
479
+		return $this->get('EVT_wp_user');
480
+	}
481
+
482
+
483
+	/**
484
+	 * @return bool
485
+	 * @throws EE_Error
486
+	 */
487
+	public function donations()
488
+	{
489
+		return $this->get('EVT_donations');
490
+	}
491
+
492
+
493
+	/**
494
+	 * @param $limit
495
+	 * @throws EE_Error
496
+	 */
497
+	public function set_additional_limit($limit)
498
+	{
499
+		$this->set('EVT_additional_limit', $limit);
500
+	}
501
+
502
+
503
+	/**
504
+	 * @param $created
505
+	 * @throws EE_Error
506
+	 */
507
+	public function set_created($created)
508
+	{
509
+		$this->set('EVT_created', $created);
510
+	}
511
+
512
+
513
+	/**
514
+	 * @param $desc
515
+	 * @throws EE_Error
516
+	 */
517
+	public function set_description($desc)
518
+	{
519
+		$this->set('EVT_desc', $desc);
520
+	}
521
+
522
+
523
+	/**
524
+	 * @param $display_desc
525
+	 * @throws EE_Error
526
+	 */
527
+	public function set_display_description($display_desc)
528
+	{
529
+		$this->set('EVT_display_desc', $display_desc);
530
+	}
531
+
532
+
533
+	/**
534
+	 * @param $display_ticket_selector
535
+	 * @throws EE_Error
536
+	 */
537
+	public function set_display_ticket_selector($display_ticket_selector)
538
+	{
539
+		$this->set('EVT_display_ticket_selector', $display_ticket_selector);
540
+	}
541
+
542
+
543
+	/**
544
+	 * @param $external_url
545
+	 * @throws EE_Error
546
+	 */
547
+	public function set_external_url($external_url)
548
+	{
549
+		$this->set('EVT_external_URL', $external_url);
550
+	}
551
+
552
+
553
+	/**
554
+	 * @param $member_only
555
+	 * @throws EE_Error
556
+	 */
557
+	public function set_member_only($member_only)
558
+	{
559
+		$this->set('EVT_member_only', $member_only);
560
+	}
561
+
562
+
563
+	/**
564
+	 * @param $event_phone
565
+	 * @throws EE_Error
566
+	 */
567
+	public function set_event_phone($event_phone)
568
+	{
569
+		$this->set('EVT_phone', $event_phone);
570
+	}
571
+
572
+
573
+	/**
574
+	 * @param $modified
575
+	 * @throws EE_Error
576
+	 */
577
+	public function set_modified($modified)
578
+	{
579
+		$this->set('EVT_modified', $modified);
580
+	}
581
+
582
+
583
+	/**
584
+	 * @param $name
585
+	 * @throws EE_Error
586
+	 */
587
+	public function set_name($name)
588
+	{
589
+		$this->set('EVT_name', $name);
590
+	}
591
+
592
+
593
+	/**
594
+	 * @param $order
595
+	 * @throws EE_Error
596
+	 */
597
+	public function set_order($order)
598
+	{
599
+		$this->set('EVT_order', $order);
600
+	}
601
+
602
+
603
+	/**
604
+	 * @param $short_desc
605
+	 * @throws EE_Error
606
+	 */
607
+	public function set_short_description($short_desc)
608
+	{
609
+		$this->set('EVT_short_desc', $short_desc);
610
+	}
611
+
612
+
613
+	/**
614
+	 * @param $slug
615
+	 * @throws EE_Error
616
+	 */
617
+	public function set_slug($slug)
618
+	{
619
+		$this->set('EVT_slug', $slug);
620
+	}
621
+
622
+
623
+	/**
624
+	 * @param $timezone_string
625
+	 * @throws EE_Error
626
+	 */
627
+	public function set_timezone_string($timezone_string)
628
+	{
629
+		$this->set('EVT_timezone_string', $timezone_string);
630
+	}
631
+
632
+
633
+	/**
634
+	 * @param $visible_on
635
+	 * @throws EE_Error
636
+	 */
637
+	public function set_visible_on($visible_on)
638
+	{
639
+		$this->set('EVT_visible_on', $visible_on);
640
+	}
641
+
642
+
643
+	/**
644
+	 * @param $wp_user
645
+	 * @throws EE_Error
646
+	 */
647
+	public function set_wp_user($wp_user)
648
+	{
649
+		$this->set('EVT_wp_user', $wp_user);
650
+	}
651
+
652
+
653
+	/**
654
+	 * @param $default_registration_status
655
+	 * @throws EE_Error
656
+	 */
657
+	public function set_default_registration_status($default_registration_status)
658
+	{
659
+		$this->set('EVT_default_registration_status', $default_registration_status);
660
+	}
661
+
662
+
663
+	/**
664
+	 * @param $donations
665
+	 * @throws EE_Error
666
+	 */
667
+	public function set_donations($donations)
668
+	{
669
+		$this->set('EVT_donations', $donations);
670
+	}
671
+
672
+
673
+	/**
674
+	 * Adds a venue to this event
675
+	 *
676
+	 * @param EE_Venue /int $venue_id_or_obj
677
+	 * @return EE_Base_Class|EE_Venue
678
+	 * @throws EE_Error
679
+	 */
680
+	public function add_venue($venue_id_or_obj)
681
+	{
682
+		return $this->_add_relation_to($venue_id_or_obj, 'Venue');
683
+	}
684
+
685
+
686
+	/**
687
+	 * Removes a venue from the event
688
+	 *
689
+	 * @param EE_Venue /int $venue_id_or_obj
690
+	 * @return EE_Base_Class|EE_Venue
691
+	 * @throws EE_Error
692
+	 */
693
+	public function remove_venue($venue_id_or_obj)
694
+	{
695
+		return $this->_remove_relation_to($venue_id_or_obj, 'Venue');
696
+	}
697
+
698
+
699
+	/**
700
+	 * Gets all the venues related ot the event. May provide additional $query_params if desired
701
+	 *
702
+	 * @param array $query_params like EEM_Base::get_all's $query_params
703
+	 * @return EE_Base_Class[]|EE_Venue[]
704
+	 * @throws EE_Error
705
+	 */
706
+	public function venues($query_params = array())
707
+	{
708
+		return $this->get_many_related('Venue', $query_params);
709
+	}
710
+
711
+
712
+	/**
713
+	 * check if event id is present and if event is published
714
+	 *
715
+	 * @access public
716
+	 * @return boolean true yes, false no
717
+	 * @throws EE_Error
718
+	 */
719
+	private function _has_ID_and_is_published()
720
+	{
721
+		// first check if event id is present and not NULL,
722
+		// then check if this event is published (or any of the equivalent "published" statuses)
723
+		return
724
+			$this->ID() && $this->ID() !== null
725
+			&& (
726
+				$this->status() === 'publish'
727
+				|| $this->status() === EEM_Event::sold_out
728
+				|| $this->status() === EEM_Event::postponed
729
+				|| $this->status() === EEM_Event::cancelled
730
+			);
731
+	}
732
+
733
+
734
+	/**
735
+	 * This simply compares the internal dates with NOW and determines if the event is upcoming or not.
736
+	 *
737
+	 * @access public
738
+	 * @return boolean true yes, false no
739
+	 * @throws EE_Error
740
+	 */
741
+	public function is_upcoming()
742
+	{
743
+		// check if event id is present and if this event is published
744
+		if ($this->is_inactive()) {
745
+			return false;
746
+		}
747
+		// set initial value
748
+		$upcoming = false;
749
+		//next let's get all datetimes and loop through them
750
+		$datetimes = $this->datetimes_in_chronological_order();
751
+		foreach ($datetimes as $datetime) {
752
+			if ($datetime instanceof EE_Datetime) {
753
+				//if this dtt is expired then we continue cause one of the other datetimes might be upcoming.
754
+				if ($datetime->is_expired()) {
755
+					continue;
756
+				}
757
+				//if this dtt is active then we return false.
758
+				if ($datetime->is_active()) {
759
+					return false;
760
+				}
761
+				//otherwise let's check upcoming status
762
+				$upcoming = $datetime->is_upcoming();
763
+			}
764
+		}
765
+		return $upcoming;
766
+	}
767
+
768
+
769
+	/**
770
+	 * @return bool
771
+	 * @throws EE_Error
772
+	 */
773
+	public function is_active()
774
+	{
775
+		// check if event id is present and if this event is published
776
+		if ($this->is_inactive()) {
777
+			return false;
778
+		}
779
+		// set initial value
780
+		$active = false;
781
+		//next let's get all datetimes and loop through them
782
+		$datetimes = $this->datetimes_in_chronological_order();
783
+		foreach ($datetimes as $datetime) {
784
+			if ($datetime instanceof EE_Datetime) {
785
+				//if this dtt is expired then we continue cause one of the other datetimes might be active.
786
+				if ($datetime->is_expired()) {
787
+					continue;
788
+				}
789
+				//if this dtt is upcoming then we return false.
790
+				if ($datetime->is_upcoming()) {
791
+					return false;
792
+				}
793
+				//otherwise let's check active status
794
+				$active = $datetime->is_active();
795
+			}
796
+		}
797
+		return $active;
798
+	}
799
+
800
+
801
+	/**
802
+	 * @return bool
803
+	 * @throws EE_Error
804
+	 */
805
+	public function is_expired()
806
+	{
807
+		// check if event id is present and if this event is published
808
+		if ($this->is_inactive()) {
809
+			return false;
810
+		}
811
+		// set initial value
812
+		$expired = false;
813
+		//first let's get all datetimes and loop through them
814
+		$datetimes = $this->datetimes_in_chronological_order();
815
+		foreach ($datetimes as $datetime) {
816
+			if ($datetime instanceof EE_Datetime) {
817
+				//if this dtt is upcoming or active then we return false.
818
+				if ($datetime->is_upcoming() || $datetime->is_active()) {
819
+					return false;
820
+				}
821
+				//otherwise let's check active status
822
+				$expired = $datetime->is_expired();
823
+			}
824
+		}
825
+		return $expired;
826
+	}
827
+
828
+
829
+	/**
830
+	 * @return bool
831
+	 * @throws EE_Error
832
+	 */
833
+	public function is_inactive()
834
+	{
835
+		// check if event id is present and if this event is published
836
+		if ($this->_has_ID_and_is_published()) {
837
+			return false;
838
+		}
839
+		return true;
840
+	}
841
+
842
+
843
+	/**
844
+	 * calculate spaces remaining based on "saleable" tickets
845
+	 *
846
+	 * @param array $tickets
847
+	 * @param bool $filtered
848
+	 * @return int|float
849
+	 * @throws EE_Error
850
+	 * @throws DomainException
851
+	 * @throws UnexpectedEntityException
852
+	 */
853
+	public function spaces_remaining($tickets = array(), $filtered = true)
854
+	{
855
+		$this->getAvailableSpacesCalculator()->setActiveTickets($tickets);
856
+		$spaces_remaining = $this->getAvailableSpacesCalculator()->spacesRemaining();
857
+		return $filtered
858
+			? apply_filters(
859
+				'FHEE_EE_Event__spaces_remaining',
860
+				$spaces_remaining,
861
+				$this,
862
+				$tickets
863
+			)
864
+			: $spaces_remaining;
865
+	}
866
+
867
+
868
+	/**
869
+	 *    perform_sold_out_status_check
870
+	 *    checks all of this events's datetime  reg_limit - sold values to determine if ANY datetimes have spaces available...
871
+	 *    if NOT, then the event status will get toggled to 'sold_out'
872
+	 *
873
+	 * @return bool    return the ACTUAL sold out state.
874
+	 * @throws EE_Error
875
+	 * @throws DomainException
876
+	 * @throws UnexpectedEntityException
877
+	 */
878
+	public function perform_sold_out_status_check()
879
+	{
880
+		// get all unexpired untrashed tickets
881
+		$tickets = $this->tickets(
882
+			array(
883
+				array('TKT_deleted' => false),
884
+				'order_by' => array('TKT_qty' => 'ASC'),
885
+			)
886
+		);
887
+		$all_expired = true;
888
+		foreach ($tickets as $ticket) {
889
+			if(!$ticket->is_expired()){
890
+				$all_expired = false;
891
+				break;
892
+			}
893
+		}
894
+		// if all the tickets are just expired, then don't update the event status to sold out
895
+		if ($all_expired) {
896
+			return true;
897
+		}
898
+		$spaces_remaining = $this->spaces_remaining($tickets);
899
+		if ($spaces_remaining < 1) {
900
+			$this->set_status(EEM_Event::sold_out);
901
+			$this->save();
902
+			$sold_out = true;
903
+		} else {
904
+			$sold_out = false;
905
+			// was event previously marked as sold out ?
906
+			if ($this->status() === EEM_Event::sold_out) {
907
+				// revert status to previous value, if it was set
908
+				$previous_event_status = $this->get_post_meta('_previous_event_status', true);
909
+				if ($previous_event_status) {
910
+					$this->set_status($previous_event_status);
911
+					$this->save();
912
+				}
913
+			}
914
+		}
915
+		do_action('AHEE__EE_Event__perform_sold_out_status_check__end', $this, $sold_out, $spaces_remaining, $tickets);
916
+		return $sold_out;
917
+	}
918
+
919
+
920
+
921
+	/**
922
+	 * This returns the total remaining spaces for sale on this event.
923
+	 *
924
+	 * @uses EE_Event::total_available_spaces()
925
+	 * @return float|int
926
+	 * @throws EE_Error
927
+	 * @throws DomainException
928
+	 * @throws UnexpectedEntityException
929
+	 */
930
+	public function spaces_remaining_for_sale()
931
+	{
932
+		return $this->total_available_spaces(true);
933
+	}
934
+
935
+
936
+
937
+	/**
938
+	 * This returns the total spaces available for an event
939
+	 * while considering all the qtys on the tickets and the reg limits
940
+	 * on the datetimes attached to this event.
941
+	 *
942
+	 * @param   bool $consider_sold Whether to consider any tickets that have already sold in our calculation.
943
+	 *                              If this is false, then we return the most tickets that could ever be sold
944
+	 *                              for this event with the datetime and tickets setup on the event under optimal
945
+	 *                              selling conditions.  Otherwise we return a live calculation of spaces available
946
+	 *                              based on tickets sold.  Depending on setup and stage of sales, this
947
+	 *                              may appear to equal remaining tickets.  However, the more tickets are
948
+	 *                              sold out, the more accurate the "live" total is.
949
+	 * @return float|int
950
+	 * @throws EE_Error
951
+	 * @throws DomainException
952
+	 * @throws UnexpectedEntityException
953
+	 */
954
+	public function total_available_spaces($consider_sold = false)
955
+	{
956
+		$spaces_available = $consider_sold
957
+			? $this->getAvailableSpacesCalculator()->spacesRemaining()
958
+			: $this->getAvailableSpacesCalculator()->totalSpacesAvailable();
959
+		return apply_filters(
960
+			'FHEE_EE_Event__total_available_spaces__spaces_available',
961
+			$spaces_available,
962
+			$this,
963
+			$this->getAvailableSpacesCalculator()->getDatetimes(),
964
+			$this->getAvailableSpacesCalculator()->getActiveTickets()
965
+		);
966
+	}
967
+
968
+
969
+	/**
970
+	 * Checks if the event is set to sold out
971
+	 *
972
+	 * @param  bool $actual whether or not to perform calculations to not only figure the
973
+	 *                      actual status but also to flip the status if necessary to sold
974
+	 *                      out If false, we just check the existing status of the event
975
+	 * @return boolean
976
+	 * @throws EE_Error
977
+	 */
978
+	public function is_sold_out($actual = false)
979
+	{
980
+		if (!$actual) {
981
+			return $this->status() === EEM_Event::sold_out;
982
+		}
983
+		return $this->perform_sold_out_status_check();
984
+	}
985
+
986
+
987
+	/**
988
+	 * Checks if the event is marked as postponed
989
+	 *
990
+	 * @return boolean
991
+	 */
992
+	public function is_postponed()
993
+	{
994
+		return $this->status() === EEM_Event::postponed;
995
+	}
996
+
997
+
998
+	/**
999
+	 * Checks if the event is marked as cancelled
1000
+	 *
1001
+	 * @return boolean
1002
+	 */
1003
+	public function is_cancelled()
1004
+	{
1005
+		return $this->status() === EEM_Event::cancelled;
1006
+	}
1007
+
1008
+
1009
+	/**
1010
+	 * Get the logical active status in a hierarchical order for all the datetimes.  Note
1011
+	 * Basically, we order the datetimes by EVT_start_date.  Then first test on whether the event is published.  If its
1012
+	 * NOT published then we test for whether its expired or not.  IF it IS published then we test first on whether an
1013
+	 * event has any active dates.  If no active dates then we check for any upcoming dates.  If no upcoming dates then
1014
+	 * the event is considered expired.
1015
+	 * NOTE: this method does NOT calculate whether the datetimes are sold out when event is published.  Sold Out is a status
1016
+	 * set on the EVENT when it is not published and thus is done
1017
+	 *
1018
+	 * @param bool $reset
1019
+	 * @return bool | string - based on EE_Datetime active constants or FALSE if error.
1020
+	 * @throws EE_Error
1021
+	 */
1022
+	public function get_active_status($reset = false)
1023
+	{
1024
+		// if the active status has already been set, then just use that value (unless we are resetting it)
1025
+		if (!empty($this->_active_status) && !$reset) {
1026
+			return $this->_active_status;
1027
+		}
1028
+		//first check if event id is present on this object
1029
+		if (!$this->ID()) {
1030
+			return false;
1031
+		}
1032
+		$where_params_for_event = array(array('EVT_ID' => $this->ID()));
1033
+		//if event is published:
1034
+		if ($this->status() === 'publish') {
1035
+			//active?
1036
+			if (EEM_Datetime::instance()->get_datetime_count_for_status(EE_Datetime::active, $where_params_for_event) > 0) {
1037
+				$this->_active_status = EE_Datetime::active;
1038
+			} else {
1039
+				//upcoming?
1040
+				if (EEM_Datetime::instance()->get_datetime_count_for_status(EE_Datetime::upcoming, $where_params_for_event) > 0) {
1041
+					$this->_active_status = EE_Datetime::upcoming;
1042
+				} else {
1043
+					//expired?
1044
+					if (
1045
+						EEM_Datetime::instance()->get_datetime_count_for_status(EE_Datetime::expired, $where_params_for_event) > 0
1046
+					) {
1047
+						$this->_active_status = EE_Datetime::expired;
1048
+					} else {
1049
+						//it would be odd if things make it this far because it basically means there are no datetime's
1050
+						//attached to the event.  So in this case it will just be considered inactive.
1051
+						$this->_active_status = EE_Datetime::inactive;
1052
+					}
1053
+				}
1054
+			}
1055
+		} else {
1056
+			//the event is not published, so let's just set it's active status according to its' post status
1057
+			switch ($this->status()) {
1058
+				case EEM_Event::sold_out :
1059
+					$this->_active_status = EE_Datetime::sold_out;
1060
+					break;
1061
+				case EEM_Event::cancelled :
1062
+					$this->_active_status = EE_Datetime::cancelled;
1063
+					break;
1064
+				case EEM_Event::postponed :
1065
+					$this->_active_status = EE_Datetime::postponed;
1066
+					break;
1067
+				default :
1068
+					$this->_active_status = EE_Datetime::inactive;
1069
+			}
1070
+		}
1071
+		return $this->_active_status;
1072
+	}
1073
+
1074
+
1075
+	/**
1076
+	 *    pretty_active_status
1077
+	 *
1078
+	 * @access public
1079
+	 * @param boolean $echo whether to return (FALSE), or echo out the result (TRUE)
1080
+	 * @return mixed void|string
1081
+	 * @throws EE_Error
1082
+	 */
1083
+	public function pretty_active_status($echo = true)
1084
+	{
1085
+		$active_status = $this->get_active_status();
1086
+		$status = '<span class="ee-status event-active-status-'
1087
+			. $active_status
1088
+			. '">'
1089
+			. EEH_Template::pretty_status($active_status, false, 'sentence')
1090
+			. '</span>';
1091
+		if ($echo) {
1092
+			echo $status;
1093
+			return '';
1094
+		}
1095
+		return $status;
1096
+	}
1097
+
1098
+
1099
+	/**
1100
+	 * @return bool|int
1101
+	 * @throws EE_Error
1102
+	 */
1103
+	public function get_number_of_tickets_sold()
1104
+	{
1105
+		$tkt_sold = 0;
1106
+		if (!$this->ID()) {
1107
+			return 0;
1108
+		}
1109
+		$datetimes = $this->datetimes();
1110
+		foreach ($datetimes as $datetime) {
1111
+			if ($datetime instanceof EE_Datetime) {
1112
+				$tkt_sold += $datetime->sold();
1113
+			}
1114
+		}
1115
+		return $tkt_sold;
1116
+	}
1117
+
1118
+
1119
+	/**
1120
+	 * This just returns a count of all the registrations for this event
1121
+	 *
1122
+	 * @access  public
1123
+	 * @return int
1124
+	 * @throws EE_Error
1125
+	 */
1126
+	public function get_count_of_all_registrations()
1127
+	{
1128
+		return EEM_Event::instance()->count_related($this, 'Registration');
1129
+	}
1130
+
1131
+
1132
+	/**
1133
+	 * This returns the ticket with the earliest start time that is
1134
+	 * available for this event (across all datetimes attached to the event)
1135
+	 *
1136
+	 * @return EE_Base_Class|EE_Ticket|null
1137
+	 * @throws EE_Error
1138
+	 */
1139
+	public function get_ticket_with_earliest_start_time()
1140
+	{
1141
+		$where['Datetime.EVT_ID'] = $this->ID();
1142
+		$query_params = array($where, 'order_by' => array('TKT_start_date' => 'ASC'));
1143
+		return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1144
+	}
1145
+
1146
+
1147
+	/**
1148
+	 * This returns the ticket with the latest end time that is available
1149
+	 * for this event (across all datetimes attached to the event)
1150
+	 *
1151
+	 * @return EE_Base_Class|EE_Ticket|null
1152
+	 * @throws EE_Error
1153
+	 */
1154
+	public function get_ticket_with_latest_end_time()
1155
+	{
1156
+		$where['Datetime.EVT_ID'] = $this->ID();
1157
+		$query_params = array($where, 'order_by' => array('TKT_end_date' => 'DESC'));
1158
+		return EE_Registry::instance()->load_model('Ticket')->get_one($query_params);
1159
+	}
1160
+
1161
+
1162
+	/**
1163
+	 * This returns whether there are any tickets on sale for this event.
1164
+	 *
1165
+	 * @return bool true = YES tickets on sale.
1166
+	 * @throws EE_Error
1167
+	 */
1168
+	public function tickets_on_sale()
1169
+	{
1170
+		$earliest_ticket = $this->get_ticket_with_earliest_start_time();
1171
+		$latest_ticket = $this->get_ticket_with_latest_end_time();
1172
+		if (!$latest_ticket instanceof EE_Ticket && !$earliest_ticket instanceof EE_Ticket) {
1173
+			return false;
1174
+		}
1175
+		//check on sale for these two tickets.
1176
+		if ($latest_ticket->is_on_sale() || $earliest_ticket->is_on_sale()) {
1177
+			return true;
1178
+		}
1179
+		return false;
1180
+	}
1181
+
1182
+
1183
+	/**
1184
+	 * Gets the URL for viewing this event on the front-end. Overrides parent
1185
+	 * to check for an external URL first
1186
+	 *
1187
+	 * @return string
1188
+	 * @throws EE_Error
1189
+	 */
1190
+	public function get_permalink()
1191
+	{
1192
+		if ($this->external_url()) {
1193
+			return $this->external_url();
1194
+		}
1195
+		return parent::get_permalink();
1196
+	}
1197
+
1198
+
1199
+	/**
1200
+	 * Gets the first term for 'espresso_event_categories' we can find
1201
+	 *
1202
+	 * @param array $query_params like EEM_Base::get_all
1203
+	 * @return EE_Base_Class|EE_Term|null
1204
+	 * @throws EE_Error
1205
+	 */
1206
+	public function first_event_category($query_params = array())
1207
+	{
1208
+		$query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1209
+		$query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1210
+		return EEM_Term::instance()->get_one($query_params);
1211
+	}
1212
+
1213
+
1214
+	/**
1215
+	 * Gets all terms for 'espresso_event_categories' we can find
1216
+	 *
1217
+	 * @param array $query_params
1218
+	 * @return EE_Base_Class[]|EE_Term[]
1219
+	 * @throws EE_Error
1220
+	 */
1221
+	public function get_all_event_categories($query_params = array())
1222
+	{
1223
+		$query_params[0]['Term_Taxonomy.taxonomy'] = 'espresso_event_categories';
1224
+		$query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $this->ID();
1225
+		return EEM_Term::instance()->get_all($query_params);
1226
+	}
1227
+
1228
+
1229
+	/**
1230
+	 * Adds a question group to this event
1231
+	 *
1232
+	 * @param EE_Question_Group|int $question_group_id_or_obj
1233
+	 * @param bool                  $for_primary if true, the question group will be added for the primary
1234
+	 *                                           registrant, if false will be added for others. default: false
1235
+	 * @return EE_Base_Class|EE_Question_Group
1236
+	 * @throws EE_Error
1237
+	 */
1238
+	public function add_question_group($question_group_id_or_obj, $for_primary = false)
1239
+	{
1240
+		$extra = $for_primary
1241
+			? array('EQG_primary' => 1)
1242
+			: array();
1243
+		return $this->_add_relation_to($question_group_id_or_obj, 'Question_Group', $extra);
1244
+	}
1245
+
1246
+
1247
+	/**
1248
+	 * Removes a question group from the event
1249
+	 *
1250
+	 * @param EE_Question_Group|int $question_group_id_or_obj
1251
+	 * @param bool                  $for_primary if true, the question group will be removed from the primary
1252
+	 *                                           registrant, if false will be removed from others. default: false
1253
+	 * @return EE_Base_Class|EE_Question_Group
1254
+	 * @throws EE_Error
1255
+	 */
1256
+	public function remove_question_group($question_group_id_or_obj, $for_primary = false)
1257
+	{
1258
+		$where = $for_primary
1259
+			? array('EQG_primary' => 1)
1260
+			: array();
1261
+		return $this->_remove_relation_to($question_group_id_or_obj, 'Question_Group', $where);
1262
+	}
1263
+
1264
+
1265
+	/**
1266
+	 * Gets all the question groups, ordering them by QSG_order ascending
1267
+	 *
1268
+	 * @param array $query_params @see EEM_Base::get_all
1269
+	 * @return EE_Base_Class[]|EE_Question_Group[]
1270
+	 * @throws EE_Error
1271
+	 */
1272
+	public function question_groups($query_params = array())
1273
+	{
1274
+		$query_params = !empty($query_params) ? $query_params : array('order_by' => array('QSG_order' => 'ASC'));
1275
+		return $this->get_many_related('Question_Group', $query_params);
1276
+	}
1277
+
1278
+
1279
+	/**
1280
+	 * Implementation for EEI_Has_Icon interface method.
1281
+	 *
1282
+	 * @see EEI_Visual_Representation for comments
1283
+	 * @return string
1284
+	 */
1285
+	public function get_icon()
1286
+	{
1287
+		return '<span class="dashicons dashicons-flag"></span>';
1288
+	}
1289
+
1290
+
1291
+	/**
1292
+	 * Implementation for EEI_Admin_Links interface method.
1293
+	 *
1294
+	 * @see EEI_Admin_Links for comments
1295
+	 * @return string
1296
+	 * @throws EE_Error
1297
+	 */
1298
+	public function get_admin_details_link()
1299
+	{
1300
+		return $this->get_admin_edit_link();
1301
+	}
1302
+
1303
+
1304
+	/**
1305
+	 * Implementation for EEI_Admin_Links interface method.
1306
+	 *
1307
+	 * @see EEI_Admin_Links for comments
1308
+	 * @return string
1309
+	 * @throws EE_Error
1310
+	 */
1311
+	public function get_admin_edit_link()
1312
+	{
1313
+		return EEH_URL::add_query_args_and_nonce(array(
1314
+			'page' => 'espresso_events',
1315
+			'action' => 'edit',
1316
+			'post' => $this->ID(),
1317
+		),
1318
+			admin_url('admin.php')
1319
+		);
1320
+	}
1321
+
1322
+
1323
+	/**
1324
+	 * Implementation for EEI_Admin_Links interface method.
1325
+	 *
1326
+	 * @see EEI_Admin_Links for comments
1327
+	 * @return string
1328
+	 */
1329
+	public function get_admin_settings_link()
1330
+	{
1331
+		return EEH_URL::add_query_args_and_nonce(array(
1332
+			'page' => 'espresso_events',
1333
+			'action' => 'default_event_settings',
1334
+		),
1335
+			admin_url('admin.php')
1336
+		);
1337
+	}
1338
+
1339
+
1340
+	/**
1341
+	 * Implementation for EEI_Admin_Links interface method.
1342
+	 *
1343
+	 * @see EEI_Admin_Links for comments
1344
+	 * @return string
1345
+	 */
1346
+	public function get_admin_overview_link()
1347
+	{
1348
+		return EEH_URL::add_query_args_and_nonce(array(
1349
+			'page' => 'espresso_events',
1350
+			'action' => 'default',
1351
+		),
1352
+			admin_url('admin.php')
1353
+		);
1354
+	}
1355 1355
 
1356 1356
 }
Please login to merge, or discard this patch.