Completed
Branch FET-10766-extract-activation-d... (2c1e01)
by
unknown
84:57 queued 73:57
created
core/services/loaders/LoaderDecoratorInterface.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -9,20 +9,20 @@
 block discarded – undo
9 9
 interface LoaderDecoratorInterface
10 10
 {
11 11
 
12
-    /**
13
-     * @param string $fqcn
14
-     * @param array  $arguments
15
-     * @param bool $shared
16
-     * @return mixed
17
-     */
18
-    public function load($fqcn, $arguments = array(), $shared = true);
12
+	/**
13
+	 * @param string $fqcn
14
+	 * @param array  $arguments
15
+	 * @param bool $shared
16
+	 * @return mixed
17
+	 */
18
+	public function load($fqcn, $arguments = array(), $shared = true);
19 19
 
20 20
 
21 21
 
22
-    /**
23
-     * calls reset() on loader if method exists
24
-     */
25
-    public function reset();
22
+	/**
23
+	 * calls reset() on loader if method exists
24
+	 */
25
+	public function reset();
26 26
 
27 27
 }
28 28
 // End of file LoaderInterface.php
Please login to merge, or discard this patch.
core/services/loaders/CoreLoader.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
      */
40 40
     public function __construct($generator)
41 41
     {
42
-        if(!($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
42
+        if ( ! ($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
43 43
             throw new InvalidArgumentException(
44 44
                 esc_html__(
45 45
                     'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.',
@@ -61,7 +61,7 @@  discard block
 block discarded – undo
61 61
      */
62 62
     public function load($fqcn, $arguments = array(), $shared = true)
63 63
     {
64
-        if($this->generator instanceof EE_Registry) {
64
+        if ($this->generator instanceof EE_Registry) {
65 65
             return $this->generator->create($fqcn, $arguments, $shared);
66 66
         }
67 67
         $shared = $shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW;
Please login to merge, or discard this patch.
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -25,63 +25,63 @@
 block discarded – undo
25 25
 class CoreLoader implements LoaderDecoratorInterface
26 26
 {
27 27
 
28
-    /**
29
-     * @var EE_Registry|CoffeeShop $generator
30
-     */
31
-    private $generator;
32
-
33
-
34
-
35
-    /**
36
-     * CoreLoader constructor.
37
-     *
38
-     * @param EE_Registry|CoffeeShop $generator
39
-     * @throws InvalidArgumentException
40
-     */
41
-    public function __construct($generator)
42
-    {
43
-        if(!($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
44
-            throw new InvalidArgumentException(
45
-                esc_html__(
46
-                    'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.',
47
-                    'event_espresso'
48
-                )
49
-            );
50
-        }
51
-        $this->generator = $generator;
52
-    }
53
-
54
-
55
-
56
-    /**
57
-     * @param string $fqcn
58
-     * @param array  $arguments
59
-     * @param bool   $shared
60
-     * @return mixed
61
-     * @throws EE_Error
62
-     * @throws ServiceNotFoundException
63
-     */
64
-    public function load($fqcn, $arguments = array(), $shared = true)
65
-    {
66
-        if($this->generator instanceof EE_Registry) {
67
-            return $this->generator->create($fqcn, $arguments, $shared);
68
-        }
69
-        $shared = $shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW;
70
-        return $this->generator->brew($fqcn, $arguments, $shared);
71
-
72
-    }
73
-
74
-
75
-
76
-    /**
77
-     * calls reset() on generator if method exists
78
-     */
79
-    public function reset()
80
-    {
81
-        if (method_exists($this->generator, 'reset')) {
82
-            $this->generator->reset();
83
-        }
84
-    }
28
+	/**
29
+	 * @var EE_Registry|CoffeeShop $generator
30
+	 */
31
+	private $generator;
32
+
33
+
34
+
35
+	/**
36
+	 * CoreLoader constructor.
37
+	 *
38
+	 * @param EE_Registry|CoffeeShop $generator
39
+	 * @throws InvalidArgumentException
40
+	 */
41
+	public function __construct($generator)
42
+	{
43
+		if(!($generator instanceof EE_Registry || $generator instanceof CoffeeShop)) {
44
+			throw new InvalidArgumentException(
45
+				esc_html__(
46
+					'The CoreLoader class must receive an instance of EE_Registry or the CoffeeShop DI container.',
47
+					'event_espresso'
48
+				)
49
+			);
50
+		}
51
+		$this->generator = $generator;
52
+	}
53
+
54
+
55
+
56
+	/**
57
+	 * @param string $fqcn
58
+	 * @param array  $arguments
59
+	 * @param bool   $shared
60
+	 * @return mixed
61
+	 * @throws EE_Error
62
+	 * @throws ServiceNotFoundException
63
+	 */
64
+	public function load($fqcn, $arguments = array(), $shared = true)
65
+	{
66
+		if($this->generator instanceof EE_Registry) {
67
+			return $this->generator->create($fqcn, $arguments, $shared);
68
+		}
69
+		$shared = $shared ? CoffeeMaker::BREW_SHARED : CoffeeMaker::BREW_NEW;
70
+		return $this->generator->brew($fqcn, $arguments, $shared);
71
+
72
+	}
73
+
74
+
75
+
76
+	/**
77
+	 * calls reset() on generator if method exists
78
+	 */
79
+	public function reset()
80
+	{
81
+		if (method_exists($this->generator, 'reset')) {
82
+			$this->generator->reset();
83
+		}
84
+	}
85 85
 
86 86
 }
87 87
 // End of file CoreLoader.php
Please login to merge, or discard this patch.
core/services/loaders/Loader.php 1 patch
Indentation   +134 added lines, -134 removed lines patch added patch discarded remove patch
@@ -24,140 +24,140 @@
 block discarded – undo
24 24
 {
25 25
 
26 26
 
27
-    /**
28
-     * @var LoaderDecoratorInterface $new_loader
29
-     */
30
-    private $new_loader;
31
-
32
-
33
-    /**
34
-     * @var LoaderDecoratorInterface $shared_loader
35
-     */
36
-    private $shared_loader;
37
-
38
-
39
-
40
-    /**
41
-     * Loader constructor.
42
-     *
43
-     * @param LoaderDecoratorInterface|null $new_loader
44
-     * @param LoaderDecoratorInterface|null $shared_loader
45
-     * @throws InvalidInterfaceException
46
-     * @throws InvalidArgumentException
47
-     * @throws InvalidDataTypeException
48
-     */
49
-    public function __construct(LoaderDecoratorInterface $new_loader = null, LoaderDecoratorInterface $shared_loader = null)
50
-    {
51
-        $this->new_loader = $this->setupNewLoader($new_loader);
52
-        $this->shared_loader = $this->setupSharedLoader($shared_loader);
53
-    }
54
-
55
-
56
-
57
-    /**
58
-     * @param LoaderDecoratorInterface|null $new_loader
59
-     * @return CoreLoader|LoaderDecoratorInterface
60
-     * @throws InvalidArgumentException
61
-     */
62
-    private function setupNewLoader(LoaderDecoratorInterface $new_loader = null)
63
-    {
64
-        // if not already generated, create a standard loader
65
-        if (! $new_loader instanceof LoaderDecoratorInterface) {
66
-            $new_loader = new CoreLoader(EE_Registry::instance());
67
-        }
68
-        return $new_loader;
69
-    }
70
-
71
-
72
-
73
-    /**
74
-     * @param LoaderDecoratorInterface|null $shared_loader
75
-     * @return CoreLoader|LoaderDecoratorInterface
76
-     * @throws InvalidDataTypeException
77
-     * @throws InvalidInterfaceException
78
-     * @throws InvalidArgumentException
79
-     */
80
-    private function setupSharedLoader(LoaderDecoratorInterface $shared_loader = null)
81
-    {
82
-        // if not already generated, create a caching loader
83
-        if (! $shared_loader instanceof LoaderDecoratorInterface) {
84
-            $shared_loader = new CachingLoader(
85
-                new CoreLoader(EE_Registry::instance()),
86
-                new LooseCollection('')
87
-            );
88
-        }
89
-        return $shared_loader;
90
-    }
91
-
92
-
93
-
94
-    /**
95
-     * @return LoaderDecoratorInterface
96
-     */
97
-    public function getNewLoader()
98
-    {
99
-        return $this->new_loader;
100
-    }
101
-
102
-
103
-
104
-    /**
105
-     * @return LoaderDecoratorInterface
106
-     */
107
-    public function getSharedLoader()
108
-    {
109
-        return $this->shared_loader;
110
-    }
111
-
112
-
113
-
114
-    /**
115
-     * @param string $fqcn
116
-     * @param array  $arguments
117
-     * @param bool   $shared
118
-     * @return mixed
119
-     */
120
-    public function load($fqcn, $arguments = array(), $shared = true)
121
-    {
122
-        return $shared
123
-            ? $this->getSharedLoader()->load($fqcn, $arguments, $shared)
124
-            : $this->getNewLoader()->load($fqcn, $arguments, $shared);
125
-    }
126
-
127
-
128
-
129
-    /**
130
-     * @param string $fqcn
131
-     * @param array  $arguments
132
-     * @return mixed
133
-     */
134
-    public function getNew($fqcn, $arguments = array())
135
-    {
136
-        return $this->getNewLoader()->load($fqcn, $arguments, false);
137
-    }
138
-
139
-
140
-
141
-    /**
142
-     * @param string $fqcn
143
-     * @param array  $arguments
144
-     * @return mixed
145
-     */
146
-    public function getShared($fqcn, $arguments = array())
147
-    {
148
-        return $this->getSharedLoader()->load($fqcn, $arguments, true);
149
-    }
150
-
151
-
152
-
153
-    /**
154
-     * calls reset() on loaders if that method exists
155
-     */
156
-    public function reset()
157
-    {
158
-        $this->new_loader->reset();
159
-        $this->shared_loader->reset();
160
-    }
27
+	/**
28
+	 * @var LoaderDecoratorInterface $new_loader
29
+	 */
30
+	private $new_loader;
31
+
32
+
33
+	/**
34
+	 * @var LoaderDecoratorInterface $shared_loader
35
+	 */
36
+	private $shared_loader;
37
+
38
+
39
+
40
+	/**
41
+	 * Loader constructor.
42
+	 *
43
+	 * @param LoaderDecoratorInterface|null $new_loader
44
+	 * @param LoaderDecoratorInterface|null $shared_loader
45
+	 * @throws InvalidInterfaceException
46
+	 * @throws InvalidArgumentException
47
+	 * @throws InvalidDataTypeException
48
+	 */
49
+	public function __construct(LoaderDecoratorInterface $new_loader = null, LoaderDecoratorInterface $shared_loader = null)
50
+	{
51
+		$this->new_loader = $this->setupNewLoader($new_loader);
52
+		$this->shared_loader = $this->setupSharedLoader($shared_loader);
53
+	}
54
+
55
+
56
+
57
+	/**
58
+	 * @param LoaderDecoratorInterface|null $new_loader
59
+	 * @return CoreLoader|LoaderDecoratorInterface
60
+	 * @throws InvalidArgumentException
61
+	 */
62
+	private function setupNewLoader(LoaderDecoratorInterface $new_loader = null)
63
+	{
64
+		// if not already generated, create a standard loader
65
+		if (! $new_loader instanceof LoaderDecoratorInterface) {
66
+			$new_loader = new CoreLoader(EE_Registry::instance());
67
+		}
68
+		return $new_loader;
69
+	}
70
+
71
+
72
+
73
+	/**
74
+	 * @param LoaderDecoratorInterface|null $shared_loader
75
+	 * @return CoreLoader|LoaderDecoratorInterface
76
+	 * @throws InvalidDataTypeException
77
+	 * @throws InvalidInterfaceException
78
+	 * @throws InvalidArgumentException
79
+	 */
80
+	private function setupSharedLoader(LoaderDecoratorInterface $shared_loader = null)
81
+	{
82
+		// if not already generated, create a caching loader
83
+		if (! $shared_loader instanceof LoaderDecoratorInterface) {
84
+			$shared_loader = new CachingLoader(
85
+				new CoreLoader(EE_Registry::instance()),
86
+				new LooseCollection('')
87
+			);
88
+		}
89
+		return $shared_loader;
90
+	}
91
+
92
+
93
+
94
+	/**
95
+	 * @return LoaderDecoratorInterface
96
+	 */
97
+	public function getNewLoader()
98
+	{
99
+		return $this->new_loader;
100
+	}
101
+
102
+
103
+
104
+	/**
105
+	 * @return LoaderDecoratorInterface
106
+	 */
107
+	public function getSharedLoader()
108
+	{
109
+		return $this->shared_loader;
110
+	}
111
+
112
+
113
+
114
+	/**
115
+	 * @param string $fqcn
116
+	 * @param array  $arguments
117
+	 * @param bool   $shared
118
+	 * @return mixed
119
+	 */
120
+	public function load($fqcn, $arguments = array(), $shared = true)
121
+	{
122
+		return $shared
123
+			? $this->getSharedLoader()->load($fqcn, $arguments, $shared)
124
+			: $this->getNewLoader()->load($fqcn, $arguments, $shared);
125
+	}
126
+
127
+
128
+
129
+	/**
130
+	 * @param string $fqcn
131
+	 * @param array  $arguments
132
+	 * @return mixed
133
+	 */
134
+	public function getNew($fqcn, $arguments = array())
135
+	{
136
+		return $this->getNewLoader()->load($fqcn, $arguments, false);
137
+	}
138
+
139
+
140
+
141
+	/**
142
+	 * @param string $fqcn
143
+	 * @param array  $arguments
144
+	 * @return mixed
145
+	 */
146
+	public function getShared($fqcn, $arguments = array())
147
+	{
148
+		return $this->getSharedLoader()->load($fqcn, $arguments, true);
149
+	}
150
+
151
+
152
+
153
+	/**
154
+	 * calls reset() on loaders if that method exists
155
+	 */
156
+	public function reset()
157
+	{
158
+		$this->new_loader->reset();
159
+		$this->shared_loader->reset();
160
+	}
161 161
 
162 162
 }
163 163
 // End of file Loader.php
Please login to merge, or discard this patch.
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Spacing   +87 added lines, -87 removed lines patch added patch discarded remove patch
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
         // when adding a new registration...
70 70
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71 71
             EE_System::do_not_cache();
72
-            if (! isset($this->_req_data['processing_registration'])
72
+            if ( ! isset($this->_req_data['processing_registration'])
73 73
                  || absint($this->_req_data['processing_registration']) !== 1
74 74
             ) {
75 75
                 // and it's NOT the attendee information reg step
@@ -164,7 +164,7 @@  discard block
 block discarded – undo
164 164
     public function _set_page_routes()
165 165
     {
166 166
         $this->_get_registration_status_array();
167
-        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
167
+        $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168 168
             ? $this->_req_data['_REG_ID'] : 0;
169 169
         $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
170 170
             ? $this->_req_data['reg_status_change_form']['REG_ID']
@@ -646,7 +646,7 @@  discard block
 block discarded – undo
646 646
         //style
647 647
         wp_register_style(
648 648
             'espresso_reg',
649
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
649
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
650 650
             array('ee-admin-css'),
651 651
             EVENT_ESPRESSO_VERSION
652 652
         );
@@ -654,7 +654,7 @@  discard block
 block discarded – undo
654 654
         //script
655 655
         wp_register_script(
656 656
             'espresso_reg',
657
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
657
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
658 658
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
659 659
             EVENT_ESPRESSO_VERSION,
660 660
             true
@@ -692,7 +692,7 @@  discard block
 block discarded – undo
692 692
         wp_deregister_style('espresso_reg');
693 693
         wp_register_style(
694 694
             'espresso_att',
695
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
695
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
696 696
             array('ee-admin-css'),
697 697
             EVENT_ESPRESSO_VERSION
698 698
         );
@@ -704,7 +704,7 @@  discard block
 block discarded – undo
704 704
     {
705 705
         wp_register_script(
706 706
             'ee-spco-for-admin',
707
-            REG_ASSETS_URL . 'spco_for_admin.js',
707
+            REG_ASSETS_URL.'spco_for_admin.js',
708 708
             array('underscore', 'jquery'),
709 709
             EVENT_ESPRESSO_VERSION,
710 710
             true
@@ -837,7 +837,7 @@  discard block
 block discarded – undo
837 837
                     'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
838 838
                 ),
839 839
             );
840
-            $this->_views['trash']      = array(
840
+            $this->_views['trash'] = array(
841 841
                 'slug'        => 'trash',
842 842
                 'label'       => esc_html__('Trash', 'event_espresso'),
843 843
                 'count'       => 0,
@@ -926,7 +926,7 @@  discard block
 block discarded – undo
926 926
         }
927 927
         $sc_items = array(
928 928
             'approved_status'   => array(
929
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
929
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
930 930
                 'desc'  => EEH_Template::pretty_status(
931 931
                     EEM_Registration::status_id_approved,
932 932
                     false,
@@ -934,7 +934,7 @@  discard block
 block discarded – undo
934 934
                 ),
935 935
             ),
936 936
             'pending_status'    => array(
937
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
937
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
938 938
                 'desc'  => EEH_Template::pretty_status(
939 939
                     EEM_Registration::status_id_pending_payment,
940 940
                     false,
@@ -942,7 +942,7 @@  discard block
 block discarded – undo
942 942
                 ),
943 943
             ),
944 944
             'wait_list'         => array(
945
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
945
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
946 946
                 'desc'  => EEH_Template::pretty_status(
947 947
                     EEM_Registration::status_id_wait_list,
948 948
                     false,
@@ -950,7 +950,7 @@  discard block
 block discarded – undo
950 950
                 ),
951 951
             ),
952 952
             'incomplete_status' => array(
953
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
953
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
954 954
                 'desc'  => EEH_Template::pretty_status(
955 955
                     EEM_Registration::status_id_incomplete,
956 956
                     false,
@@ -958,7 +958,7 @@  discard block
 block discarded – undo
958 958
                 ),
959 959
             ),
960 960
             'not_approved'      => array(
961
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
961
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
962 962
                 'desc'  => EEH_Template::pretty_status(
963 963
                     EEM_Registration::status_id_not_approved,
964 964
                     false,
@@ -966,7 +966,7 @@  discard block
 block discarded – undo
966 966
                 ),
967 967
             ),
968 968
             'declined_status'   => array(
969
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
969
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
970 970
                 'desc'  => EEH_Template::pretty_status(
971 971
                     EEM_Registration::status_id_declined,
972 972
                     false,
@@ -974,7 +974,7 @@  discard block
 block discarded – undo
974 974
                 ),
975 975
             ),
976 976
             'cancelled_status'  => array(
977
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
977
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
978 978
                 'desc'  => EEH_Template::pretty_status(
979 979
                     EEM_Registration::status_id_cancelled,
980 980
                     false,
@@ -1003,7 +1003,7 @@  discard block
 block discarded – undo
1003 1003
                 'espresso_registrations_new_registration',
1004 1004
                 $EVT_ID
1005 1005
             )) {
1006
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1006
+                $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
1007 1007
                     'new_registration',
1008 1008
                     'add-registrant',
1009 1009
                     array('event_id' => $EVT_ID),
@@ -1043,7 +1043,7 @@  discard block
 block discarded – undo
1043 1043
                 $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1044 1044
                 $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1045 1045
                 $this->_template_args['admin_page_header'] .= $datetime->name();
1046
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1046
+                $this->_template_args['admin_page_header'] .= ' ( '.$datetime->start_date().' )';
1047 1047
                 $this->_template_args['admin_page_header'] .= '</span></h3>';
1048 1048
             }
1049 1049
         }
@@ -1143,7 +1143,7 @@  discard block
 block discarded – undo
1143 1143
             'caps'                     => EEM_Registration::caps_read_admin,
1144 1144
             'default_where_conditions' => 'this_model_only',
1145 1145
         );
1146
-        if (! $count) {
1146
+        if ( ! $count) {
1147 1147
             $query_params = array_merge(
1148 1148
                 $query_params,
1149 1149
                 $this->_get_orderby_for_registrations_query(),
@@ -1164,7 +1164,7 @@  discard block
 block discarded – undo
1164 1164
     protected function _add_event_id_to_where_conditions(array $request)
1165 1165
     {
1166 1166
         $where = array();
1167
-        if (! empty($request['event_id'])) {
1167
+        if ( ! empty($request['event_id'])) {
1168 1168
             $where['EVT_ID'] = absint($request['event_id']);
1169 1169
         }
1170 1170
         return $where;
@@ -1180,7 +1180,7 @@  discard block
 block discarded – undo
1180 1180
     protected function _add_category_id_to_where_conditions(array $request)
1181 1181
     {
1182 1182
         $where = array();
1183
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1183
+        if ( ! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1184 1184
             $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1185 1185
         }
1186 1186
         return $where;
@@ -1196,10 +1196,10 @@  discard block
 block discarded – undo
1196 1196
     protected function _add_datetime_id_to_where_conditions(array $request)
1197 1197
     {
1198 1198
         $where = array();
1199
-        if (! empty($request['datetime_id'])) {
1199
+        if ( ! empty($request['datetime_id'])) {
1200 1200
             $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1201 1201
         }
1202
-        if (! empty($request['DTT_ID'])) {
1202
+        if ( ! empty($request['DTT_ID'])) {
1203 1203
             $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1204 1204
         }
1205 1205
         return $where;
@@ -1225,7 +1225,7 @@  discard block
 block discarded – undo
1225 1225
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1226 1226
          * UNLESS viewing trashed registrations.
1227 1227
          */
1228
-        if (! empty($registration_status)) {
1228
+        if ( ! empty($registration_status)) {
1229 1229
             $where['STS_ID'] = $registration_status;
1230 1230
         } else {
1231 1231
             //make sure we exclude incomplete registrations, but only if not trashed.
@@ -1265,12 +1265,12 @@  discard block
 block discarded – undo
1265 1265
                 array(
1266 1266
                     EEM_Registration::instance()->convert_datetime_for_query(
1267 1267
                         'REG_date',
1268
-                        $now . ' 00:00:00',
1268
+                        $now.' 00:00:00',
1269 1269
                         'Y-m-d H:i:s'
1270 1270
                     ),
1271 1271
                     EEM_Registration::instance()->convert_datetime_for_query(
1272 1272
                         'REG_date',
1273
-                        $now . ' 23:59:59',
1273
+                        $now.' 23:59:59',
1274 1274
                         'Y-m-d H:i:s'
1275 1275
                     ),
1276 1276
                 ),
@@ -1283,12 +1283,12 @@  discard block
 block discarded – undo
1283 1283
                 array(
1284 1284
                     EEM_Registration::instance()->convert_datetime_for_query(
1285 1285
                         'REG_date',
1286
-                        $current_year_and_month . '-01 00:00:00',
1286
+                        $current_year_and_month.'-01 00:00:00',
1287 1287
                         'Y-m-d H:i:s'
1288 1288
                     ),
1289 1289
                     EEM_Registration::instance()->convert_datetime_for_query(
1290 1290
                         'REG_date',
1291
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1291
+                        $current_year_and_month.'-'.$days_this_month.' 23:59:59',
1292 1292
                         'Y-m-d H:i:s'
1293 1293
                     ),
1294 1294
                 ),
@@ -1303,18 +1303,18 @@  discard block
 block discarded – undo
1303 1303
                 : '';
1304 1304
             //if there is not a month or year then we can't go further
1305 1305
             if ($month_requested && $year_requested) {
1306
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1306
+                $days_in_month     = date('t', strtotime($year_requested.'-'.$month_requested.'-'.'01'));
1307 1307
                 $where['REG_date'] = array(
1308 1308
                     'BETWEEN',
1309 1309
                     array(
1310 1310
                         EEM_Registration::instance()->convert_datetime_for_query(
1311 1311
                             'REG_date',
1312
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1312
+                            $year_requested.'-'.$month_requested.'-01 00:00:00',
1313 1313
                             'Y-m-d H:i:s'
1314 1314
                         ),
1315 1315
                         EEM_Registration::instance()->convert_datetime_for_query(
1316 1316
                             'REG_date',
1317
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1317
+                            $year_requested.'-'.$month_requested.'-'.$days_in_month.' 23:59:59',
1318 1318
                             'Y-m-d H:i:s'
1319 1319
                         ),
1320 1320
                     ),
@@ -1334,8 +1334,8 @@  discard block
 block discarded – undo
1334 1334
     protected function _add_search_to_where_conditions(array $request)
1335 1335
     {
1336 1336
         $where = array();
1337
-        if (! empty($request['s'])) {
1338
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1337
+        if ( ! empty($request['s'])) {
1338
+            $search_string = '%'.sanitize_text_field($request['s']).'%';
1339 1339
             $where['OR*search_conditions'] = array(
1340 1340
                 'Event.EVT_name'                          => array('LIKE', $search_string),
1341 1341
                 'Event.EVT_desc'                          => array('LIKE', $search_string),
@@ -1448,7 +1448,7 @@  discard block
 block discarded – undo
1448 1448
             : $per_page;
1449 1449
 
1450 1450
         //-1 means return all results so get out if that's set.
1451
-        if ((int)$per_page === -1) {
1451
+        if ((int) $per_page === -1) {
1452 1452
             return array();
1453 1453
         }
1454 1454
         $per_page = absint($per_page);
@@ -1501,7 +1501,7 @@  discard block
 block discarded – undo
1501 1501
                 ),
1502 1502
                 REG_ADMIN_URL
1503 1503
             );
1504
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1504
+            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1505 1505
                 array(
1506 1506
                     'action' => 'default',
1507 1507
                     'EVT_ID' => $event_id,
@@ -1509,7 +1509,7 @@  discard block
 block discarded – undo
1509 1509
                 ),
1510 1510
                 admin_url('admin.php')
1511 1511
             );
1512
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1512
+            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1513 1513
                 array(
1514 1514
                     'page'   => 'espresso_events',
1515 1515
                     'action' => 'edit',
@@ -1518,12 +1518,12 @@  discard block
 block discarded – undo
1518 1518
                 admin_url('admin.php')
1519 1519
             );
1520 1520
             //next and previous links
1521
-            $next_reg                                      = $this->_registration->next(
1521
+            $next_reg = $this->_registration->next(
1522 1522
                 null,
1523 1523
                 array(),
1524 1524
                 'REG_ID'
1525 1525
             );
1526
-            $this->_template_args['next_registration']     = $next_reg
1526
+            $this->_template_args['next_registration'] = $next_reg
1527 1527
                 ? $this->_next_link(
1528 1528
                     EE_Admin_Page::add_query_args_and_nonce(
1529 1529
                         array(
@@ -1535,7 +1535,7 @@  discard block
 block discarded – undo
1535 1535
                     'dashicons dashicons-arrow-right ee-icon-size-22'
1536 1536
                 )
1537 1537
                 : '';
1538
-            $previous_reg                                  = $this->_registration->previous(
1538
+            $previous_reg = $this->_registration->previous(
1539 1539
                 null,
1540 1540
                 array(),
1541 1541
                 'REG_ID'
@@ -1553,7 +1553,7 @@  discard block
 block discarded – undo
1553 1553
                 )
1554 1554
                 : '';
1555 1555
             // grab header
1556
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1556
+            $template_path                             = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1557 1557
             $this->_template_args['REG_ID']            = $this->_registration->ID();
1558 1558
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1559 1559
                 $template_path,
@@ -1669,7 +1669,7 @@  discard block
 block discarded – undo
1669 1669
                             EEH_HTML::strong(
1670 1670
                                 $this->_registration->pretty_status(),
1671 1671
                                 '',
1672
-                                'status-' . $this->_registration->status_ID(),
1672
+                                'status-'.$this->_registration->status_ID(),
1673 1673
                                 'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1674 1674
                             )
1675 1675
                         )
@@ -1741,9 +1741,9 @@  discard block
 block discarded – undo
1741 1741
     {
1742 1742
         if (isset($this->_req_data['reg_status_change_form'])) {
1743 1743
             $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1744
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1744
+                ? (array) $this->_req_data['reg_status_change_form']['REG_ID'] : array();
1745 1745
         } else {
1746
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1746
+            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array) $this->_req_data['_REG_ID'] : array();
1747 1747
         }
1748 1748
         $success = $this->_set_registration_status($REG_IDs, $status);
1749 1749
         //notify?
@@ -1778,7 +1778,7 @@  discard block
 block discarded – undo
1778 1778
     {
1779 1779
         $success = false;
1780 1780
         // typecast $REG_IDs
1781
-        $REG_IDs = (array)$REG_IDs;
1781
+        $REG_IDs = (array) $REG_IDs;
1782 1782
         if ( ! empty($REG_IDs)) {
1783 1783
             $success = true;
1784 1784
             // set default status if none is passed
@@ -1917,7 +1917,7 @@  discard block
 block discarded – undo
1917 1917
             $action,
1918 1918
             $notify
1919 1919
         );
1920
-        $method = $action . '_registration';
1920
+        $method = $action.'_registration';
1921 1921
         if (method_exists($this, $method)) {
1922 1922
             $this->$method($notify);
1923 1923
         }
@@ -2031,7 +2031,7 @@  discard block
 block discarded – undo
2031 2031
             $filtered_line_item_tree,
2032 2032
             array('EE_Registration' => $this->_registration)
2033 2033
         );
2034
-        $attendee                                = $this->_registration->attendee();
2034
+        $attendee = $this->_registration->attendee();
2035 2035
         if (EE_Registry::instance()->CAP->current_user_can(
2036 2036
             'ee_read_transaction',
2037 2037
             'espresso_transactions_view_transaction'
@@ -2110,7 +2110,7 @@  discard block
 block discarded – undo
2110 2110
                 'Payment method response',
2111 2111
                 'event_espresso'
2112 2112
             );
2113
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2113
+            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2114 2114
         }
2115 2115
         $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2116 2116
         $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
@@ -2138,7 +2138,7 @@  discard block
 block discarded – undo
2138 2138
         $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2139 2139
         $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2140 2140
         $template_path                                                        =
2141
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2141
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2142 2142
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2143 2143
     }
2144 2144
 
@@ -2167,7 +2167,7 @@  discard block
 block discarded – undo
2167 2167
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2168 2168
             $this->_template_args['REG_ID']                    = $this->_registration->ID();
2169 2169
             $template_path                                     =
2170
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2170
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2171 2171
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2172 2172
         }
2173 2173
     }
@@ -2184,7 +2184,7 @@  discard block
 block discarded – undo
2184 2184
     public function form_before_question_group($output)
2185 2185
     {
2186 2186
         EE_Error::doing_it_wrong(
2187
-            __CLASS__ . '::' . __FUNCTION__,
2187
+            __CLASS__.'::'.__FUNCTION__,
2188 2188
             esc_html__(
2189 2189
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2190 2190
                 'event_espresso'
@@ -2209,7 +2209,7 @@  discard block
 block discarded – undo
2209 2209
     public function form_after_question_group($output)
2210 2210
     {
2211 2211
         EE_Error::doing_it_wrong(
2212
-            __CLASS__ . '::' . __FUNCTION__,
2212
+            __CLASS__.'::'.__FUNCTION__,
2213 2213
             esc_html__(
2214 2214
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2215 2215
                 'event_espresso'
@@ -2247,7 +2247,7 @@  discard block
 block discarded – undo
2247 2247
     public function form_form_field_label_wrap($label)
2248 2248
     {
2249 2249
         EE_Error::doing_it_wrong(
2250
-            __CLASS__ . '::' . __FUNCTION__,
2250
+            __CLASS__.'::'.__FUNCTION__,
2251 2251
             esc_html__(
2252 2252
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2253 2253
                 'event_espresso'
@@ -2257,7 +2257,7 @@  discard block
 block discarded – undo
2257 2257
         return '
2258 2258
 			<tr>
2259 2259
 				<th>
2260
-					' . $label . '
2260
+					' . $label.'
2261 2261
 				</th>';
2262 2262
     }
2263 2263
 
@@ -2273,7 +2273,7 @@  discard block
 block discarded – undo
2273 2273
     public function form_form_field_input__wrap($input)
2274 2274
     {
2275 2275
         EE_Error::doing_it_wrong(
2276
-            __CLASS__ . '::' . __FUNCTION__,
2276
+            __CLASS__.'::'.__FUNCTION__,
2277 2277
             esc_html__(
2278 2278
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2279 2279
                 'event_espresso'
@@ -2282,7 +2282,7 @@  discard block
 block discarded – undo
2282 2282
         );
2283 2283
         return '
2284 2284
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2285
-					' . $input . '
2285
+					' . $input.'
2286 2286
 				</td>
2287 2287
 			</tr>';
2288 2288
     }
@@ -2324,7 +2324,7 @@  discard block
 block discarded – undo
2324 2324
     protected function _get_reg_custom_questions_form($REG_ID)
2325 2325
     {
2326 2326
         if ( ! $this->_reg_custom_questions_form) {
2327
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2327
+            require_once(REG_ADMIN.'form_sections'.DS.'EE_Registration_Custom_Questions_Form.form.php');
2328 2328
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2329 2329
                 EEM_Registration::instance()->get_one_by_ID($REG_ID)
2330 2330
             );
@@ -2357,7 +2357,7 @@  discard block
 block discarded – undo
2357 2357
         if ($form->is_valid()) {
2358 2358
             foreach ($form->subforms() as $question_group_id => $question_group_form) {
2359 2359
                 foreach ($question_group_form->inputs() as $question_id => $input) {
2360
-                    $where_conditions    = array(
2360
+                    $where_conditions = array(
2361 2361
                         'QST_ID' => $question_id,
2362 2362
                         'REG_ID' => $REG_ID,
2363 2363
                     );
@@ -2395,7 +2395,7 @@  discard block
 block discarded – undo
2395 2395
         $REG = EEM_Registration::instance();
2396 2396
         //get all other registrations on this transaction, and cache
2397 2397
         //the attendees for them so we don't have to run another query using force_join
2398
-        $registrations                           = $REG->get_all(array(
2398
+        $registrations = $REG->get_all(array(
2399 2399
             array(
2400 2400
                 'TXN_ID' => $this->_registration->transaction_ID(),
2401 2401
                 'REG_ID' => array('!=', $this->_registration->ID()),
@@ -2419,7 +2419,7 @@  discard block
 block discarded – undo
2419 2419
             $att_nmbr = 1;
2420 2420
             foreach ($registrations as $registration) {
2421 2421
                 /* @var $registration EE_Registration */
2422
-                $attendee                                                    = $registration->attendee()
2422
+                $attendee = $registration->attendee()
2423 2423
                     ? $registration->attendee()
2424 2424
                     : EEM_Attendee::instance()
2425 2425
                                   ->create_default_object();
@@ -2432,19 +2432,19 @@  discard block
 block discarded – undo
2432 2432
                     ', ',
2433 2433
                     $attendee->full_address_as_array()
2434 2434
                 );
2435
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2435
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2436 2436
                     array(
2437 2437
                         'action' => 'edit_attendee',
2438 2438
                         'post'   => $attendee->ID(),
2439 2439
                     ),
2440 2440
                     REG_ADMIN_URL
2441 2441
                 );
2442
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2442
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj()->name();
2443 2443
                 $att_nmbr++;
2444 2444
             }
2445 2445
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2446 2446
         }
2447
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2447
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2448 2448
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2449 2449
     }
2450 2450
 
@@ -2484,20 +2484,20 @@  discard block
 block discarded – undo
2484 2484
         $this->_template_args['phone']             = $attendee->phone();
2485 2485
         $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2486 2486
         //edit link
2487
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2487
+        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
2488 2488
             'action' => 'edit_attendee',
2489 2489
             'post'   => $attendee->ID(),
2490 2490
         ), REG_ADMIN_URL);
2491 2491
         $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2492 2492
         //create link
2493
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2493
+        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2494 2494
             ? EE_Admin_Page::add_query_args_and_nonce(array(
2495 2495
                 'action'  => 'duplicate_attendee',
2496 2496
                 '_REG_ID' => $this->_registration->ID(),
2497 2497
             ), REG_ADMIN_URL) : '';
2498 2498
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2499 2499
         $this->_template_args['att_check']    = $att_check;
2500
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2500
+        $template_path                        = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2501 2501
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2502 2502
     }
2503 2503
 
@@ -2539,7 +2539,7 @@  discard block
 block discarded – undo
2539 2539
             /** @var EE_Registration $REG */
2540 2540
             $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2541 2541
             $payments = $REG->registration_payments();
2542
-            if (! empty($payments)) {
2542
+            if ( ! empty($payments)) {
2543 2543
                 $name = $REG->attendee() instanceof EE_Attendee
2544 2544
                     ? $REG->attendee()->full_name()
2545 2545
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2732,7 +2732,7 @@  discard block
 block discarded – undo
2732 2732
                 'action' => 'edit',
2733 2733
                 'post'   => $this->_reg_event->ID(),
2734 2734
             ), EVENTS_ADMIN_URL);
2735
-            $edit_event_lnk                     = '<a href="'
2735
+            $edit_event_lnk = '<a href="'
2736 2736
                                                   . $edit_event_url
2737 2737
                                                   . '" title="'
2738 2738
                                                   . esc_attr__('Edit ', 'event_espresso')
@@ -2750,7 +2750,7 @@  discard block
 block discarded – undo
2750 2750
         }
2751 2751
         // grab header
2752 2752
         $template_path                              =
2753
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2753
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2754 2754
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2755 2755
             $this->_template_args, true);
2756 2756
         //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
@@ -2785,7 +2785,7 @@  discard block
 block discarded – undo
2785 2785
                 '</b>'
2786 2786
             );
2787 2787
             return '
2788
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2788
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2789 2789
 	<script >
2790 2790
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2791 2791
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2853,7 +2853,7 @@  discard block
 block discarded – undo
2853 2853
         //we come back to the process_registration_step route.
2854 2854
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2855 2855
         return EEH_Template::display_template(
2856
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2856
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
2857 2857
             $template_args,
2858 2858
             true
2859 2859
         );
@@ -2872,7 +2872,7 @@  discard block
 block discarded – undo
2872 2872
         if (is_object($this->_reg_event)) {
2873 2873
             return true;
2874 2874
         }
2875
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2875
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2876 2876
         if ( ! $EVT_ID) {
2877 2877
             return false;
2878 2878
         }
@@ -2938,7 +2938,7 @@  discard block
 block discarded – undo
2938 2938
                 }
2939 2939
                 break;
2940 2940
             case 'questions' :
2941
-                if (! isset(
2941
+                if ( ! isset(
2942 2942
                     $this->_req_data['txn_reg_status_change'],
2943 2943
                     $this->_req_data['txn_reg_status_change']['send_notifications'])
2944 2944
                 ) {
@@ -3052,7 +3052,7 @@  discard block
 block discarded – undo
3052 3052
     public function get_attendees($per_page, $count = false, $trash = false)
3053 3053
     {
3054 3054
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3055
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3055
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
3056 3056
         $ATT_MDL                    = EEM_Attendee::instance();
3057 3057
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3058 3058
         switch ($this->_req_data['orderby']) {
@@ -3089,7 +3089,7 @@  discard block
 block discarded – undo
3089 3089
             : $per_page;
3090 3090
         $_where       = array();
3091 3091
         if ( ! empty($this->_req_data['s'])) {
3092
-            $sstr         = '%' . $this->_req_data['s'] . '%';
3092
+            $sstr         = '%'.$this->_req_data['s'].'%';
3093 3093
             $_where['OR'] = array(
3094 3094
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3095 3095
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3165,9 +3165,9 @@  discard block
 block discarded – undo
3165 3165
      *                                                     the query parameters from the request
3166 3166
      * @return void ends the request with a redirect or download
3167 3167
      */
3168
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3168
+    public function _registrations_report_base($method_name_for_getting_query_params)
3169 3169
     {
3170
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3170
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3171 3171
             wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3172 3172
                 array(
3173 3173
                     'page'        => 'espresso_batch',
@@ -3176,7 +3176,7 @@  discard block
 block discarded – undo
3176 3176
                     'filters'     => urlencode(
3177 3177
                         serialize(
3178 3178
                             call_user_func(
3179
-                                array( $this, $method_name_for_getting_query_params ),
3179
+                                array($this, $method_name_for_getting_query_params),
3180 3180
                                 EEH_Array::is_set(
3181 3181
                                     $this->_req_data,
3182 3182
                                     'filters',
@@ -3196,8 +3196,8 @@  discard block
 block discarded – undo
3196 3196
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3197 3197
             );
3198 3198
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
3199
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3200
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3199
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3200
+                require_once(EE_CLASSES.'EE_Export.class.php');
3201 3201
                 $EE_Export = EE_Export::instance($this->_req_data);
3202 3202
                 $EE_Export->export();
3203 3203
             }
@@ -3218,8 +3218,8 @@  discard block
 block discarded – undo
3218 3218
 
3219 3219
     public function _contact_list_export()
3220 3220
     {
3221
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3222
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3221
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3222
+            require_once(EE_CLASSES.'EE_Export.class.php');
3223 3223
             $EE_Export = EE_Export::instance($this->_req_data);
3224 3224
             $EE_Export->export_attendees();
3225 3225
         }
@@ -3236,8 +3236,8 @@  discard block
 block discarded – undo
3236 3236
                 'return_url'  => urlencode($this->_req_data['return_url']),
3237 3237
             )));
3238 3238
         } else {
3239
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3240
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3239
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3240
+                require_once(EE_CLASSES.'EE_Export.class.php');
3241 3241
                 $EE_Export = EE_Export::instance($this->_req_data);
3242 3242
                 $EE_Export->report_attendees();
3243 3243
             }
@@ -3303,7 +3303,7 @@  discard block
 block discarded – undo
3303 3303
             $updated_fields = array(
3304 3304
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3305 3305
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3306
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3306
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3307 3307
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3308 3308
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3309 3309
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3436,7 +3436,7 @@  discard block
 block discarded – undo
3436 3436
     {
3437 3437
         //get attendee object ( should already have it )
3438 3438
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
3439
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3439
+        $template                         = REG_TEMPLATE_PATH.'attendee_contact_info_metabox_content.template.php';
3440 3440
         EEH_Template::display_template($template, $this->_template_args);
3441 3441
     }
3442 3442
 
@@ -3498,8 +3498,8 @@  discard block
 block discarded – undo
3498 3498
                 )
3499 3499
             )
3500 3500
         );
3501
-        $template                             =
3502
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3501
+        $template =
3502
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3503 3503
         EEH_Template::display_template($template, $this->_template_args);
3504 3504
     }
3505 3505
 
@@ -3518,7 +3518,7 @@  discard block
 block discarded – undo
3518 3518
         $this->_template_args['attendee']      = $this->_cpt_model_obj;
3519 3519
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3520 3520
         $template                              =
3521
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3521
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3522 3522
         EEH_Template::display_template($template, $this->_template_args);
3523 3523
     }
3524 3524
 
@@ -3533,7 +3533,7 @@  discard block
 block discarded – undo
3533 3533
     public function after_title_form_fields($post)
3534 3534
     {
3535 3535
         if ($post->post_type == 'espresso_attendees') {
3536
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3536
+            $template                  = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3537 3537
             $template_args['attendee'] = $this->_cpt_model_obj;
3538 3538
             EEH_Template::display_template($template, $template_args);
3539 3539
         }
Please login to merge, or discard this patch.
Indentation   +3531 added lines, -3531 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,2217 +23,2217 @@  discard block
 block discarded – undo
23 23
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Registration
28
-     */
29
-    private $_registration;
30
-
31
-    /**
32
-     * @var EE_Event
33
-     */
34
-    private $_reg_event;
35
-
36
-    /**
37
-     * @var EE_Session
38
-     */
39
-    private $_session;
40
-
41
-    private static $_reg_status;
42
-
43
-    /**
44
-     * Form for displaying the custom questions for this registration.
45
-     * This gets used a few times throughout the request so its best to cache it
46
-     *
47
-     * @var EE_Registration_Custom_Questions_Form
48
-     */
49
-    protected $_reg_custom_questions_form = null;
50
-
51
-
52
-    /**
53
-     *        constructor
54
-     *
55
-     * @Constructor
56
-     * @access public
57
-     * @param bool $routing
58
-     * @return Registrations_Admin_Page
59
-     */
60
-    public function __construct($routing = true)
61
-    {
62
-        parent::__construct($routing);
63
-        add_action('wp_loaded', array($this, 'wp_loaded'));
64
-    }
65
-
66
-
67
-    public function wp_loaded()
68
-    {
69
-        // when adding a new registration...
70
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
-            EE_System::do_not_cache();
72
-            if (! isset($this->_req_data['processing_registration'])
73
-                 || absint($this->_req_data['processing_registration']) !== 1
74
-            ) {
75
-                // and it's NOT the attendee information reg step
76
-                // force cookie expiration by setting time to last week
77
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
-                // and update the global
79
-                $_COOKIE['ee_registration_added'] = 0;
80
-            }
81
-        }
82
-    }
83
-
84
-
85
-    protected function _init_page_props()
86
-    {
87
-        $this->page_slug        = REG_PG_SLUG;
88
-        $this->_admin_base_url  = REG_ADMIN_URL;
89
-        $this->_admin_base_path = REG_ADMIN;
90
-        $this->page_label       = esc_html__('Registrations', 'event_espresso');
91
-        $this->_cpt_routes      = array(
92
-            'add_new_attendee' => 'espresso_attendees',
93
-            'edit_attendee'    => 'espresso_attendees',
94
-            'insert_attendee'  => 'espresso_attendees',
95
-            'update_attendee'  => 'espresso_attendees',
96
-        );
97
-        $this->_cpt_model_names = array(
98
-            'add_new_attendee' => 'EEM_Attendee',
99
-            'edit_attendee'    => 'EEM_Attendee',
100
-        );
101
-        $this->_cpt_edit_routes = array(
102
-            'espresso_attendees' => 'edit_attendee',
103
-        );
104
-        $this->_pagenow_map     = array(
105
-            'add_new_attendee' => 'post-new.php',
106
-            'edit_attendee'    => 'post.php',
107
-            'trash'            => 'post.php',
108
-        );
109
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
-        //add filters so that the comment urls don't take users to a confusing 404 page
111
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
-    }
113
-
114
-
115
-    public function clear_comment_link($link, $comment, $args)
116
-    {
117
-        //gotta make sure this only happens on this route
118
-        $post_type = get_post_type($comment->comment_post_ID);
119
-        if ($post_type === 'espresso_attendees') {
120
-            return '#commentsdiv';
121
-        }
122
-        return $link;
123
-    }
124
-
125
-
126
-    protected function _ajax_hooks()
127
-    {
128
-        //todo: all hooks for registrations ajax goes in here
129
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
-    }
131
-
132
-
133
-    protected function _define_page_props()
134
-    {
135
-        $this->_admin_page_title = $this->page_label;
136
-        $this->_labels           = array(
137
-            'buttons'                      => array(
138
-                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
139
-                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
140
-                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
141
-                'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
142
-                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
143
-                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
144
-                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
145
-                'contact_list_export' => esc_html__("Export Data", "event_espresso"),
146
-            ),
147
-            'publishbox'                   => array(
148
-                'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
149
-                'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
150
-            ),
151
-            'hide_add_button_on_cpt_route' => array(
152
-                'edit_attendee' => true,
153
-            ),
154
-        );
155
-    }
156
-
157
-
158
-    /**
159
-     *        grab url requests and route them
160
-     *
161
-     * @access private
162
-     * @return void
163
-     */
164
-    public function _set_page_routes()
165
-    {
166
-        $this->_get_registration_status_array();
167
-        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
-            ? $this->_req_data['_REG_ID'] : 0;
169
-        $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
170
-            ? $this->_req_data['reg_status_change_form']['REG_ID']
171
-            : $reg_id;
172
-        $att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
173
-            ? $this->_req_data['ATT_ID'] : 0;
174
-        $att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
175
-            ? $this->_req_data['post']
176
-            : $att_id;
177
-        $this->_page_routes = array(
178
-            'default'                            => array(
179
-                'func'       => '_registrations_overview_list_table',
180
-                'capability' => 'ee_read_registrations',
181
-            ),
182
-            'view_registration'                  => array(
183
-                'func'       => '_registration_details',
184
-                'capability' => 'ee_read_registration',
185
-                'obj_id'     => $reg_id,
186
-            ),
187
-            'edit_registration'                  => array(
188
-                'func'               => '_update_attendee_registration_form',
189
-                'noheader'           => true,
190
-                'headers_sent_route' => 'view_registration',
191
-                'capability'         => 'ee_edit_registration',
192
-                'obj_id'             => $reg_id,
193
-                '_REG_ID'            => $reg_id,
194
-            ),
195
-            'trash_registrations'                => array(
196
-                'func'       => '_trash_or_restore_registrations',
197
-                'args'       => array('trash' => true),
198
-                'noheader'   => true,
199
-                'capability' => 'ee_delete_registrations',
200
-            ),
201
-            'restore_registrations'              => array(
202
-                'func'       => '_trash_or_restore_registrations',
203
-                'args'       => array('trash' => false),
204
-                'noheader'   => true,
205
-                'capability' => 'ee_delete_registrations',
206
-            ),
207
-            'delete_registrations'               => array(
208
-                'func'       => '_delete_registrations',
209
-                'noheader'   => true,
210
-                'capability' => 'ee_delete_registrations',
211
-            ),
212
-            'new_registration'                   => array(
213
-                'func'       => 'new_registration',
214
-                'capability' => 'ee_edit_registrations',
215
-            ),
216
-            'process_reg_step'                   => array(
217
-                'func'       => 'process_reg_step',
218
-                'noheader'   => true,
219
-                'capability' => 'ee_edit_registrations',
220
-            ),
221
-            'redirect_to_txn'                    => array(
222
-                'func'       => 'redirect_to_txn',
223
-                'noheader'   => true,
224
-                'capability' => 'ee_edit_registrations',
225
-            ),
226
-            'change_reg_status'                  => array(
227
-                'func'       => '_change_reg_status',
228
-                'noheader'   => true,
229
-                'capability' => 'ee_edit_registration',
230
-                'obj_id'     => $reg_id,
231
-            ),
232
-            'approve_registration'               => array(
233
-                'func'       => 'approve_registration',
234
-                'noheader'   => true,
235
-                'capability' => 'ee_edit_registration',
236
-                'obj_id'     => $reg_id,
237
-            ),
238
-            'approve_and_notify_registration'    => array(
239
-                'func'       => 'approve_registration',
240
-                'noheader'   => true,
241
-                'args'       => array(true),
242
-                'capability' => 'ee_edit_registration',
243
-                'obj_id'     => $reg_id,
244
-            ),
245
-            'approve_registrations'               => array(
246
-                'func'       => 'bulk_action_on_registrations',
247
-                'noheader'   => true,
248
-                'capability' => 'ee_edit_registrations',
249
-                'args' => array('approve')
250
-            ),
251
-            'approve_and_notify_registrations'               => array(
252
-                'func'       => 'bulk_action_on_registrations',
253
-                'noheader'   => true,
254
-                'capability' => 'ee_edit_registrations',
255
-                'args' => array('approve', true)
256
-            ),
257
-            'decline_registration'               => array(
258
-                'func'       => 'decline_registration',
259
-                'noheader'   => true,
260
-                'capability' => 'ee_edit_registration',
261
-                'obj_id'     => $reg_id,
262
-            ),
263
-            'decline_and_notify_registration'    => array(
264
-                'func'       => 'decline_registration',
265
-                'noheader'   => true,
266
-                'args'       => array(true),
267
-                'capability' => 'ee_edit_registration',
268
-                'obj_id'     => $reg_id,
269
-            ),
270
-            'decline_registrations'               => array(
271
-                'func'       => 'bulk_action_on_registrations',
272
-                'noheader'   => true,
273
-                'capability' => 'ee_edit_registrations',
274
-                'args' => array('decline')
275
-            ),
276
-            'decline_and_notify_registrations'    => array(
277
-                'func'       => 'bulk_action_on_registrations',
278
-                'noheader'   => true,
279
-                'capability' => 'ee_edit_registrations',
280
-                'args' => array('decline', true)
281
-            ),
282
-            'pending_registration'               => array(
283
-                'func'       => 'pending_registration',
284
-                'noheader'   => true,
285
-                'capability' => 'ee_edit_registration',
286
-                'obj_id'     => $reg_id,
287
-            ),
288
-            'pending_and_notify_registration'    => array(
289
-                'func'       => 'pending_registration',
290
-                'noheader'   => true,
291
-                'args'       => array(true),
292
-                'capability' => 'ee_edit_registration',
293
-                'obj_id'     => $reg_id,
294
-            ),
295
-            'pending_registrations'               => array(
296
-                'func'       => 'bulk_action_on_registrations',
297
-                'noheader'   => true,
298
-                'capability' => 'ee_edit_registrations',
299
-                'args' => array('pending')
300
-            ),
301
-            'pending_and_notify_registrations'    => array(
302
-                'func'       => 'bulk_action_on_registrations',
303
-                'noheader'   => true,
304
-                'capability' => 'ee_edit_registrations',
305
-                'args' => array('pending', true)
306
-            ),
307
-            'no_approve_registration'            => array(
308
-                'func'       => 'not_approve_registration',
309
-                'noheader'   => true,
310
-                'capability' => 'ee_edit_registration',
311
-                'obj_id'     => $reg_id,
312
-            ),
313
-            'no_approve_and_notify_registration' => array(
314
-                'func'       => 'not_approve_registration',
315
-                'noheader'   => true,
316
-                'args'       => array(true),
317
-                'capability' => 'ee_edit_registration',
318
-                'obj_id'     => $reg_id,
319
-            ),
320
-            'no_approve_registrations'            => array(
321
-                'func'       => 'bulk_action_on_registrations',
322
-                'noheader'   => true,
323
-                'capability' => 'ee_edit_registrations',
324
-                'args' => array('no_approve')
325
-            ),
326
-            'no_approve_and_notify_registrations' => array(
327
-                'func'       => 'bulk_action_on_registrations',
328
-                'noheader'   => true,
329
-                'capability' => 'ee_edit_registrations',
330
-                'args' => array('no_approve', true)
331
-            ),
332
-            'cancel_registration'                => array(
333
-                'func'       => 'cancel_registration',
334
-                'noheader'   => true,
335
-                'capability' => 'ee_edit_registration',
336
-                'obj_id'     => $reg_id,
337
-            ),
338
-            'cancel_and_notify_registration'     => array(
339
-                'func'       => 'cancel_registration',
340
-                'noheader'   => true,
341
-                'args'       => array(true),
342
-                'capability' => 'ee_edit_registration',
343
-                'obj_id'     => $reg_id,
344
-            ),
345
-            'cancel_registrations'                => array(
346
-                'func'       => 'bulk_action_on_registrations',
347
-                'noheader'   => true,
348
-                'capability' => 'ee_edit_registrations',
349
-                'args' => array('cancel')
350
-            ),
351
-            'cancel_and_notify_registrations'     => array(
352
-                'func'       => 'bulk_action_on_registrations',
353
-                'noheader'   => true,
354
-                'capability' => 'ee_edit_registrations',
355
-                'args' => array('cancel', true)
356
-            ),
357
-            'wait_list_registration' => array(
358
-                'func'       => 'wait_list_registration',
359
-                'noheader'   => true,
360
-                'capability' => 'ee_edit_registration',
361
-                'obj_id'     => $reg_id,
362
-            ),
363
-            'contact_list'                       => array(
364
-                'func'       => '_attendee_contact_list_table',
365
-                'capability' => 'ee_read_contacts',
366
-            ),
367
-            'add_new_attendee'                   => array(
368
-                'func' => '_create_new_cpt_item',
369
-                'args' => array(
370
-                    'new_attendee' => true,
371
-                    'capability'   => 'ee_edit_contacts',
372
-                ),
373
-            ),
374
-            'edit_attendee'                      => array(
375
-                'func'       => '_edit_cpt_item',
376
-                'capability' => 'ee_edit_contacts',
377
-                'obj_id'     => $att_id,
378
-            ),
379
-            'duplicate_attendee'                 => array(
380
-                'func'       => '_duplicate_attendee',
381
-                'noheader'   => true,
382
-                'capability' => 'ee_edit_contacts',
383
-                'obj_id'     => $att_id,
384
-            ),
385
-            'insert_attendee'                    => array(
386
-                'func'       => '_insert_or_update_attendee',
387
-                'args'       => array(
388
-                    'new_attendee' => true,
389
-                ),
390
-                'noheader'   => true,
391
-                'capability' => 'ee_edit_contacts',
392
-            ),
393
-            'update_attendee'                    => array(
394
-                'func'       => '_insert_or_update_attendee',
395
-                'args'       => array(
396
-                    'new_attendee' => false,
397
-                ),
398
-                'noheader'   => true,
399
-                'capability' => 'ee_edit_contacts',
400
-                'obj_id'     => $att_id,
401
-            ),
402
-            'trash_attendees' => array(
403
-                'func' => '_trash_or_restore_attendees',
404
-                'args' => array(
405
-                    'trash' => 'true'
406
-                ),
407
-                'noheader' => true,
408
-                'capability' => 'ee_delete_contacts'
409
-            ),
410
-            'trash_attendee'                    => array(
411
-                'func'       => '_trash_or_restore_attendees',
412
-                'args'       => array(
413
-                    'trash' => true,
414
-                ),
415
-                'noheader'   => true,
416
-                'capability' => 'ee_delete_contacts',
417
-                'obj_id'     => $att_id,
418
-            ),
419
-            'restore_attendees'                  => array(
420
-                'func'       => '_trash_or_restore_attendees',
421
-                'args'       => array(
422
-                    'trash' => false,
423
-                ),
424
-                'noheader'   => true,
425
-                'capability' => 'ee_delete_contacts',
426
-                'obj_id'     => $att_id,
427
-            ),
428
-            'resend_registration'                => array(
429
-                'func'       => '_resend_registration',
430
-                'noheader'   => true,
431
-                'capability' => 'ee_send_message',
432
-            ),
433
-            'registrations_report'               => array(
434
-                'func'       => '_registrations_report',
435
-                'noheader'   => true,
436
-                'capability' => 'ee_read_registrations',
437
-            ),
438
-            'contact_list_export'                => array(
439
-                'func'       => '_contact_list_export',
440
-                'noheader'   => true,
441
-                'capability' => 'export',
442
-            ),
443
-            'contact_list_report'                => array(
444
-                'func'       => '_contact_list_report',
445
-                'noheader'   => true,
446
-                'capability' => 'ee_read_contacts',
447
-            ),
448
-        );
449
-    }
450
-
451
-
452
-    protected function _set_page_config()
453
-    {
454
-        $this->_page_config = array(
455
-            'default'           => array(
456
-                'nav'           => array(
457
-                    'label' => esc_html__('Overview', 'event_espresso'),
458
-                    'order' => 5,
459
-                ),
460
-                'help_tabs'     => array(
461
-                    'registrations_overview_help_tab'                       => array(
462
-                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
463
-                        'filename' => 'registrations_overview',
464
-                    ),
465
-                    'registrations_overview_table_column_headings_help_tab' => array(
466
-                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
467
-                        'filename' => 'registrations_overview_table_column_headings',
468
-                    ),
469
-                    'registrations_overview_filters_help_tab'               => array(
470
-                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
471
-                        'filename' => 'registrations_overview_filters',
472
-                    ),
473
-                    'registrations_overview_views_help_tab'                 => array(
474
-                        'title'    => esc_html__('Registration Views', 'event_espresso'),
475
-                        'filename' => 'registrations_overview_views',
476
-                    ),
477
-                    'registrations_regoverview_other_help_tab'              => array(
478
-                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
479
-                        'filename' => 'registrations_overview_other',
480
-                    ),
481
-                ),
482
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
483
-                'qtips'         => array('Registration_List_Table_Tips'),
484
-                'list_table'    => 'EE_Registrations_List_Table',
485
-                'require_nonce' => false,
486
-            ),
487
-            'view_registration' => array(
488
-                'nav'           => array(
489
-                    'label'      => esc_html__('REG Details', 'event_espresso'),
490
-                    'order'      => 15,
491
-                    'url'        => isset($this->_req_data['_REG_ID'])
492
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
493
-                        : $this->_admin_base_url,
494
-                    'persistent' => false,
495
-                ),
496
-                'help_tabs'     => array(
497
-                    'registrations_details_help_tab'                    => array(
498
-                        'title'    => esc_html__('Registration Details', 'event_espresso'),
499
-                        'filename' => 'registrations_details',
500
-                    ),
501
-                    'registrations_details_table_help_tab'              => array(
502
-                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
503
-                        'filename' => 'registrations_details_table',
504
-                    ),
505
-                    'registrations_details_form_answers_help_tab'       => array(
506
-                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
507
-                        'filename' => 'registrations_details_form_answers',
508
-                    ),
509
-                    'registrations_details_registrant_details_help_tab' => array(
510
-                        'title'    => esc_html__('Contact Details', 'event_espresso'),
511
-                        'filename' => 'registrations_details_registrant_details',
512
-                    ),
513
-                ),
514
-                'help_tour'     => array('Registration_Details_Help_Tour'),
515
-                'metaboxes'     => array_merge(
516
-                    $this->_default_espresso_metaboxes,
517
-                    array('_registration_details_metaboxes')
518
-                ),
519
-                'require_nonce' => false,
520
-            ),
521
-            'new_registration'  => array(
522
-                'nav'           => array(
523
-                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
524
-                    'url'        => '#',
525
-                    'order'      => 15,
526
-                    'persistent' => false,
527
-                ),
528
-                'metaboxes'     => $this->_default_espresso_metaboxes,
529
-                'labels'        => array(
530
-                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
531
-                ),
532
-                'require_nonce' => false,
533
-            ),
534
-            'add_new_attendee'  => array(
535
-                'nav'           => array(
536
-                    'label'      => esc_html__('Add Contact', 'event_espresso'),
537
-                    'order'      => 15,
538
-                    'persistent' => false,
539
-                ),
540
-                'metaboxes'     => array_merge(
541
-                    $this->_default_espresso_metaboxes,
542
-                    array('_publish_post_box', 'attendee_editor_metaboxes')
543
-                ),
544
-                'require_nonce' => false,
545
-            ),
546
-            'edit_attendee'     => array(
547
-                'nav'           => array(
548
-                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
549
-                    'order'      => 15,
550
-                    'persistent' => false,
551
-                    'url'        => isset($this->_req_data['ATT_ID'])
552
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
553
-                        : $this->_admin_base_url,
554
-                ),
555
-                'metaboxes'     => array('attendee_editor_metaboxes'),
556
-                'require_nonce' => false,
557
-            ),
558
-            'contact_list'      => array(
559
-                'nav'           => array(
560
-                    'label' => esc_html__('Contact List', 'event_espresso'),
561
-                    'order' => 20,
562
-                ),
563
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
564
-                'help_tabs'     => array(
565
-                    'registrations_contact_list_help_tab'                       => array(
566
-                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
567
-                        'filename' => 'registrations_contact_list',
568
-                    ),
569
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
570
-                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
571
-                        'filename' => 'registrations_contact_list_table_column_headings',
572
-                    ),
573
-                    'registrations_contact_list_views_help_tab'                 => array(
574
-                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
575
-                        'filename' => 'registrations_contact_list_views',
576
-                    ),
577
-                    'registrations_contact_list_other_help_tab'                 => array(
578
-                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
579
-                        'filename' => 'registrations_contact_list_other',
580
-                    ),
581
-                ),
582
-                'help_tour'     => array('Contact_List_Help_Tour'),
583
-                'metaboxes'     => array(),
584
-                'require_nonce' => false,
585
-            ),
586
-            //override default cpt routes
587
-            'create_new'        => '',
588
-            'edit'              => '',
589
-        );
590
-    }
591
-
592
-
593
-    /**
594
-     * The below methods aren't used by this class currently
595
-     */
596
-    protected function _add_screen_options()
597
-    {
598
-    }
599
-
600
-
601
-    protected function _add_feature_pointers()
602
-    {
603
-    }
604
-
605
-
606
-    public function admin_init()
607
-    {
608
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
609
-            'click "Update Registration Questions" to save your changes',
610
-            'event_espresso'
611
-        );
612
-    }
613
-
614
-
615
-    public function admin_notices()
616
-    {
617
-    }
618
-
619
-
620
-    public function admin_footer_scripts()
621
-    {
622
-    }
623
-
624
-
625
-    /**
626
-     *        get list of registration statuses
627
-     *
628
-     * @access private
629
-     * @return void
630
-     */
631
-    private function _get_registration_status_array()
632
-    {
633
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
634
-    }
635
-
636
-
637
-    protected function _add_screen_options_default()
638
-    {
639
-        $this->_per_page_screen_option();
640
-    }
641
-
642
-
643
-    protected function _add_screen_options_contact_list()
644
-    {
645
-        $page_title              = $this->_admin_page_title;
646
-        $this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
647
-        $this->_per_page_screen_option();
648
-        $this->_admin_page_title = $page_title;
649
-    }
650
-
651
-
652
-    public function load_scripts_styles()
653
-    {
654
-        //style
655
-        wp_register_style(
656
-            'espresso_reg',
657
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
658
-            array('ee-admin-css'),
659
-            EVENT_ESPRESSO_VERSION
660
-        );
661
-        wp_enqueue_style('espresso_reg');
662
-        //script
663
-        wp_register_script(
664
-            'espresso_reg',
665
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
666
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
667
-            EVENT_ESPRESSO_VERSION,
668
-            true
669
-        );
670
-        wp_enqueue_script('espresso_reg');
671
-    }
672
-
673
-
674
-    public function load_scripts_styles_edit_attendee()
675
-    {
676
-        //stuff to only show up on our attendee edit details page.
677
-        $attendee_details_translations = array(
678
-            'att_publish_text' => sprintf(
679
-                esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
680
-                $this->_cpt_model_obj->get_datetime('ATT_created')
681
-            ),
682
-        );
683
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
684
-        wp_enqueue_script('jquery-validate');
685
-    }
686
-
687
-
688
-    public function load_scripts_styles_view_registration()
689
-    {
690
-        //styles
691
-        wp_enqueue_style('espresso-ui-theme');
692
-        //scripts
693
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
694
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
695
-    }
696
-
697
-
698
-    public function load_scripts_styles_contact_list()
699
-    {
700
-        wp_deregister_style('espresso_reg');
701
-        wp_register_style(
702
-            'espresso_att',
703
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
704
-            array('ee-admin-css'),
705
-            EVENT_ESPRESSO_VERSION
706
-        );
707
-        wp_enqueue_style('espresso_att');
708
-    }
709
-
710
-
711
-    public function load_scripts_styles_new_registration()
712
-    {
713
-        wp_register_script(
714
-            'ee-spco-for-admin',
715
-            REG_ASSETS_URL . 'spco_for_admin.js',
716
-            array('underscore', 'jquery'),
717
-            EVENT_ESPRESSO_VERSION,
718
-            true
719
-        );
720
-        wp_enqueue_script('ee-spco-for-admin');
721
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
722
-        EE_Form_Section_Proper::wp_enqueue_scripts();
723
-        EED_Ticket_Selector::load_tckt_slctr_assets();
724
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
725
-    }
726
-
727
-
728
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
729
-    {
730
-        add_filter('FHEE_load_EE_messages', '__return_true');
731
-    }
732
-
733
-
734
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
735
-    {
736
-        add_filter('FHEE_load_EE_messages', '__return_true');
737
-    }
738
-
739
-
740
-    protected function _set_list_table_views_default()
741
-    {
742
-        //for notification related bulk actions we need to make sure only active messengers have an option.
743
-        EED_Messages::set_autoloaders();
744
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
745
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
746
-        $active_mts               = $message_resource_manager->list_of_active_message_types();
747
-        //key= bulk_action_slug, value= message type.
748
-        $match_array = array(
749
-            'approve_registrations'    => 'registration',
750
-            'decline_registrations'    => 'declined_registration',
751
-            'pending_registrations'    => 'pending_approval',
752
-            'no_approve_registrations' => 'not_approved_registration',
753
-            'cancel_registrations'     => 'cancelled_registration',
754
-        );
755
-        $can_send = EE_Registry::instance()->CAP->current_user_can(
756
-            'ee_send_message',
757
-            'batch_send_messages'
758
-        );
759
-        /** setup reg status bulk actions **/
760
-        $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
761
-        if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
762
-                $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
763
-                    'Approve and Notify Registrations',
764
-                    'event_espresso'
765
-                );
766
-        }
767
-        $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
768
-        if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
769
-                $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
770
-                    'Decline and Notify Registrations',
771
-                    'event_espresso'
772
-                );
773
-        }
774
-        $def_reg_status_actions['pending_registrations'] = esc_html__(
775
-            'Set Registrations to Pending Payment',
776
-            'event_espresso'
777
-        );
778
-        if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
779
-                $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
780
-                    'Set Registrations to Pending Payment and Notify',
781
-                    'event_espresso'
782
-                );
783
-        }
784
-        $def_reg_status_actions['no_approve_registrations'] = esc_html__(
785
-            'Set Registrations to Not Approved',
786
-            'event_espresso'
787
-        );
788
-        if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
789
-                $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
790
-                    'Set Registrations to Not Approved and Notify',
791
-                    'event_espresso'
792
-                );
793
-        }
794
-        $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
795
-        if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
796
-                $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
797
-                    'Cancel Registrations and Notify',
798
-                    'event_espresso'
799
-                );
800
-        }
801
-        $def_reg_status_actions = apply_filters(
802
-            'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
803
-            $def_reg_status_actions,
804
-            $active_mts
805
-        );
806
-
807
-        $this->_views = array(
808
-            'all'   => array(
809
-                'slug'        => 'all',
810
-                'label'       => esc_html__('View All Registrations', 'event_espresso'),
811
-                'count'       => 0,
812
-                'bulk_action' => array_merge($def_reg_status_actions, array(
813
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
814
-                )),
815
-            ),
816
-            'month' => array(
817
-                'slug'        => 'month',
818
-                'label'       => esc_html__('This Month', 'event_espresso'),
819
-                'count'       => 0,
820
-                'bulk_action' => array_merge($def_reg_status_actions, array(
821
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
822
-                )),
823
-            ),
824
-            'today' => array(
825
-                'slug'        => 'today',
826
-                'label'       => sprintf(
827
-                    esc_html__('Today - %s', 'event_espresso'),
828
-                    date('M d, Y', current_time('timestamp'))
829
-                ),
830
-                'count'       => 0,
831
-                'bulk_action' => array_merge($def_reg_status_actions, array(
832
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
833
-                )),
834
-            ),
835
-        );
836
-        if (EE_Registry::instance()->CAP->current_user_can(
837
-            'ee_delete_registrations',
838
-            'espresso_registrations_delete_registration'
839
-        )) {
840
-            $this->_views['incomplete'] = array(
841
-                'slug'        => 'incomplete',
842
-                'label'       => esc_html__('Incomplete', 'event_espresso'),
843
-                'count'       => 0,
844
-                'bulk_action' => array(
845
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
846
-                ),
847
-            );
848
-            $this->_views['trash']      = array(
849
-                'slug'        => 'trash',
850
-                'label'       => esc_html__('Trash', 'event_espresso'),
851
-                'count'       => 0,
852
-                'bulk_action' => array(
853
-                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
854
-                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
855
-                ),
856
-            );
857
-        }
858
-    }
859
-
860
-
861
-    protected function _set_list_table_views_contact_list()
862
-    {
863
-        $this->_views = array(
864
-            'in_use' => array(
865
-                'slug'        => 'in_use',
866
-                'label'       => esc_html__('In Use', 'event_espresso'),
867
-                'count'       => 0,
868
-                'bulk_action' => array(
869
-                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
870
-                ),
871
-            ),
872
-        );
873
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
874
-            'espresso_registrations_trash_attendees')
875
-        ) {
876
-            $this->_views['trash'] = array(
877
-                'slug'        => 'trash',
878
-                'label'       => esc_html__('Trash', 'event_espresso'),
879
-                'count'       => 0,
880
-                'bulk_action' => array(
881
-                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
882
-                ),
883
-            );
884
-        }
885
-    }
886
-
887
-
888
-    protected function _registration_legend_items()
889
-    {
890
-        $fc_items = array(
891
-            'star-icon'        => array(
892
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
893
-                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
894
-            ),
895
-            'view_details'     => array(
896
-                'class' => 'dashicons dashicons-clipboard',
897
-                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
898
-            ),
899
-            'edit_attendee'    => array(
900
-                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
901
-                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
902
-            ),
903
-            'view_transaction' => array(
904
-                'class' => 'dashicons dashicons-cart',
905
-                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
906
-            ),
907
-            'view_invoice'     => array(
908
-                'class' => 'dashicons dashicons-media-spreadsheet',
909
-                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
910
-            ),
911
-        );
912
-        if (EE_Registry::instance()->CAP->current_user_can(
913
-            'ee_send_message',
914
-            'espresso_registrations_resend_registration'
915
-        )) {
916
-            $fc_items['resend_registration'] = array(
917
-                'class' => 'dashicons dashicons-email-alt',
918
-                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
919
-            );
920
-        } else {
921
-            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
922
-        }
923
-        if (EE_Registry::instance()->CAP->current_user_can(
924
-            'ee_read_global_messages',
925
-            'view_filtered_messages'
926
-        )) {
927
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
928
-            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
929
-                $fc_items['view_related_messages'] = array(
930
-                    'class' => $related_for_icon['css_class'],
931
-                    'desc'  => $related_for_icon['label'],
932
-                );
933
-            }
934
-        }
935
-        $sc_items = array(
936
-            'approved_status'   => array(
937
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
938
-                'desc'  => EEH_Template::pretty_status(
939
-                    EEM_Registration::status_id_approved,
940
-                    false,
941
-                    'sentence'
942
-                ),
943
-            ),
944
-            'pending_status'    => array(
945
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
946
-                'desc'  => EEH_Template::pretty_status(
947
-                    EEM_Registration::status_id_pending_payment,
948
-                    false,
949
-                    'sentence'
950
-                ),
951
-            ),
952
-            'wait_list'         => array(
953
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
954
-                'desc'  => EEH_Template::pretty_status(
955
-                    EEM_Registration::status_id_wait_list,
956
-                    false,
957
-                    'sentence'
958
-                ),
959
-            ),
960
-            'incomplete_status' => array(
961
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
962
-                'desc'  => EEH_Template::pretty_status(
963
-                    EEM_Registration::status_id_incomplete,
964
-                    false,
965
-                    'sentence'
966
-                ),
967
-            ),
968
-            'not_approved'      => array(
969
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
970
-                'desc'  => EEH_Template::pretty_status(
971
-                    EEM_Registration::status_id_not_approved,
972
-                    false,
973
-                    'sentence'
974
-                ),
975
-            ),
976
-            'declined_status'   => array(
977
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
978
-                'desc'  => EEH_Template::pretty_status(
979
-                    EEM_Registration::status_id_declined,
980
-                    false,
981
-                    'sentence'
982
-                ),
983
-            ),
984
-            'cancelled_status'  => array(
985
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
986
-                'desc'  => EEH_Template::pretty_status(
987
-                    EEM_Registration::status_id_cancelled,
988
-                    false,
989
-                    'sentence'
990
-                ),
991
-            ),
992
-        );
993
-        return array_merge($fc_items, $sc_items);
994
-    }
995
-
996
-
997
-
998
-    /***************************************        REGISTRATION OVERVIEW        **************************************/
999
-    /**
1000
-     * @throws \EE_Error
1001
-     */
1002
-    protected function _registrations_overview_list_table()
1003
-    {
1004
-        $this->_template_args['admin_page_header'] = '';
1005
-        $EVT_ID                                    = ! empty($this->_req_data['event_id'])
1006
-            ? absint($this->_req_data['event_id'])
1007
-            : 0;
1008
-        if ($EVT_ID) {
1009
-            if (EE_Registry::instance()->CAP->current_user_can(
1010
-                'ee_edit_registrations',
1011
-                'espresso_registrations_new_registration',
1012
-                $EVT_ID
1013
-            )) {
1014
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1015
-                    'new_registration',
1016
-                    'add-registrant',
1017
-                    array('event_id' => $EVT_ID),
1018
-                    'add-new-h2'
1019
-                );
1020
-            }
1021
-            $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
1022
-            if ($event instanceof EE_Event) {
1023
-                $this->_template_args['admin_page_header'] = sprintf(
1024
-                    esc_html__(
1025
-                        '%s Viewing registrations for the event: %s%s',
1026
-                        'event_espresso'
1027
-                    ),
1028
-                    '<h3 style="line-height:1.5em;">',
1029
-                    '<br /><a href="'
1030
-                        . EE_Admin_Page::add_query_args_and_nonce(
1031
-                            array(
1032
-                                'action' => 'edit',
1033
-                                'post'   => $event->ID(),
1034
-                            ),
1035
-                            EVENTS_ADMIN_URL
1036
-                        )
1037
-                        . '">&nbsp;'
1038
-                        . $event->get('EVT_name')
1039
-                        . '&nbsp;</a>&nbsp;',
1040
-                    '</h3>'
1041
-                );
1042
-            }
1043
-            $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
1044
-            $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1045
-            if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
1046
-                $this->_template_args['admin_page_header'] = substr(
1047
-                    $this->_template_args['admin_page_header'],
1048
-                    0,
1049
-                    -5
1050
-                );
1051
-                $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1052
-                $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1053
-                $this->_template_args['admin_page_header'] .= $datetime->name();
1054
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1055
-                $this->_template_args['admin_page_header'] .= '</span></h3>';
1056
-            }
1057
-        }
1058
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1059
-        $this->display_admin_list_table_page_with_no_sidebar();
1060
-    }
1061
-
1062
-
1063
-    /**
1064
-     * This sets the _registration property for the registration details screen
1065
-     *
1066
-     * @access private
1067
-     * @return bool
1068
-     */
1069
-    private function _set_registration_object()
1070
-    {
1071
-        //get out if we've already set the object
1072
-        if (is_object($this->_registration)) {
1073
-            return true;
1074
-        }
1075
-        $REG    = EEM_Registration::instance();
1076
-        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1077
-        if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1078
-            return true;
1079
-        } else {
1080
-            $error_msg = sprintf(
1081
-                esc_html__(
1082
-                    'An error occurred and the details for Registration ID #%s could not be retrieved.',
1083
-                    'event_espresso'
1084
-                ),
1085
-                $REG_ID
1086
-            );
1087
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1088
-            $this->_registration = null;
1089
-            return false;
1090
-        }
1091
-    }
1092
-
1093
-
1094
-    /**
1095
-     * Used to retrieve registrations for the list table.
1096
-     *
1097
-     * @param int  $per_page
1098
-     * @param bool $count
1099
-     * @param bool $this_month
1100
-     * @param bool $today
1101
-     * @return EE_Registration[]|int
1102
-     * @throws EE_Error
1103
-     */
1104
-    public function get_registrations(
1105
-        $per_page = 10,
1106
-        $count = false,
1107
-        $this_month = false,
1108
-        $today = false
1109
-    ) {
1110
-        if ($this_month) {
1111
-            $this->_req_data['status'] = 'month';
1112
-        }
1113
-        if ($today) {
1114
-            $this->_req_data['status'] = 'today';
1115
-        }
1116
-        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1117
-        /**
1118
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1119
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1120
-         * @see EEM_Base::get_all()
1121
-         */
1122
-        $query_params['group_by'] = '';
1123
-
1124
-        return $count
1125
-            ? EEM_Registration::instance()->count($query_params)
1126
-            /** @type EE_Registration[] */
1127
-            : EEM_Registration::instance()->get_all($query_params);
1128
-    }
1129
-
1130
-
1131
-
1132
-    /**
1133
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1134
-     * Note: this listens to values on the request for some of the query parameters.
1135
-     *
1136
-     * @param array $request
1137
-     * @param int    $per_page
1138
-     * @param bool   $count
1139
-     * @return array
1140
-     */
1141
-    protected function _get_registration_query_parameters(
1142
-        $request = array(),
1143
-        $per_page = 10,
1144
-        $count = false
1145
-    ) {
1146
-
1147
-        $query_params = array(
1148
-            0                          => $this->_get_where_conditions_for_registrations_query(
1149
-                $request
1150
-            ),
1151
-            'caps'                     => EEM_Registration::caps_read_admin,
1152
-            'default_where_conditions' => 'this_model_only',
1153
-        );
1154
-        if (! $count) {
1155
-            $query_params = array_merge(
1156
-                $query_params,
1157
-                $this->_get_orderby_for_registrations_query(),
1158
-                $this->_get_limit($per_page)
1159
-            );
1160
-        }
1161
-
1162
-        return $query_params;
1163
-    }
1164
-
1165
-
1166
-    /**
1167
-     * This will add EVT_ID to the provided $where array for EE model query parameters.
1168
-     *
1169
-     * @param array $request usually the same as $this->_req_data but not necessarily
1170
-     * @return array
1171
-     */
1172
-    protected function _add_event_id_to_where_conditions(array $request)
1173
-    {
1174
-        $where = array();
1175
-        if (! empty($request['event_id'])) {
1176
-            $where['EVT_ID'] = absint($request['event_id']);
1177
-        }
1178
-        return $where;
1179
-    }
1180
-
1181
-
1182
-    /**
1183
-     * Adds category ID if it exists in the request to the where conditions for the registrations query.
1184
-     *
1185
-     * @param array $request usually the same as $this->_req_data but not necessarily
1186
-     * @return array
1187
-     */
1188
-    protected function _add_category_id_to_where_conditions(array $request)
1189
-    {
1190
-        $where = array();
1191
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1192
-            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1193
-        }
1194
-        return $where;
1195
-    }
1196
-
1197
-
1198
-    /**
1199
-     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1200
-     *
1201
-     * @param array $request usually the same as $this->_req_data but not necessarily
1202
-     * @return array
1203
-     */
1204
-    protected function _add_datetime_id_to_where_conditions(array $request)
1205
-    {
1206
-        $where = array();
1207
-        if (! empty($request['datetime_id'])) {
1208
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1209
-        }
1210
-        if (! empty($request['DTT_ID'])) {
1211
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1212
-        }
1213
-        return $where;
1214
-    }
1215
-
1216
-
1217
-    /**
1218
-     * Adds the correct registration status to the where conditions for the registrations query.
1219
-     *
1220
-     * @param array $request usually the same as $this->_req_data but not necessarily
1221
-     * @return array
1222
-     */
1223
-    protected function _add_registration_status_to_where_conditions(array $request)
1224
-    {
1225
-        $where = array();
1226
-        $view = EEH_Array::is_set($request, 'status', '');
1227
-        $registration_status = ! empty($request['_reg_status'])
1228
-            ? sanitize_text_field($request['_reg_status'])
1229
-            : '';
1230
-
1231
-        /*
26
+	/**
27
+	 * @var EE_Registration
28
+	 */
29
+	private $_registration;
30
+
31
+	/**
32
+	 * @var EE_Event
33
+	 */
34
+	private $_reg_event;
35
+
36
+	/**
37
+	 * @var EE_Session
38
+	 */
39
+	private $_session;
40
+
41
+	private static $_reg_status;
42
+
43
+	/**
44
+	 * Form for displaying the custom questions for this registration.
45
+	 * This gets used a few times throughout the request so its best to cache it
46
+	 *
47
+	 * @var EE_Registration_Custom_Questions_Form
48
+	 */
49
+	protected $_reg_custom_questions_form = null;
50
+
51
+
52
+	/**
53
+	 *        constructor
54
+	 *
55
+	 * @Constructor
56
+	 * @access public
57
+	 * @param bool $routing
58
+	 * @return Registrations_Admin_Page
59
+	 */
60
+	public function __construct($routing = true)
61
+	{
62
+		parent::__construct($routing);
63
+		add_action('wp_loaded', array($this, 'wp_loaded'));
64
+	}
65
+
66
+
67
+	public function wp_loaded()
68
+	{
69
+		// when adding a new registration...
70
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
+			EE_System::do_not_cache();
72
+			if (! isset($this->_req_data['processing_registration'])
73
+				 || absint($this->_req_data['processing_registration']) !== 1
74
+			) {
75
+				// and it's NOT the attendee information reg step
76
+				// force cookie expiration by setting time to last week
77
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
+				// and update the global
79
+				$_COOKIE['ee_registration_added'] = 0;
80
+			}
81
+		}
82
+	}
83
+
84
+
85
+	protected function _init_page_props()
86
+	{
87
+		$this->page_slug        = REG_PG_SLUG;
88
+		$this->_admin_base_url  = REG_ADMIN_URL;
89
+		$this->_admin_base_path = REG_ADMIN;
90
+		$this->page_label       = esc_html__('Registrations', 'event_espresso');
91
+		$this->_cpt_routes      = array(
92
+			'add_new_attendee' => 'espresso_attendees',
93
+			'edit_attendee'    => 'espresso_attendees',
94
+			'insert_attendee'  => 'espresso_attendees',
95
+			'update_attendee'  => 'espresso_attendees',
96
+		);
97
+		$this->_cpt_model_names = array(
98
+			'add_new_attendee' => 'EEM_Attendee',
99
+			'edit_attendee'    => 'EEM_Attendee',
100
+		);
101
+		$this->_cpt_edit_routes = array(
102
+			'espresso_attendees' => 'edit_attendee',
103
+		);
104
+		$this->_pagenow_map     = array(
105
+			'add_new_attendee' => 'post-new.php',
106
+			'edit_attendee'    => 'post.php',
107
+			'trash'            => 'post.php',
108
+		);
109
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
+		//add filters so that the comment urls don't take users to a confusing 404 page
111
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
+	}
113
+
114
+
115
+	public function clear_comment_link($link, $comment, $args)
116
+	{
117
+		//gotta make sure this only happens on this route
118
+		$post_type = get_post_type($comment->comment_post_ID);
119
+		if ($post_type === 'espresso_attendees') {
120
+			return '#commentsdiv';
121
+		}
122
+		return $link;
123
+	}
124
+
125
+
126
+	protected function _ajax_hooks()
127
+	{
128
+		//todo: all hooks for registrations ajax goes in here
129
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
+	}
131
+
132
+
133
+	protected function _define_page_props()
134
+	{
135
+		$this->_admin_page_title = $this->page_label;
136
+		$this->_labels           = array(
137
+			'buttons'                      => array(
138
+				'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
139
+				'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
140
+				'edit'                => esc_html__('Edit Contact', 'event_espresso'),
141
+				'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
142
+				'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
143
+				'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
144
+				'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
145
+				'contact_list_export' => esc_html__("Export Data", "event_espresso"),
146
+			),
147
+			'publishbox'                   => array(
148
+				'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
149
+				'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
150
+			),
151
+			'hide_add_button_on_cpt_route' => array(
152
+				'edit_attendee' => true,
153
+			),
154
+		);
155
+	}
156
+
157
+
158
+	/**
159
+	 *        grab url requests and route them
160
+	 *
161
+	 * @access private
162
+	 * @return void
163
+	 */
164
+	public function _set_page_routes()
165
+	{
166
+		$this->_get_registration_status_array();
167
+		$reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
+			? $this->_req_data['_REG_ID'] : 0;
169
+		$reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID'])
170
+			? $this->_req_data['reg_status_change_form']['REG_ID']
171
+			: $reg_id;
172
+		$att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
173
+			? $this->_req_data['ATT_ID'] : 0;
174
+		$att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
175
+			? $this->_req_data['post']
176
+			: $att_id;
177
+		$this->_page_routes = array(
178
+			'default'                            => array(
179
+				'func'       => '_registrations_overview_list_table',
180
+				'capability' => 'ee_read_registrations',
181
+			),
182
+			'view_registration'                  => array(
183
+				'func'       => '_registration_details',
184
+				'capability' => 'ee_read_registration',
185
+				'obj_id'     => $reg_id,
186
+			),
187
+			'edit_registration'                  => array(
188
+				'func'               => '_update_attendee_registration_form',
189
+				'noheader'           => true,
190
+				'headers_sent_route' => 'view_registration',
191
+				'capability'         => 'ee_edit_registration',
192
+				'obj_id'             => $reg_id,
193
+				'_REG_ID'            => $reg_id,
194
+			),
195
+			'trash_registrations'                => array(
196
+				'func'       => '_trash_or_restore_registrations',
197
+				'args'       => array('trash' => true),
198
+				'noheader'   => true,
199
+				'capability' => 'ee_delete_registrations',
200
+			),
201
+			'restore_registrations'              => array(
202
+				'func'       => '_trash_or_restore_registrations',
203
+				'args'       => array('trash' => false),
204
+				'noheader'   => true,
205
+				'capability' => 'ee_delete_registrations',
206
+			),
207
+			'delete_registrations'               => array(
208
+				'func'       => '_delete_registrations',
209
+				'noheader'   => true,
210
+				'capability' => 'ee_delete_registrations',
211
+			),
212
+			'new_registration'                   => array(
213
+				'func'       => 'new_registration',
214
+				'capability' => 'ee_edit_registrations',
215
+			),
216
+			'process_reg_step'                   => array(
217
+				'func'       => 'process_reg_step',
218
+				'noheader'   => true,
219
+				'capability' => 'ee_edit_registrations',
220
+			),
221
+			'redirect_to_txn'                    => array(
222
+				'func'       => 'redirect_to_txn',
223
+				'noheader'   => true,
224
+				'capability' => 'ee_edit_registrations',
225
+			),
226
+			'change_reg_status'                  => array(
227
+				'func'       => '_change_reg_status',
228
+				'noheader'   => true,
229
+				'capability' => 'ee_edit_registration',
230
+				'obj_id'     => $reg_id,
231
+			),
232
+			'approve_registration'               => array(
233
+				'func'       => 'approve_registration',
234
+				'noheader'   => true,
235
+				'capability' => 'ee_edit_registration',
236
+				'obj_id'     => $reg_id,
237
+			),
238
+			'approve_and_notify_registration'    => array(
239
+				'func'       => 'approve_registration',
240
+				'noheader'   => true,
241
+				'args'       => array(true),
242
+				'capability' => 'ee_edit_registration',
243
+				'obj_id'     => $reg_id,
244
+			),
245
+			'approve_registrations'               => array(
246
+				'func'       => 'bulk_action_on_registrations',
247
+				'noheader'   => true,
248
+				'capability' => 'ee_edit_registrations',
249
+				'args' => array('approve')
250
+			),
251
+			'approve_and_notify_registrations'               => array(
252
+				'func'       => 'bulk_action_on_registrations',
253
+				'noheader'   => true,
254
+				'capability' => 'ee_edit_registrations',
255
+				'args' => array('approve', true)
256
+			),
257
+			'decline_registration'               => array(
258
+				'func'       => 'decline_registration',
259
+				'noheader'   => true,
260
+				'capability' => 'ee_edit_registration',
261
+				'obj_id'     => $reg_id,
262
+			),
263
+			'decline_and_notify_registration'    => array(
264
+				'func'       => 'decline_registration',
265
+				'noheader'   => true,
266
+				'args'       => array(true),
267
+				'capability' => 'ee_edit_registration',
268
+				'obj_id'     => $reg_id,
269
+			),
270
+			'decline_registrations'               => array(
271
+				'func'       => 'bulk_action_on_registrations',
272
+				'noheader'   => true,
273
+				'capability' => 'ee_edit_registrations',
274
+				'args' => array('decline')
275
+			),
276
+			'decline_and_notify_registrations'    => array(
277
+				'func'       => 'bulk_action_on_registrations',
278
+				'noheader'   => true,
279
+				'capability' => 'ee_edit_registrations',
280
+				'args' => array('decline', true)
281
+			),
282
+			'pending_registration'               => array(
283
+				'func'       => 'pending_registration',
284
+				'noheader'   => true,
285
+				'capability' => 'ee_edit_registration',
286
+				'obj_id'     => $reg_id,
287
+			),
288
+			'pending_and_notify_registration'    => array(
289
+				'func'       => 'pending_registration',
290
+				'noheader'   => true,
291
+				'args'       => array(true),
292
+				'capability' => 'ee_edit_registration',
293
+				'obj_id'     => $reg_id,
294
+			),
295
+			'pending_registrations'               => array(
296
+				'func'       => 'bulk_action_on_registrations',
297
+				'noheader'   => true,
298
+				'capability' => 'ee_edit_registrations',
299
+				'args' => array('pending')
300
+			),
301
+			'pending_and_notify_registrations'    => array(
302
+				'func'       => 'bulk_action_on_registrations',
303
+				'noheader'   => true,
304
+				'capability' => 'ee_edit_registrations',
305
+				'args' => array('pending', true)
306
+			),
307
+			'no_approve_registration'            => array(
308
+				'func'       => 'not_approve_registration',
309
+				'noheader'   => true,
310
+				'capability' => 'ee_edit_registration',
311
+				'obj_id'     => $reg_id,
312
+			),
313
+			'no_approve_and_notify_registration' => array(
314
+				'func'       => 'not_approve_registration',
315
+				'noheader'   => true,
316
+				'args'       => array(true),
317
+				'capability' => 'ee_edit_registration',
318
+				'obj_id'     => $reg_id,
319
+			),
320
+			'no_approve_registrations'            => array(
321
+				'func'       => 'bulk_action_on_registrations',
322
+				'noheader'   => true,
323
+				'capability' => 'ee_edit_registrations',
324
+				'args' => array('no_approve')
325
+			),
326
+			'no_approve_and_notify_registrations' => array(
327
+				'func'       => 'bulk_action_on_registrations',
328
+				'noheader'   => true,
329
+				'capability' => 'ee_edit_registrations',
330
+				'args' => array('no_approve', true)
331
+			),
332
+			'cancel_registration'                => array(
333
+				'func'       => 'cancel_registration',
334
+				'noheader'   => true,
335
+				'capability' => 'ee_edit_registration',
336
+				'obj_id'     => $reg_id,
337
+			),
338
+			'cancel_and_notify_registration'     => array(
339
+				'func'       => 'cancel_registration',
340
+				'noheader'   => true,
341
+				'args'       => array(true),
342
+				'capability' => 'ee_edit_registration',
343
+				'obj_id'     => $reg_id,
344
+			),
345
+			'cancel_registrations'                => array(
346
+				'func'       => 'bulk_action_on_registrations',
347
+				'noheader'   => true,
348
+				'capability' => 'ee_edit_registrations',
349
+				'args' => array('cancel')
350
+			),
351
+			'cancel_and_notify_registrations'     => array(
352
+				'func'       => 'bulk_action_on_registrations',
353
+				'noheader'   => true,
354
+				'capability' => 'ee_edit_registrations',
355
+				'args' => array('cancel', true)
356
+			),
357
+			'wait_list_registration' => array(
358
+				'func'       => 'wait_list_registration',
359
+				'noheader'   => true,
360
+				'capability' => 'ee_edit_registration',
361
+				'obj_id'     => $reg_id,
362
+			),
363
+			'contact_list'                       => array(
364
+				'func'       => '_attendee_contact_list_table',
365
+				'capability' => 'ee_read_contacts',
366
+			),
367
+			'add_new_attendee'                   => array(
368
+				'func' => '_create_new_cpt_item',
369
+				'args' => array(
370
+					'new_attendee' => true,
371
+					'capability'   => 'ee_edit_contacts',
372
+				),
373
+			),
374
+			'edit_attendee'                      => array(
375
+				'func'       => '_edit_cpt_item',
376
+				'capability' => 'ee_edit_contacts',
377
+				'obj_id'     => $att_id,
378
+			),
379
+			'duplicate_attendee'                 => array(
380
+				'func'       => '_duplicate_attendee',
381
+				'noheader'   => true,
382
+				'capability' => 'ee_edit_contacts',
383
+				'obj_id'     => $att_id,
384
+			),
385
+			'insert_attendee'                    => array(
386
+				'func'       => '_insert_or_update_attendee',
387
+				'args'       => array(
388
+					'new_attendee' => true,
389
+				),
390
+				'noheader'   => true,
391
+				'capability' => 'ee_edit_contacts',
392
+			),
393
+			'update_attendee'                    => array(
394
+				'func'       => '_insert_or_update_attendee',
395
+				'args'       => array(
396
+					'new_attendee' => false,
397
+				),
398
+				'noheader'   => true,
399
+				'capability' => 'ee_edit_contacts',
400
+				'obj_id'     => $att_id,
401
+			),
402
+			'trash_attendees' => array(
403
+				'func' => '_trash_or_restore_attendees',
404
+				'args' => array(
405
+					'trash' => 'true'
406
+				),
407
+				'noheader' => true,
408
+				'capability' => 'ee_delete_contacts'
409
+			),
410
+			'trash_attendee'                    => array(
411
+				'func'       => '_trash_or_restore_attendees',
412
+				'args'       => array(
413
+					'trash' => true,
414
+				),
415
+				'noheader'   => true,
416
+				'capability' => 'ee_delete_contacts',
417
+				'obj_id'     => $att_id,
418
+			),
419
+			'restore_attendees'                  => array(
420
+				'func'       => '_trash_or_restore_attendees',
421
+				'args'       => array(
422
+					'trash' => false,
423
+				),
424
+				'noheader'   => true,
425
+				'capability' => 'ee_delete_contacts',
426
+				'obj_id'     => $att_id,
427
+			),
428
+			'resend_registration'                => array(
429
+				'func'       => '_resend_registration',
430
+				'noheader'   => true,
431
+				'capability' => 'ee_send_message',
432
+			),
433
+			'registrations_report'               => array(
434
+				'func'       => '_registrations_report',
435
+				'noheader'   => true,
436
+				'capability' => 'ee_read_registrations',
437
+			),
438
+			'contact_list_export'                => array(
439
+				'func'       => '_contact_list_export',
440
+				'noheader'   => true,
441
+				'capability' => 'export',
442
+			),
443
+			'contact_list_report'                => array(
444
+				'func'       => '_contact_list_report',
445
+				'noheader'   => true,
446
+				'capability' => 'ee_read_contacts',
447
+			),
448
+		);
449
+	}
450
+
451
+
452
+	protected function _set_page_config()
453
+	{
454
+		$this->_page_config = array(
455
+			'default'           => array(
456
+				'nav'           => array(
457
+					'label' => esc_html__('Overview', 'event_espresso'),
458
+					'order' => 5,
459
+				),
460
+				'help_tabs'     => array(
461
+					'registrations_overview_help_tab'                       => array(
462
+						'title'    => esc_html__('Registrations Overview', 'event_espresso'),
463
+						'filename' => 'registrations_overview',
464
+					),
465
+					'registrations_overview_table_column_headings_help_tab' => array(
466
+						'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
467
+						'filename' => 'registrations_overview_table_column_headings',
468
+					),
469
+					'registrations_overview_filters_help_tab'               => array(
470
+						'title'    => esc_html__('Registration Filters', 'event_espresso'),
471
+						'filename' => 'registrations_overview_filters',
472
+					),
473
+					'registrations_overview_views_help_tab'                 => array(
474
+						'title'    => esc_html__('Registration Views', 'event_espresso'),
475
+						'filename' => 'registrations_overview_views',
476
+					),
477
+					'registrations_regoverview_other_help_tab'              => array(
478
+						'title'    => esc_html__('Registrations Other', 'event_espresso'),
479
+						'filename' => 'registrations_overview_other',
480
+					),
481
+				),
482
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
483
+				'qtips'         => array('Registration_List_Table_Tips'),
484
+				'list_table'    => 'EE_Registrations_List_Table',
485
+				'require_nonce' => false,
486
+			),
487
+			'view_registration' => array(
488
+				'nav'           => array(
489
+					'label'      => esc_html__('REG Details', 'event_espresso'),
490
+					'order'      => 15,
491
+					'url'        => isset($this->_req_data['_REG_ID'])
492
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
493
+						: $this->_admin_base_url,
494
+					'persistent' => false,
495
+				),
496
+				'help_tabs'     => array(
497
+					'registrations_details_help_tab'                    => array(
498
+						'title'    => esc_html__('Registration Details', 'event_espresso'),
499
+						'filename' => 'registrations_details',
500
+					),
501
+					'registrations_details_table_help_tab'              => array(
502
+						'title'    => esc_html__('Registration Details Table', 'event_espresso'),
503
+						'filename' => 'registrations_details_table',
504
+					),
505
+					'registrations_details_form_answers_help_tab'       => array(
506
+						'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
507
+						'filename' => 'registrations_details_form_answers',
508
+					),
509
+					'registrations_details_registrant_details_help_tab' => array(
510
+						'title'    => esc_html__('Contact Details', 'event_espresso'),
511
+						'filename' => 'registrations_details_registrant_details',
512
+					),
513
+				),
514
+				'help_tour'     => array('Registration_Details_Help_Tour'),
515
+				'metaboxes'     => array_merge(
516
+					$this->_default_espresso_metaboxes,
517
+					array('_registration_details_metaboxes')
518
+				),
519
+				'require_nonce' => false,
520
+			),
521
+			'new_registration'  => array(
522
+				'nav'           => array(
523
+					'label'      => esc_html__('Add New Registration', 'event_espresso'),
524
+					'url'        => '#',
525
+					'order'      => 15,
526
+					'persistent' => false,
527
+				),
528
+				'metaboxes'     => $this->_default_espresso_metaboxes,
529
+				'labels'        => array(
530
+					'publishbox' => esc_html__('Save Registration', 'event_espresso'),
531
+				),
532
+				'require_nonce' => false,
533
+			),
534
+			'add_new_attendee'  => array(
535
+				'nav'           => array(
536
+					'label'      => esc_html__('Add Contact', 'event_espresso'),
537
+					'order'      => 15,
538
+					'persistent' => false,
539
+				),
540
+				'metaboxes'     => array_merge(
541
+					$this->_default_espresso_metaboxes,
542
+					array('_publish_post_box', 'attendee_editor_metaboxes')
543
+				),
544
+				'require_nonce' => false,
545
+			),
546
+			'edit_attendee'     => array(
547
+				'nav'           => array(
548
+					'label'      => esc_html__('Edit Contact', 'event_espresso'),
549
+					'order'      => 15,
550
+					'persistent' => false,
551
+					'url'        => isset($this->_req_data['ATT_ID'])
552
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
553
+						: $this->_admin_base_url,
554
+				),
555
+				'metaboxes'     => array('attendee_editor_metaboxes'),
556
+				'require_nonce' => false,
557
+			),
558
+			'contact_list'      => array(
559
+				'nav'           => array(
560
+					'label' => esc_html__('Contact List', 'event_espresso'),
561
+					'order' => 20,
562
+				),
563
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
564
+				'help_tabs'     => array(
565
+					'registrations_contact_list_help_tab'                       => array(
566
+						'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
567
+						'filename' => 'registrations_contact_list',
568
+					),
569
+					'registrations_contact-list_table_column_headings_help_tab' => array(
570
+						'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
571
+						'filename' => 'registrations_contact_list_table_column_headings',
572
+					),
573
+					'registrations_contact_list_views_help_tab'                 => array(
574
+						'title'    => esc_html__('Contact List Views', 'event_espresso'),
575
+						'filename' => 'registrations_contact_list_views',
576
+					),
577
+					'registrations_contact_list_other_help_tab'                 => array(
578
+						'title'    => esc_html__('Contact List Other', 'event_espresso'),
579
+						'filename' => 'registrations_contact_list_other',
580
+					),
581
+				),
582
+				'help_tour'     => array('Contact_List_Help_Tour'),
583
+				'metaboxes'     => array(),
584
+				'require_nonce' => false,
585
+			),
586
+			//override default cpt routes
587
+			'create_new'        => '',
588
+			'edit'              => '',
589
+		);
590
+	}
591
+
592
+
593
+	/**
594
+	 * The below methods aren't used by this class currently
595
+	 */
596
+	protected function _add_screen_options()
597
+	{
598
+	}
599
+
600
+
601
+	protected function _add_feature_pointers()
602
+	{
603
+	}
604
+
605
+
606
+	public function admin_init()
607
+	{
608
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
609
+			'click "Update Registration Questions" to save your changes',
610
+			'event_espresso'
611
+		);
612
+	}
613
+
614
+
615
+	public function admin_notices()
616
+	{
617
+	}
618
+
619
+
620
+	public function admin_footer_scripts()
621
+	{
622
+	}
623
+
624
+
625
+	/**
626
+	 *        get list of registration statuses
627
+	 *
628
+	 * @access private
629
+	 * @return void
630
+	 */
631
+	private function _get_registration_status_array()
632
+	{
633
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
634
+	}
635
+
636
+
637
+	protected function _add_screen_options_default()
638
+	{
639
+		$this->_per_page_screen_option();
640
+	}
641
+
642
+
643
+	protected function _add_screen_options_contact_list()
644
+	{
645
+		$page_title              = $this->_admin_page_title;
646
+		$this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
647
+		$this->_per_page_screen_option();
648
+		$this->_admin_page_title = $page_title;
649
+	}
650
+
651
+
652
+	public function load_scripts_styles()
653
+	{
654
+		//style
655
+		wp_register_style(
656
+			'espresso_reg',
657
+			REG_ASSETS_URL . 'espresso_registrations_admin.css',
658
+			array('ee-admin-css'),
659
+			EVENT_ESPRESSO_VERSION
660
+		);
661
+		wp_enqueue_style('espresso_reg');
662
+		//script
663
+		wp_register_script(
664
+			'espresso_reg',
665
+			REG_ASSETS_URL . 'espresso_registrations_admin.js',
666
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
667
+			EVENT_ESPRESSO_VERSION,
668
+			true
669
+		);
670
+		wp_enqueue_script('espresso_reg');
671
+	}
672
+
673
+
674
+	public function load_scripts_styles_edit_attendee()
675
+	{
676
+		//stuff to only show up on our attendee edit details page.
677
+		$attendee_details_translations = array(
678
+			'att_publish_text' => sprintf(
679
+				esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
680
+				$this->_cpt_model_obj->get_datetime('ATT_created')
681
+			),
682
+		);
683
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
684
+		wp_enqueue_script('jquery-validate');
685
+	}
686
+
687
+
688
+	public function load_scripts_styles_view_registration()
689
+	{
690
+		//styles
691
+		wp_enqueue_style('espresso-ui-theme');
692
+		//scripts
693
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
694
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
695
+	}
696
+
697
+
698
+	public function load_scripts_styles_contact_list()
699
+	{
700
+		wp_deregister_style('espresso_reg');
701
+		wp_register_style(
702
+			'espresso_att',
703
+			REG_ASSETS_URL . 'espresso_attendees_admin.css',
704
+			array('ee-admin-css'),
705
+			EVENT_ESPRESSO_VERSION
706
+		);
707
+		wp_enqueue_style('espresso_att');
708
+	}
709
+
710
+
711
+	public function load_scripts_styles_new_registration()
712
+	{
713
+		wp_register_script(
714
+			'ee-spco-for-admin',
715
+			REG_ASSETS_URL . 'spco_for_admin.js',
716
+			array('underscore', 'jquery'),
717
+			EVENT_ESPRESSO_VERSION,
718
+			true
719
+		);
720
+		wp_enqueue_script('ee-spco-for-admin');
721
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
722
+		EE_Form_Section_Proper::wp_enqueue_scripts();
723
+		EED_Ticket_Selector::load_tckt_slctr_assets();
724
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
725
+	}
726
+
727
+
728
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
729
+	{
730
+		add_filter('FHEE_load_EE_messages', '__return_true');
731
+	}
732
+
733
+
734
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
735
+	{
736
+		add_filter('FHEE_load_EE_messages', '__return_true');
737
+	}
738
+
739
+
740
+	protected function _set_list_table_views_default()
741
+	{
742
+		//for notification related bulk actions we need to make sure only active messengers have an option.
743
+		EED_Messages::set_autoloaders();
744
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
745
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
746
+		$active_mts               = $message_resource_manager->list_of_active_message_types();
747
+		//key= bulk_action_slug, value= message type.
748
+		$match_array = array(
749
+			'approve_registrations'    => 'registration',
750
+			'decline_registrations'    => 'declined_registration',
751
+			'pending_registrations'    => 'pending_approval',
752
+			'no_approve_registrations' => 'not_approved_registration',
753
+			'cancel_registrations'     => 'cancelled_registration',
754
+		);
755
+		$can_send = EE_Registry::instance()->CAP->current_user_can(
756
+			'ee_send_message',
757
+			'batch_send_messages'
758
+		);
759
+		/** setup reg status bulk actions **/
760
+		$def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso');
761
+		if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) {
762
+				$def_reg_status_actions['approve_and_notify_registrations'] = esc_html__(
763
+					'Approve and Notify Registrations',
764
+					'event_espresso'
765
+				);
766
+		}
767
+		$def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso');
768
+		if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) {
769
+				$def_reg_status_actions['decline_and_notify_registrations'] = esc_html__(
770
+					'Decline and Notify Registrations',
771
+					'event_espresso'
772
+				);
773
+		}
774
+		$def_reg_status_actions['pending_registrations'] = esc_html__(
775
+			'Set Registrations to Pending Payment',
776
+			'event_espresso'
777
+		);
778
+		if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) {
779
+				$def_reg_status_actions['pending_and_notify_registrations'] = esc_html__(
780
+					'Set Registrations to Pending Payment and Notify',
781
+					'event_espresso'
782
+				);
783
+		}
784
+		$def_reg_status_actions['no_approve_registrations'] = esc_html__(
785
+			'Set Registrations to Not Approved',
786
+			'event_espresso'
787
+		);
788
+		if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) {
789
+				$def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__(
790
+					'Set Registrations to Not Approved and Notify',
791
+					'event_espresso'
792
+				);
793
+		}
794
+		$def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso');
795
+		if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) {
796
+				$def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__(
797
+					'Cancel Registrations and Notify',
798
+					'event_espresso'
799
+				);
800
+		}
801
+		$def_reg_status_actions = apply_filters(
802
+			'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array',
803
+			$def_reg_status_actions,
804
+			$active_mts
805
+		);
806
+
807
+		$this->_views = array(
808
+			'all'   => array(
809
+				'slug'        => 'all',
810
+				'label'       => esc_html__('View All Registrations', 'event_espresso'),
811
+				'count'       => 0,
812
+				'bulk_action' => array_merge($def_reg_status_actions, array(
813
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
814
+				)),
815
+			),
816
+			'month' => array(
817
+				'slug'        => 'month',
818
+				'label'       => esc_html__('This Month', 'event_espresso'),
819
+				'count'       => 0,
820
+				'bulk_action' => array_merge($def_reg_status_actions, array(
821
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
822
+				)),
823
+			),
824
+			'today' => array(
825
+				'slug'        => 'today',
826
+				'label'       => sprintf(
827
+					esc_html__('Today - %s', 'event_espresso'),
828
+					date('M d, Y', current_time('timestamp'))
829
+				),
830
+				'count'       => 0,
831
+				'bulk_action' => array_merge($def_reg_status_actions, array(
832
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
833
+				)),
834
+			),
835
+		);
836
+		if (EE_Registry::instance()->CAP->current_user_can(
837
+			'ee_delete_registrations',
838
+			'espresso_registrations_delete_registration'
839
+		)) {
840
+			$this->_views['incomplete'] = array(
841
+				'slug'        => 'incomplete',
842
+				'label'       => esc_html__('Incomplete', 'event_espresso'),
843
+				'count'       => 0,
844
+				'bulk_action' => array(
845
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
846
+				),
847
+			);
848
+			$this->_views['trash']      = array(
849
+				'slug'        => 'trash',
850
+				'label'       => esc_html__('Trash', 'event_espresso'),
851
+				'count'       => 0,
852
+				'bulk_action' => array(
853
+					'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
854
+					'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
855
+				),
856
+			);
857
+		}
858
+	}
859
+
860
+
861
+	protected function _set_list_table_views_contact_list()
862
+	{
863
+		$this->_views = array(
864
+			'in_use' => array(
865
+				'slug'        => 'in_use',
866
+				'label'       => esc_html__('In Use', 'event_espresso'),
867
+				'count'       => 0,
868
+				'bulk_action' => array(
869
+					'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
870
+				),
871
+			),
872
+		);
873
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
874
+			'espresso_registrations_trash_attendees')
875
+		) {
876
+			$this->_views['trash'] = array(
877
+				'slug'        => 'trash',
878
+				'label'       => esc_html__('Trash', 'event_espresso'),
879
+				'count'       => 0,
880
+				'bulk_action' => array(
881
+					'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
882
+				),
883
+			);
884
+		}
885
+	}
886
+
887
+
888
+	protected function _registration_legend_items()
889
+	{
890
+		$fc_items = array(
891
+			'star-icon'        => array(
892
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
893
+				'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
894
+			),
895
+			'view_details'     => array(
896
+				'class' => 'dashicons dashicons-clipboard',
897
+				'desc'  => esc_html__('View Registration Details', 'event_espresso'),
898
+			),
899
+			'edit_attendee'    => array(
900
+				'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
901
+				'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
902
+			),
903
+			'view_transaction' => array(
904
+				'class' => 'dashicons dashicons-cart',
905
+				'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
906
+			),
907
+			'view_invoice'     => array(
908
+				'class' => 'dashicons dashicons-media-spreadsheet',
909
+				'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
910
+			),
911
+		);
912
+		if (EE_Registry::instance()->CAP->current_user_can(
913
+			'ee_send_message',
914
+			'espresso_registrations_resend_registration'
915
+		)) {
916
+			$fc_items['resend_registration'] = array(
917
+				'class' => 'dashicons dashicons-email-alt',
918
+				'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
919
+			);
920
+		} else {
921
+			$fc_items['blank'] = array('class' => 'blank', 'desc' => '');
922
+		}
923
+		if (EE_Registry::instance()->CAP->current_user_can(
924
+			'ee_read_global_messages',
925
+			'view_filtered_messages'
926
+		)) {
927
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
928
+			if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
929
+				$fc_items['view_related_messages'] = array(
930
+					'class' => $related_for_icon['css_class'],
931
+					'desc'  => $related_for_icon['label'],
932
+				);
933
+			}
934
+		}
935
+		$sc_items = array(
936
+			'approved_status'   => array(
937
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
938
+				'desc'  => EEH_Template::pretty_status(
939
+					EEM_Registration::status_id_approved,
940
+					false,
941
+					'sentence'
942
+				),
943
+			),
944
+			'pending_status'    => array(
945
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
946
+				'desc'  => EEH_Template::pretty_status(
947
+					EEM_Registration::status_id_pending_payment,
948
+					false,
949
+					'sentence'
950
+				),
951
+			),
952
+			'wait_list'         => array(
953
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
954
+				'desc'  => EEH_Template::pretty_status(
955
+					EEM_Registration::status_id_wait_list,
956
+					false,
957
+					'sentence'
958
+				),
959
+			),
960
+			'incomplete_status' => array(
961
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
962
+				'desc'  => EEH_Template::pretty_status(
963
+					EEM_Registration::status_id_incomplete,
964
+					false,
965
+					'sentence'
966
+				),
967
+			),
968
+			'not_approved'      => array(
969
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
970
+				'desc'  => EEH_Template::pretty_status(
971
+					EEM_Registration::status_id_not_approved,
972
+					false,
973
+					'sentence'
974
+				),
975
+			),
976
+			'declined_status'   => array(
977
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
978
+				'desc'  => EEH_Template::pretty_status(
979
+					EEM_Registration::status_id_declined,
980
+					false,
981
+					'sentence'
982
+				),
983
+			),
984
+			'cancelled_status'  => array(
985
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
986
+				'desc'  => EEH_Template::pretty_status(
987
+					EEM_Registration::status_id_cancelled,
988
+					false,
989
+					'sentence'
990
+				),
991
+			),
992
+		);
993
+		return array_merge($fc_items, $sc_items);
994
+	}
995
+
996
+
997
+
998
+	/***************************************        REGISTRATION OVERVIEW        **************************************/
999
+	/**
1000
+	 * @throws \EE_Error
1001
+	 */
1002
+	protected function _registrations_overview_list_table()
1003
+	{
1004
+		$this->_template_args['admin_page_header'] = '';
1005
+		$EVT_ID                                    = ! empty($this->_req_data['event_id'])
1006
+			? absint($this->_req_data['event_id'])
1007
+			: 0;
1008
+		if ($EVT_ID) {
1009
+			if (EE_Registry::instance()->CAP->current_user_can(
1010
+				'ee_edit_registrations',
1011
+				'espresso_registrations_new_registration',
1012
+				$EVT_ID
1013
+			)) {
1014
+				$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
1015
+					'new_registration',
1016
+					'add-registrant',
1017
+					array('event_id' => $EVT_ID),
1018
+					'add-new-h2'
1019
+				);
1020
+			}
1021
+			$event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
1022
+			if ($event instanceof EE_Event) {
1023
+				$this->_template_args['admin_page_header'] = sprintf(
1024
+					esc_html__(
1025
+						'%s Viewing registrations for the event: %s%s',
1026
+						'event_espresso'
1027
+					),
1028
+					'<h3 style="line-height:1.5em;">',
1029
+					'<br /><a href="'
1030
+						. EE_Admin_Page::add_query_args_and_nonce(
1031
+							array(
1032
+								'action' => 'edit',
1033
+								'post'   => $event->ID(),
1034
+							),
1035
+							EVENTS_ADMIN_URL
1036
+						)
1037
+						. '">&nbsp;'
1038
+						. $event->get('EVT_name')
1039
+						. '&nbsp;</a>&nbsp;',
1040
+					'</h3>'
1041
+				);
1042
+			}
1043
+			$DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
1044
+			$datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
1045
+			if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
1046
+				$this->_template_args['admin_page_header'] = substr(
1047
+					$this->_template_args['admin_page_header'],
1048
+					0,
1049
+					-5
1050
+				);
1051
+				$this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
1052
+				$this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
1053
+				$this->_template_args['admin_page_header'] .= $datetime->name();
1054
+				$this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
1055
+				$this->_template_args['admin_page_header'] .= '</span></h3>';
1056
+			}
1057
+		}
1058
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
1059
+		$this->display_admin_list_table_page_with_no_sidebar();
1060
+	}
1061
+
1062
+
1063
+	/**
1064
+	 * This sets the _registration property for the registration details screen
1065
+	 *
1066
+	 * @access private
1067
+	 * @return bool
1068
+	 */
1069
+	private function _set_registration_object()
1070
+	{
1071
+		//get out if we've already set the object
1072
+		if (is_object($this->_registration)) {
1073
+			return true;
1074
+		}
1075
+		$REG    = EEM_Registration::instance();
1076
+		$REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1077
+		if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1078
+			return true;
1079
+		} else {
1080
+			$error_msg = sprintf(
1081
+				esc_html__(
1082
+					'An error occurred and the details for Registration ID #%s could not be retrieved.',
1083
+					'event_espresso'
1084
+				),
1085
+				$REG_ID
1086
+			);
1087
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1088
+			$this->_registration = null;
1089
+			return false;
1090
+		}
1091
+	}
1092
+
1093
+
1094
+	/**
1095
+	 * Used to retrieve registrations for the list table.
1096
+	 *
1097
+	 * @param int  $per_page
1098
+	 * @param bool $count
1099
+	 * @param bool $this_month
1100
+	 * @param bool $today
1101
+	 * @return EE_Registration[]|int
1102
+	 * @throws EE_Error
1103
+	 */
1104
+	public function get_registrations(
1105
+		$per_page = 10,
1106
+		$count = false,
1107
+		$this_month = false,
1108
+		$today = false
1109
+	) {
1110
+		if ($this_month) {
1111
+			$this->_req_data['status'] = 'month';
1112
+		}
1113
+		if ($today) {
1114
+			$this->_req_data['status'] = 'today';
1115
+		}
1116
+		$query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1117
+		/**
1118
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1119
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1120
+		 * @see EEM_Base::get_all()
1121
+		 */
1122
+		$query_params['group_by'] = '';
1123
+
1124
+		return $count
1125
+			? EEM_Registration::instance()->count($query_params)
1126
+			/** @type EE_Registration[] */
1127
+			: EEM_Registration::instance()->get_all($query_params);
1128
+	}
1129
+
1130
+
1131
+
1132
+	/**
1133
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
1134
+	 * Note: this listens to values on the request for some of the query parameters.
1135
+	 *
1136
+	 * @param array $request
1137
+	 * @param int    $per_page
1138
+	 * @param bool   $count
1139
+	 * @return array
1140
+	 */
1141
+	protected function _get_registration_query_parameters(
1142
+		$request = array(),
1143
+		$per_page = 10,
1144
+		$count = false
1145
+	) {
1146
+
1147
+		$query_params = array(
1148
+			0                          => $this->_get_where_conditions_for_registrations_query(
1149
+				$request
1150
+			),
1151
+			'caps'                     => EEM_Registration::caps_read_admin,
1152
+			'default_where_conditions' => 'this_model_only',
1153
+		);
1154
+		if (! $count) {
1155
+			$query_params = array_merge(
1156
+				$query_params,
1157
+				$this->_get_orderby_for_registrations_query(),
1158
+				$this->_get_limit($per_page)
1159
+			);
1160
+		}
1161
+
1162
+		return $query_params;
1163
+	}
1164
+
1165
+
1166
+	/**
1167
+	 * This will add EVT_ID to the provided $where array for EE model query parameters.
1168
+	 *
1169
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1170
+	 * @return array
1171
+	 */
1172
+	protected function _add_event_id_to_where_conditions(array $request)
1173
+	{
1174
+		$where = array();
1175
+		if (! empty($request['event_id'])) {
1176
+			$where['EVT_ID'] = absint($request['event_id']);
1177
+		}
1178
+		return $where;
1179
+	}
1180
+
1181
+
1182
+	/**
1183
+	 * Adds category ID if it exists in the request to the where conditions for the registrations query.
1184
+	 *
1185
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1186
+	 * @return array
1187
+	 */
1188
+	protected function _add_category_id_to_where_conditions(array $request)
1189
+	{
1190
+		$where = array();
1191
+		if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1192
+			$where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1193
+		}
1194
+		return $where;
1195
+	}
1196
+
1197
+
1198
+	/**
1199
+	 * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1200
+	 *
1201
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1202
+	 * @return array
1203
+	 */
1204
+	protected function _add_datetime_id_to_where_conditions(array $request)
1205
+	{
1206
+		$where = array();
1207
+		if (! empty($request['datetime_id'])) {
1208
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1209
+		}
1210
+		if (! empty($request['DTT_ID'])) {
1211
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1212
+		}
1213
+		return $where;
1214
+	}
1215
+
1216
+
1217
+	/**
1218
+	 * Adds the correct registration status to the where conditions for the registrations query.
1219
+	 *
1220
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1221
+	 * @return array
1222
+	 */
1223
+	protected function _add_registration_status_to_where_conditions(array $request)
1224
+	{
1225
+		$where = array();
1226
+		$view = EEH_Array::is_set($request, 'status', '');
1227
+		$registration_status = ! empty($request['_reg_status'])
1228
+			? sanitize_text_field($request['_reg_status'])
1229
+			: '';
1230
+
1231
+		/*
1232 1232
          * If filtering by registration status, then we show registrations matching that status.
1233 1233
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1234 1234
          * UNLESS viewing trashed registrations.
1235 1235
          */
1236
-        if (! empty($registration_status)) {
1237
-            $where['STS_ID'] = $registration_status;
1238
-        } else {
1239
-            //make sure we exclude incomplete registrations, but only if not trashed.
1240
-            if ($view === 'trash') {
1241
-                $where['REG_deleted'] = true;
1242
-            } elseif ($view === 'incomplete') {
1243
-                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1244
-            } else {
1245
-                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1246
-            }
1247
-        }
1248
-        return $where;
1249
-    }
1250
-
1251
-
1252
-    /**
1253
-     * Adds any provided date restraints to the where conditions for the registrations query.
1254
-     *
1255
-     * @param array $request usually the same as $this->_req_data but not necessarily
1256
-     * @return array
1257
-     * @throws EE_Error
1258
-     */
1259
-    protected function _add_date_to_where_conditions(array $request)
1260
-    {
1261
-        $where = array();
1262
-        $view = EEH_Array::is_set($request, 'status', '');
1263
-        $month_range             = ! empty($request['month_range'])
1264
-            ? sanitize_text_field($request['month_range'])
1265
-            : '';
1266
-        $retrieve_for_today      = $view === 'today';
1267
-        $retrieve_for_this_month = $view === 'month';
1268
-
1269
-        if ($retrieve_for_today) {
1270
-            $now               = date('Y-m-d', current_time('timestamp'));
1271
-            $where['REG_date'] = array(
1272
-                'BETWEEN',
1273
-                array(
1274
-                    EEM_Registration::instance()->convert_datetime_for_query(
1275
-                        'REG_date',
1276
-                        $now . ' 00:00:00',
1277
-                        'Y-m-d H:i:s'
1278
-                    ),
1279
-                    EEM_Registration::instance()->convert_datetime_for_query(
1280
-                        'REG_date',
1281
-                        $now . ' 23:59:59',
1282
-                        'Y-m-d H:i:s'
1283
-                    ),
1284
-                ),
1285
-            );
1286
-        } elseif ($retrieve_for_this_month) {
1287
-            $current_year_and_month = date('Y-m', current_time('timestamp'));
1288
-            $days_this_month        = date('t', current_time('timestamp'));
1289
-            $where['REG_date']      = array(
1290
-                'BETWEEN',
1291
-                array(
1292
-                    EEM_Registration::instance()->convert_datetime_for_query(
1293
-                        'REG_date',
1294
-                        $current_year_and_month . '-01 00:00:00',
1295
-                        'Y-m-d H:i:s'
1296
-                    ),
1297
-                    EEM_Registration::instance()->convert_datetime_for_query(
1298
-                        'REG_date',
1299
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1300
-                        'Y-m-d H:i:s'
1301
-                    ),
1302
-                ),
1303
-            );
1304
-        } elseif ($month_range) {
1305
-            $pieces          = explode(' ', $month_range, 3);
1306
-            $month_requested = ! empty($pieces[0])
1307
-                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1308
-                : '';
1309
-            $year_requested  = ! empty($pieces[1])
1310
-                ? $pieces[1]
1311
-                : '';
1312
-            //if there is not a month or year then we can't go further
1313
-            if ($month_requested && $year_requested) {
1314
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1315
-                $where['REG_date'] = array(
1316
-                    'BETWEEN',
1317
-                    array(
1318
-                        EEM_Registration::instance()->convert_datetime_for_query(
1319
-                            'REG_date',
1320
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1321
-                            'Y-m-d H:i:s'
1322
-                        ),
1323
-                        EEM_Registration::instance()->convert_datetime_for_query(
1324
-                            'REG_date',
1325
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1326
-                            'Y-m-d H:i:s'
1327
-                        ),
1328
-                    ),
1329
-                );
1330
-            }
1331
-        }
1332
-        return $where;
1333
-    }
1334
-
1335
-
1336
-    /**
1337
-     * Adds any provided search restraints to the where conditions for the registrations query
1338
-     *
1339
-     * @param array $request usually the same as $this->_req_data but not necessarily
1340
-     * @return array
1341
-     */
1342
-    protected function _add_search_to_where_conditions(array $request)
1343
-    {
1344
-        $where = array();
1345
-        if (! empty($request['s'])) {
1346
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1347
-            $where['OR*search_conditions'] = array(
1348
-                'Event.EVT_name'                          => array('LIKE', $search_string),
1349
-                'Event.EVT_desc'                          => array('LIKE', $search_string),
1350
-                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1351
-                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1352
-                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1353
-                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1354
-                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1355
-                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1356
-                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1357
-                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1358
-                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1359
-                'REG_final_price'                         => array('LIKE', $search_string),
1360
-                'REG_code'                                => array('LIKE', $search_string),
1361
-                'REG_count'                               => array('LIKE', $search_string),
1362
-                'REG_group_size'                          => array('LIKE', $search_string),
1363
-                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1364
-                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1365
-                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1366
-            );
1367
-        }
1368
-        return $where;
1369
-    }
1370
-
1371
-
1372
-    /**
1373
-     * Sets up the where conditions for the registrations query.
1374
-     *
1375
-     * @param array $request
1376
-     * @return array
1377
-     * @throws EE_Error
1378
-     */
1379
-    protected function _get_where_conditions_for_registrations_query($request)
1380
-    {
1381
-        return apply_filters(
1382
-            'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1383
-            array_merge(
1384
-                $this->_add_event_id_to_where_conditions($request),
1385
-                $this->_add_category_id_to_where_conditions($request),
1386
-                $this->_add_datetime_id_to_where_conditions($request),
1387
-                $this->_add_registration_status_to_where_conditions($request),
1388
-                $this->_add_date_to_where_conditions($request),
1389
-                $this->_add_search_to_where_conditions($request)
1390
-            ),
1391
-            $request
1392
-        );
1393
-    }
1394
-
1395
-
1396
-    /**
1397
-     * Sets up the orderby for the registrations query.
1398
-     *
1399
-     * @return array
1400
-     */
1401
-    protected function _get_orderby_for_registrations_query()
1402
-    {
1403
-        $orderby_field = ! empty($this->_req_data['orderby'])
1404
-            ? sanitize_text_field($this->_req_data['orderby'])
1405
-            : '';
1406
-        switch ($orderby_field) {
1407
-            case '_REG_ID':
1408
-                $orderby_field = 'REG_ID';
1409
-                break;
1410
-            case '_Reg_status':
1411
-                $orderby_field = 'STS_ID';
1412
-                break;
1413
-            case 'ATT_fname':
1414
-                $orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1415
-                break;
1416
-            case 'ATT_lname':
1417
-                $orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1418
-                break;
1419
-            case 'event_name':
1420
-                $orderby_field = 'Event.EVT_name';
1421
-                break;
1422
-            case 'DTT_EVT_start':
1423
-                $orderby_field = 'Event.Datetime.DTT_EVT_start';
1424
-                break;
1425
-            default: //'REG_date'
1426
-                $orderby_field = 'REG_date';
1427
-        }
1428
-
1429
-        //order
1430
-        $order = ! empty($this->_req_data['order'])
1431
-            ? sanitize_text_field($this->_req_data['order'])
1432
-            : 'DESC';
1433
-
1434
-        //mutate orderby_field
1435
-        $orderby_field = array_combine(
1436
-            (array) $orderby_field,
1437
-            array_fill(0, count($orderby_field), $order)
1438
-        );
1439
-        return array('order_by' => $orderby_field);
1440
-    }
1441
-
1442
-
1443
-    /**
1444
-     * Sets up the limit for the registrations query.
1445
-     *
1446
-     * @param $per_page
1447
-     * @return array
1448
-     */
1449
-    protected function _get_limit($per_page)
1450
-    {
1451
-        $current_page = ! empty($this->_req_data['paged'])
1452
-            ? absint($this->_req_data['paged'])
1453
-            : 1;
1454
-        $per_page     = ! empty($this->_req_data['perpage'])
1455
-            ? $this->_req_data['perpage']
1456
-            : $per_page;
1457
-
1458
-        //-1 means return all results so get out if that's set.
1459
-        if ((int)$per_page === -1) {
1460
-            return array();
1461
-        }
1462
-        $per_page = absint($per_page);
1463
-        $offset   = ($current_page - 1) * $per_page;
1464
-        return array('limit' => array($offset, $per_page));
1465
-    }
1466
-
1467
-
1468
-    public function get_registration_status_array()
1469
-    {
1470
-        return self::$_reg_status;
1471
-    }
1472
-
1473
-
1474
-
1475
-
1476
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1477
-    /**
1478
-     *        generates HTML for the View Registration Details Admin page
1479
-     *
1480
-     * @access protected
1481
-     * @return void
1482
-     * @throws DomainException
1483
-     * @throws EE_Error
1484
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1485
-     */
1486
-    protected function _registration_details()
1487
-    {
1488
-        $this->_template_args = array();
1489
-        $this->_set_registration_object();
1490
-        if (is_object($this->_registration)) {
1491
-            $transaction                                   = $this->_registration->transaction()
1492
-                ? $this->_registration->transaction()
1493
-                : EE_Transaction::new_instance();
1494
-            $this->_session                                = $transaction->session_data();
1495
-            $event_id                                      = $this->_registration->event_ID();
1496
-            $this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1497
-            $this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1498
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1499
-            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1500
-            $this->_template_args['grand_total']           = $transaction->total();
1501
-            $this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1502
-            // link back to overview
1503
-            $this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1504
-            $this->_template_args['registration']                = $this->_registration;
1505
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1506
-                array(
1507
-                    'action'   => 'default',
1508
-                    'event_id' => $event_id,
1509
-                ),
1510
-                REG_ADMIN_URL
1511
-            );
1512
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1513
-                array(
1514
-                    'action' => 'default',
1515
-                    'EVT_ID' => $event_id,
1516
-                    'page'   => 'espresso_transactions',
1517
-                ),
1518
-                admin_url('admin.php')
1519
-            );
1520
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1521
-                array(
1522
-                    'page'   => 'espresso_events',
1523
-                    'action' => 'edit',
1524
-                    'post'   => $event_id,
1525
-                ),
1526
-                admin_url('admin.php')
1527
-            );
1528
-            //next and previous links
1529
-            $next_reg                                      = $this->_registration->next(
1530
-                null,
1531
-                array(),
1532
-                'REG_ID'
1533
-            );
1534
-            $this->_template_args['next_registration']     = $next_reg
1535
-                ? $this->_next_link(
1536
-                    EE_Admin_Page::add_query_args_and_nonce(
1537
-                        array(
1538
-                            'action'  => 'view_registration',
1539
-                            '_REG_ID' => $next_reg['REG_ID'],
1540
-                        ),
1541
-                        REG_ADMIN_URL
1542
-                    ),
1543
-                    'dashicons dashicons-arrow-right ee-icon-size-22'
1544
-                )
1545
-                : '';
1546
-            $previous_reg                                  = $this->_registration->previous(
1547
-                null,
1548
-                array(),
1549
-                'REG_ID'
1550
-            );
1551
-            $this->_template_args['previous_registration'] = $previous_reg
1552
-                ? $this->_previous_link(
1553
-                    EE_Admin_Page::add_query_args_and_nonce(
1554
-                        array(
1555
-                            'action'  => 'view_registration',
1556
-                            '_REG_ID' => $previous_reg['REG_ID'],
1557
-                        ),
1558
-                        REG_ADMIN_URL
1559
-                    ),
1560
-                    'dashicons dashicons-arrow-left ee-icon-size-22'
1561
-                )
1562
-                : '';
1563
-            // grab header
1564
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1565
-            $this->_template_args['REG_ID']            = $this->_registration->ID();
1566
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1567
-                $template_path,
1568
-                $this->_template_args,
1569
-                true
1570
-            );
1571
-        } else {
1572
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1573
-        }
1574
-        // the details template wrapper
1575
-        $this->display_admin_page_with_sidebar();
1576
-    }
1577
-
1578
-
1579
-    protected function _registration_details_metaboxes()
1580
-    {
1581
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1582
-        $this->_set_registration_object();
1583
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1584
-        add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1585
-            array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1586
-        add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1587
-            array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1588
-        if ($attendee instanceof EE_Attendee
1589
-            && EE_Registry::instance()->CAP->current_user_can(
1590
-                'ee_edit_registration',
1591
-                'edit-reg-questions-mbox'
1592
-            )
1593
-        ) {
1594
-            add_meta_box(
1595
-                'edit-reg-questions-mbox',
1596
-                esc_html__('Registration Form Answers', 'event_espresso'),
1597
-                array($this, '_reg_questions_meta_box'),
1598
-                $this->wp_page_slug,
1599
-                'normal',
1600
-                'high'
1601
-            );
1602
-        }
1603
-        add_meta_box(
1604
-            'edit-reg-registrant-mbox',
1605
-            esc_html__('Contact Details', 'event_espresso'),
1606
-            array($this, '_reg_registrant_side_meta_box'),
1607
-            $this->wp_page_slug,
1608
-            'side',
1609
-            'high'
1610
-        );
1611
-        if ($this->_registration->group_size() > 1) {
1612
-            add_meta_box(
1613
-                'edit-reg-attendees-mbox',
1614
-                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1615
-                array($this, '_reg_attendees_meta_box'),
1616
-                $this->wp_page_slug,
1617
-                'normal',
1618
-                'high'
1619
-            );
1620
-        }
1621
-    }
1622
-
1623
-
1624
-    /**
1625
-     * set_reg_status_buttons_metabox
1626
-     *
1627
-     * @access protected
1628
-     * @return string
1629
-     * @throws \EE_Error
1630
-     */
1631
-    public function set_reg_status_buttons_metabox()
1632
-    {
1633
-        $this->_set_registration_object();
1634
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1635
-        echo $change_reg_status_form->form_open(
1636
-            self::add_query_args_and_nonce(
1637
-                array(
1638
-                    'action' => 'change_reg_status',
1639
-                ),
1640
-                REG_ADMIN_URL
1641
-            )
1642
-        );
1643
-        echo $change_reg_status_form->get_html();
1644
-        echo $change_reg_status_form->form_close();
1645
-    }
1646
-
1647
-
1648
-
1649
-    /**
1650
-     * @return EE_Form_Section_Proper
1651
-     * @throws EE_Error
1652
-     */
1653
-    protected function _generate_reg_status_change_form()
1654
-    {
1655
-        return new EE_Form_Section_Proper(array(
1656
-            'name'            => 'reg_status_change_form',
1657
-            'html_id'         => 'reg-status-change-form',
1658
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1659
-            'subsections'     => array(
1660
-                'return'             => new EE_Hidden_Input(array(
1661
-                    'name'    => 'return',
1662
-                    'default' => 'view_registration',
1663
-                )),
1664
-                'REG_ID'             => new EE_Hidden_Input(array(
1665
-                    'name'    => 'REG_ID',
1666
-                    'default' => $this->_registration->ID(),
1667
-                )),
1668
-                'current_status'     => new EE_Form_Section_HTML(
1669
-                    EEH_HTML::tr(
1670
-                        EEH_HTML::th(
1671
-                            EEH_HTML::label(
1672
-                                EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1673
-                                )
1674
-                            )
1675
-                        )
1676
-                        . EEH_HTML::td(
1677
-                            EEH_HTML::strong(
1678
-                                $this->_registration->pretty_status(),
1679
-                                '',
1680
-                                'status-' . $this->_registration->status_ID(),
1681
-                                'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1682
-                            )
1683
-                        )
1684
-                    )
1685
-                ),
1686
-                'reg_status'         => new EE_Select_Input(
1687
-                    $this->_get_reg_statuses(),
1688
-                    array(
1689
-                        'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1690
-                        'default'         => $this->_registration->status_ID(),
1691
-                    )
1692
-                ),
1693
-                'send_notifications' => new EE_Yes_No_Input(
1694
-                    array(
1695
-                        'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1696
-                        'default'         => false,
1697
-                        'html_help_text'  => esc_html__(
1698
-                            'If set to "Yes", then the related messages will be sent to the registrant.',
1699
-                            'event_espresso'
1700
-                        ),
1701
-                    )
1702
-                ),
1703
-                'submit'             => new EE_Submit_Input(
1704
-                    array(
1705
-                        'html_class'      => 'button-primary',
1706
-                        'html_label_text' => '&nbsp;',
1707
-                        'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1708
-                    )
1709
-                ),
1710
-            ),
1711
-        ));
1712
-    }
1713
-
1714
-
1715
-    /**
1716
-     * Returns an array of all the buttons for the various statuses and switch status actions
1717
-     *
1718
-     * @return array
1719
-     * @throws EE_Error
1720
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1721
-     */
1722
-    protected function _get_reg_statuses()
1723
-    {
1724
-        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1725
-        unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1726
-        // get current reg status
1727
-        $current_status = $this->_registration->status_ID();
1728
-        // is registration for free event? This will determine whether to display the pending payment option
1729
-        if (
1730
-            $current_status !== EEM_Registration::status_id_pending_payment
1731
-            && $this->_registration->transaction()->is_free()
1732
-        ) {
1733
-            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1734
-        }
1735
-        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1736
-    }
1737
-
1738
-
1739
-
1740
-    /**
1741
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1742
-     *
1743
-     * @param bool $status REG status given for changing registrations to.
1744
-     * @param bool $notify Whether to send messages notifications or not.
1745
-     * @return array  (array with reg_id(s) updated and whether update was successful.
1746
-     * @throws \EE_Error
1747
-     */
1748
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1749
-    {
1750
-        if (isset($this->_req_data['reg_status_change_form'])) {
1751
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1752
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1753
-        } else {
1754
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1755
-        }
1756
-        $success = $this->_set_registration_status($REG_IDs, $status);
1757
-        //notify?
1758
-        if ($success
1759
-            && $notify
1760
-            && EE_Registry::instance()->CAP->current_user_can(
1761
-                'ee_send_message',
1762
-                'espresso_registrations_resend_registration'
1763
-            )
1764
-        ) {
1765
-            $this->_process_resend_registration();
1766
-        }
1767
-        return $success;
1768
-    }
1769
-
1770
-
1771
-
1772
-    /**
1773
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1774
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1775
-     *
1776
-     * @param array $REG_IDs
1777
-     * @param bool  $status
1778
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1779
-     * @throws \RuntimeException
1780
-     * @throws \EE_Error
1781
-     *               the array of updated registrations).
1782
-     * @throws EE_Error
1783
-     * @throws RuntimeException
1784
-     */
1785
-    protected function _set_registration_status($REG_IDs = array(), $status = false)
1786
-    {
1787
-        $success = false;
1788
-        // typecast $REG_IDs
1789
-        $REG_IDs = (array)$REG_IDs;
1790
-        if ( ! empty($REG_IDs)) {
1791
-            $success = true;
1792
-            // set default status if none is passed
1793
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1794
-            // sanitize $REG_IDs
1795
-            $REG_IDs = array_filter($REG_IDs, 'absint');
1796
-            //loop through REG_ID's and change status
1797
-            foreach ($REG_IDs as $REG_ID) {
1798
-                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1799
-                if ($registration instanceof EE_Registration) {
1800
-                    $registration->set_status($status);
1801
-                    $result = $registration->save();
1802
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1803
-                    $success = $result !== false ? $success : false;
1804
-                }
1805
-            }
1806
-        }
1807
-        //reset _req_data['_REG_ID'] for any potential future messages notifications
1808
-        $this->_req_data['_REG_ID'] = $REG_IDs;
1809
-        //return $success and processed registrations
1810
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1811
-    }
1812
-
1813
-
1814
-    /**
1815
-     * Common logic for setting up success message and redirecting to appropriate route
1816
-     *
1817
-     * @param  string $STS_ID status id for the registration changed to
1818
-     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1819
-     * @return void
1820
-     */
1821
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1822
-    {
1823
-        $result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1824
-            : array('success' => false);
1825
-        $success = isset($result['success']) && $result['success'];
1826
-        //setup success message
1827
-        if ($success) {
1828
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1829
-                $msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1830
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1831
-            } else {
1832
-                $msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1833
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1834
-            }
1835
-            EE_Error::add_success($msg);
1836
-        } else {
1837
-            EE_Error::add_error(
1838
-                esc_html__(
1839
-                    'Something went wrong, and the status was not changed',
1840
-                    'event_espresso'
1841
-                ), __FILE__, __LINE__, __FUNCTION__
1842
-            );
1843
-        }
1844
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1845
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1846
-        } else {
1847
-            $route = array('action' => 'default');
1848
-        }
1849
-        //unset nonces
1850
-        foreach ($this->_req_data as $ref => $value) {
1851
-            if (strpos($ref, 'nonce') !== false) {
1852
-                unset($this->_req_data[$ref]);
1853
-                continue;
1854
-            }
1855
-            $value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1856
-            $this->_req_data[$ref] = $value;
1857
-        }
1858
-        //merge request vars so that the reloaded list table contains any existing filter query params
1859
-        $route = array_merge($this->_req_data, $route);
1860
-        $this->_redirect_after_action($success, '', '', $route, true);
1861
-    }
1862
-
1863
-
1864
-    /**
1865
-     * incoming reg status change from reg details page.
1866
-     *
1867
-     * @return void
1868
-     */
1869
-    protected function _change_reg_status()
1870
-    {
1871
-        $this->_req_data['return'] = 'view_registration';
1872
-        //set notify based on whether the send notifications toggle is set or not
1873
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1874
-        //$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1875
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1876
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1877
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1878
-            case EEM_Registration::status_id_approved :
1879
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1880
-                $this->approve_registration($notify);
1881
-                break;
1882
-            case EEM_Registration::status_id_pending_payment :
1883
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1884
-                $this->pending_registration($notify);
1885
-                break;
1886
-            case EEM_Registration::status_id_not_approved :
1887
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1888
-                $this->not_approve_registration($notify);
1889
-                break;
1890
-            case EEM_Registration::status_id_declined :
1891
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1892
-                $this->decline_registration($notify);
1893
-                break;
1894
-            case EEM_Registration::status_id_cancelled :
1895
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1896
-                $this->cancel_registration($notify);
1897
-                break;
1898
-            case EEM_Registration::status_id_wait_list :
1899
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1900
-                $this->wait_list_registration($notify);
1901
-                break;
1902
-            case EEM_Registration::status_id_incomplete :
1903
-            default :
1904
-                $result['success'] = false;
1905
-                unset($this->_req_data['return']);
1906
-                $this->_reg_status_change_return('', false);
1907
-                break;
1908
-        }
1909
-    }
1910
-
1911
-
1912
-    /**
1913
-     * Callback for bulk action routes.
1914
-     * Note: although we could just register the singular route callbacks for each bulk action route as well, this
1915
-     * method was chosen so there is one central place all the registration status bulk actions are going through.
1916
-     * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
1917
-     * when an action is happening on just a single registration).
1918
-     * @param      $action
1919
-     * @param bool $notify
1920
-     */
1921
-    protected function bulk_action_on_registrations($action, $notify = false) {
1922
-        do_action(
1923
-            'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
1924
-            $this,
1925
-            $action,
1926
-            $notify
1927
-        );
1928
-        $method = $action . '_registration';
1929
-        if (method_exists($this, $method)) {
1930
-            $this->$method($notify);
1931
-        }
1932
-    }
1933
-
1934
-
1935
-    /**
1936
-     * approve_registration
1937
-     *
1938
-     * @access protected
1939
-     * @param bool $notify whether or not to notify the registrant about their approval.
1940
-     * @return void
1941
-     */
1942
-    protected function approve_registration($notify = false)
1943
-    {
1944
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1945
-    }
1946
-
1947
-
1948
-    /**
1949
-     *        decline_registration
1950
-     *
1951
-     * @access protected
1952
-     * @param bool $notify whether or not to notify the registrant about their status change.
1953
-     * @return void
1954
-     */
1955
-    protected function decline_registration($notify = false)
1956
-    {
1957
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1958
-    }
1959
-
1960
-
1961
-    /**
1962
-     *        cancel_registration
1963
-     *
1964
-     * @access protected
1965
-     * @param bool $notify whether or not to notify the registrant about their status change.
1966
-     * @return void
1967
-     */
1968
-    protected function cancel_registration($notify = false)
1969
-    {
1970
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1971
-    }
1972
-
1973
-
1974
-    /**
1975
-     *        not_approve_registration
1976
-     *
1977
-     * @access protected
1978
-     * @param bool $notify whether or not to notify the registrant about their status change.
1979
-     * @return void
1980
-     */
1981
-    protected function not_approve_registration($notify = false)
1982
-    {
1983
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1984
-    }
1985
-
1986
-
1987
-    /**
1988
-     *        decline_registration
1989
-     *
1990
-     * @access protected
1991
-     * @param bool $notify whether or not to notify the registrant about their status change.
1992
-     * @return void
1993
-     */
1994
-    protected function pending_registration($notify = false)
1995
-    {
1996
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1997
-    }
1998
-
1999
-
2000
-    /**
2001
-     * waitlist_registration
2002
-     *
2003
-     * @access protected
2004
-     * @param bool $notify whether or not to notify the registrant about their status change.
2005
-     * @return void
2006
-     */
2007
-    protected function wait_list_registration($notify = false)
2008
-    {
2009
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
2010
-    }
2011
-
2012
-
2013
-    /**
2014
-     *        generates HTML for the Registration main meta box
2015
-     *
2016
-     * @access public
2017
-     * @return void
2018
-     * @throws DomainException
2019
-     * @throws EE_Error
2020
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
2021
-     */
2022
-    public function _reg_details_meta_box()
2023
-    {
2024
-        EEH_Autoloader::register_line_item_display_autoloaders();
2025
-        EEH_Autoloader::register_line_item_filter_autoloaders();
2026
-        EE_Registry::instance()->load_helper('Line_Item');
2027
-        $transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
2028
-            : EE_Transaction::new_instance();
2029
-        $this->_session = $transaction->session_data();
2030
-        $filters        = new EE_Line_Item_Filter_Collection();
2031
-        //$filters->add( new EE_Non_Zero_Line_Item_Filter() );
2032
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2033
-        $line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
2034
-            $transaction->total_line_item());
2035
-        $filtered_line_item_tree                 = $line_item_filter_processor->process();
2036
-        $line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
2037
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
2038
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2039
-            $filtered_line_item_tree,
2040
-            array('EE_Registration' => $this->_registration)
2041
-        );
2042
-        $attendee                                = $this->_registration->attendee();
2043
-        if (EE_Registry::instance()->CAP->current_user_can(
2044
-            'ee_read_transaction',
2045
-            'espresso_transactions_view_transaction'
2046
-        )) {
2047
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2048
-                EE_Admin_Page::add_query_args_and_nonce(
2049
-                    array(
2050
-                        'action' => 'view_transaction',
2051
-                        'TXN_ID' => $transaction->ID(),
2052
-                    ),
2053
-                    TXN_ADMIN_URL
2054
-                ),
2055
-                esc_html__(' View Transaction', 'event_espresso'),
2056
-                'button secondary-button right',
2057
-                'dashicons dashicons-cart'
2058
-            );
2059
-        } else {
2060
-            $this->_template_args['view_transaction_button'] = '';
2061
-        }
2062
-        if ($attendee instanceof EE_Attendee
2063
-            && EE_Registry::instance()->CAP->current_user_can(
2064
-                'ee_send_message',
2065
-                'espresso_registrations_resend_registration'
2066
-            )
2067
-        ) {
2068
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2069
-                EE_Admin_Page::add_query_args_and_nonce(
2070
-                    array(
2071
-                        'action'      => 'resend_registration',
2072
-                        '_REG_ID'     => $this->_registration->ID(),
2073
-                        'redirect_to' => 'view_registration',
2074
-                    ),
2075
-                    REG_ADMIN_URL
2076
-                ),
2077
-                esc_html__(' Resend Registration', 'event_espresso'),
2078
-                'button secondary-button right',
2079
-                'dashicons dashicons-email-alt'
2080
-            );
2081
-        } else {
2082
-            $this->_template_args['resend_registration_button'] = '';
2083
-        }
2084
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2085
-        $payment                               = $transaction->get_first_related('Payment');
2086
-        $payment                               = ! $payment instanceof EE_Payment
2087
-            ? EE_Payment::new_instance()
2088
-            : $payment;
2089
-        $payment_method                        = $payment->get_first_related('Payment_Method');
2090
-        $payment_method                        = ! $payment_method instanceof EE_Payment_Method
2091
-            ? EE_Payment_Method::new_instance()
2092
-            : $payment_method;
2093
-        $reg_details                           = array(
2094
-            'payment_method'       => $payment_method->name(),
2095
-            'response_msg'         => $payment->gateway_response(),
2096
-            'registration_id'      => $this->_registration->get('REG_code'),
2097
-            'registration_session' => $this->_registration->session_ID(),
2098
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2099
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2100
-        );
2101
-        if (isset($reg_details['registration_id'])) {
2102
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2103
-            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2104
-                'Registration ID',
2105
-                'event_espresso'
2106
-            );
2107
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2108
-        }
2109
-        if (isset($reg_details['payment_method'])) {
2110
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2111
-            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2112
-                'Most Recent Payment Method',
2113
-                'event_espresso'
2114
-            );
2115
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2116
-            $this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2117
-            $this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2118
-                'Payment method response',
2119
-                'event_espresso'
2120
-            );
2121
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2122
-        }
2123
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2124
-        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2125
-            'Registration Session',
2126
-            'event_espresso'
2127
-        );
2128
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2129
-        $this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2130
-        $this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2131
-            'Registration placed from IP',
2132
-            'event_espresso'
2133
-        );
2134
-        $this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2135
-        $this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2136
-        $this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2137
-            'event_espresso');
2138
-        $this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2139
-        $this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2140
-            array(
2141
-                'action'   => 'default',
2142
-                'event_id' => $this->_registration->event_ID(),
2143
-            ),
2144
-            REG_ADMIN_URL
2145
-        );
2146
-        $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2147
-        $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2148
-        $template_path                                                        =
2149
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2150
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2151
-    }
2152
-
2153
-
2154
-    /**
2155
-     * generates HTML for the Registration Questions meta box.
2156
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2157
-     * otherwise uses new forms system
2158
-     *
2159
-     * @access public
2160
-     * @return void
2161
-     * @throws DomainException
2162
-     * @throws EE_Error
2163
-     */
2164
-    public function _reg_questions_meta_box()
2165
-    {
2166
-        //allow someone to override this method entirely
2167
-        if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2168
-            $this->_registration)) {
2169
-            $form                                              = $this->_get_reg_custom_questions_form(
2170
-                $this->_registration->ID()
2171
-            );
2172
-            $this->_template_args['att_questions']             = count($form->subforms()) > 0
2173
-                ? $form->get_html_and_js()
2174
-                : '';
2175
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2176
-            $this->_template_args['REG_ID']                    = $this->_registration->ID();
2177
-            $template_path                                     =
2178
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2179
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2180
-        }
2181
-    }
2182
-
2183
-
2184
-    /**
2185
-     * form_before_question_group
2186
-     *
2187
-     * @deprecated    as of 4.8.32.rc.000
2188
-     * @access        public
2189
-     * @param        string $output
2190
-     * @return        string
2191
-     */
2192
-    public function form_before_question_group($output)
2193
-    {
2194
-        EE_Error::doing_it_wrong(
2195
-            __CLASS__ . '::' . __FUNCTION__,
2196
-            esc_html__(
2197
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2198
-                'event_espresso'
2199
-            ),
2200
-            '4.8.32.rc.000'
2201
-        );
2202
-        return '
1236
+		if (! empty($registration_status)) {
1237
+			$where['STS_ID'] = $registration_status;
1238
+		} else {
1239
+			//make sure we exclude incomplete registrations, but only if not trashed.
1240
+			if ($view === 'trash') {
1241
+				$where['REG_deleted'] = true;
1242
+			} elseif ($view === 'incomplete') {
1243
+				$where['STS_ID'] = EEM_Registration::status_id_incomplete;
1244
+			} else {
1245
+				$where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1246
+			}
1247
+		}
1248
+		return $where;
1249
+	}
1250
+
1251
+
1252
+	/**
1253
+	 * Adds any provided date restraints to the where conditions for the registrations query.
1254
+	 *
1255
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1256
+	 * @return array
1257
+	 * @throws EE_Error
1258
+	 */
1259
+	protected function _add_date_to_where_conditions(array $request)
1260
+	{
1261
+		$where = array();
1262
+		$view = EEH_Array::is_set($request, 'status', '');
1263
+		$month_range             = ! empty($request['month_range'])
1264
+			? sanitize_text_field($request['month_range'])
1265
+			: '';
1266
+		$retrieve_for_today      = $view === 'today';
1267
+		$retrieve_for_this_month = $view === 'month';
1268
+
1269
+		if ($retrieve_for_today) {
1270
+			$now               = date('Y-m-d', current_time('timestamp'));
1271
+			$where['REG_date'] = array(
1272
+				'BETWEEN',
1273
+				array(
1274
+					EEM_Registration::instance()->convert_datetime_for_query(
1275
+						'REG_date',
1276
+						$now . ' 00:00:00',
1277
+						'Y-m-d H:i:s'
1278
+					),
1279
+					EEM_Registration::instance()->convert_datetime_for_query(
1280
+						'REG_date',
1281
+						$now . ' 23:59:59',
1282
+						'Y-m-d H:i:s'
1283
+					),
1284
+				),
1285
+			);
1286
+		} elseif ($retrieve_for_this_month) {
1287
+			$current_year_and_month = date('Y-m', current_time('timestamp'));
1288
+			$days_this_month        = date('t', current_time('timestamp'));
1289
+			$where['REG_date']      = array(
1290
+				'BETWEEN',
1291
+				array(
1292
+					EEM_Registration::instance()->convert_datetime_for_query(
1293
+						'REG_date',
1294
+						$current_year_and_month . '-01 00:00:00',
1295
+						'Y-m-d H:i:s'
1296
+					),
1297
+					EEM_Registration::instance()->convert_datetime_for_query(
1298
+						'REG_date',
1299
+						$current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1300
+						'Y-m-d H:i:s'
1301
+					),
1302
+				),
1303
+			);
1304
+		} elseif ($month_range) {
1305
+			$pieces          = explode(' ', $month_range, 3);
1306
+			$month_requested = ! empty($pieces[0])
1307
+				? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1308
+				: '';
1309
+			$year_requested  = ! empty($pieces[1])
1310
+				? $pieces[1]
1311
+				: '';
1312
+			//if there is not a month or year then we can't go further
1313
+			if ($month_requested && $year_requested) {
1314
+				$days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1315
+				$where['REG_date'] = array(
1316
+					'BETWEEN',
1317
+					array(
1318
+						EEM_Registration::instance()->convert_datetime_for_query(
1319
+							'REG_date',
1320
+							$year_requested . '-' . $month_requested . '-01 00:00:00',
1321
+							'Y-m-d H:i:s'
1322
+						),
1323
+						EEM_Registration::instance()->convert_datetime_for_query(
1324
+							'REG_date',
1325
+							$year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1326
+							'Y-m-d H:i:s'
1327
+						),
1328
+					),
1329
+				);
1330
+			}
1331
+		}
1332
+		return $where;
1333
+	}
1334
+
1335
+
1336
+	/**
1337
+	 * Adds any provided search restraints to the where conditions for the registrations query
1338
+	 *
1339
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1340
+	 * @return array
1341
+	 */
1342
+	protected function _add_search_to_where_conditions(array $request)
1343
+	{
1344
+		$where = array();
1345
+		if (! empty($request['s'])) {
1346
+			$search_string = '%' . sanitize_text_field($request['s']) . '%';
1347
+			$where['OR*search_conditions'] = array(
1348
+				'Event.EVT_name'                          => array('LIKE', $search_string),
1349
+				'Event.EVT_desc'                          => array('LIKE', $search_string),
1350
+				'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1351
+				'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1352
+				'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1353
+				'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1354
+				'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1355
+				'Attendee.ATT_email'                      => array('LIKE', $search_string),
1356
+				'Attendee.ATT_address'                    => array('LIKE', $search_string),
1357
+				'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1358
+				'Attendee.ATT_city'                       => array('LIKE', $search_string),
1359
+				'REG_final_price'                         => array('LIKE', $search_string),
1360
+				'REG_code'                                => array('LIKE', $search_string),
1361
+				'REG_count'                               => array('LIKE', $search_string),
1362
+				'REG_group_size'                          => array('LIKE', $search_string),
1363
+				'Ticket.TKT_name'                         => array('LIKE', $search_string),
1364
+				'Ticket.TKT_description'                  => array('LIKE', $search_string),
1365
+				'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1366
+			);
1367
+		}
1368
+		return $where;
1369
+	}
1370
+
1371
+
1372
+	/**
1373
+	 * Sets up the where conditions for the registrations query.
1374
+	 *
1375
+	 * @param array $request
1376
+	 * @return array
1377
+	 * @throws EE_Error
1378
+	 */
1379
+	protected function _get_where_conditions_for_registrations_query($request)
1380
+	{
1381
+		return apply_filters(
1382
+			'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1383
+			array_merge(
1384
+				$this->_add_event_id_to_where_conditions($request),
1385
+				$this->_add_category_id_to_where_conditions($request),
1386
+				$this->_add_datetime_id_to_where_conditions($request),
1387
+				$this->_add_registration_status_to_where_conditions($request),
1388
+				$this->_add_date_to_where_conditions($request),
1389
+				$this->_add_search_to_where_conditions($request)
1390
+			),
1391
+			$request
1392
+		);
1393
+	}
1394
+
1395
+
1396
+	/**
1397
+	 * Sets up the orderby for the registrations query.
1398
+	 *
1399
+	 * @return array
1400
+	 */
1401
+	protected function _get_orderby_for_registrations_query()
1402
+	{
1403
+		$orderby_field = ! empty($this->_req_data['orderby'])
1404
+			? sanitize_text_field($this->_req_data['orderby'])
1405
+			: '';
1406
+		switch ($orderby_field) {
1407
+			case '_REG_ID':
1408
+				$orderby_field = 'REG_ID';
1409
+				break;
1410
+			case '_Reg_status':
1411
+				$orderby_field = 'STS_ID';
1412
+				break;
1413
+			case 'ATT_fname':
1414
+				$orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1415
+				break;
1416
+			case 'ATT_lname':
1417
+				$orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1418
+				break;
1419
+			case 'event_name':
1420
+				$orderby_field = 'Event.EVT_name';
1421
+				break;
1422
+			case 'DTT_EVT_start':
1423
+				$orderby_field = 'Event.Datetime.DTT_EVT_start';
1424
+				break;
1425
+			default: //'REG_date'
1426
+				$orderby_field = 'REG_date';
1427
+		}
1428
+
1429
+		//order
1430
+		$order = ! empty($this->_req_data['order'])
1431
+			? sanitize_text_field($this->_req_data['order'])
1432
+			: 'DESC';
1433
+
1434
+		//mutate orderby_field
1435
+		$orderby_field = array_combine(
1436
+			(array) $orderby_field,
1437
+			array_fill(0, count($orderby_field), $order)
1438
+		);
1439
+		return array('order_by' => $orderby_field);
1440
+	}
1441
+
1442
+
1443
+	/**
1444
+	 * Sets up the limit for the registrations query.
1445
+	 *
1446
+	 * @param $per_page
1447
+	 * @return array
1448
+	 */
1449
+	protected function _get_limit($per_page)
1450
+	{
1451
+		$current_page = ! empty($this->_req_data['paged'])
1452
+			? absint($this->_req_data['paged'])
1453
+			: 1;
1454
+		$per_page     = ! empty($this->_req_data['perpage'])
1455
+			? $this->_req_data['perpage']
1456
+			: $per_page;
1457
+
1458
+		//-1 means return all results so get out if that's set.
1459
+		if ((int)$per_page === -1) {
1460
+			return array();
1461
+		}
1462
+		$per_page = absint($per_page);
1463
+		$offset   = ($current_page - 1) * $per_page;
1464
+		return array('limit' => array($offset, $per_page));
1465
+	}
1466
+
1467
+
1468
+	public function get_registration_status_array()
1469
+	{
1470
+		return self::$_reg_status;
1471
+	}
1472
+
1473
+
1474
+
1475
+
1476
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1477
+	/**
1478
+	 *        generates HTML for the View Registration Details Admin page
1479
+	 *
1480
+	 * @access protected
1481
+	 * @return void
1482
+	 * @throws DomainException
1483
+	 * @throws EE_Error
1484
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1485
+	 */
1486
+	protected function _registration_details()
1487
+	{
1488
+		$this->_template_args = array();
1489
+		$this->_set_registration_object();
1490
+		if (is_object($this->_registration)) {
1491
+			$transaction                                   = $this->_registration->transaction()
1492
+				? $this->_registration->transaction()
1493
+				: EE_Transaction::new_instance();
1494
+			$this->_session                                = $transaction->session_data();
1495
+			$event_id                                      = $this->_registration->event_ID();
1496
+			$this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1497
+			$this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1498
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1499
+			$this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1500
+			$this->_template_args['grand_total']           = $transaction->total();
1501
+			$this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1502
+			// link back to overview
1503
+			$this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1504
+			$this->_template_args['registration']                = $this->_registration;
1505
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1506
+				array(
1507
+					'action'   => 'default',
1508
+					'event_id' => $event_id,
1509
+				),
1510
+				REG_ADMIN_URL
1511
+			);
1512
+			$this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1513
+				array(
1514
+					'action' => 'default',
1515
+					'EVT_ID' => $event_id,
1516
+					'page'   => 'espresso_transactions',
1517
+				),
1518
+				admin_url('admin.php')
1519
+			);
1520
+			$this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1521
+				array(
1522
+					'page'   => 'espresso_events',
1523
+					'action' => 'edit',
1524
+					'post'   => $event_id,
1525
+				),
1526
+				admin_url('admin.php')
1527
+			);
1528
+			//next and previous links
1529
+			$next_reg                                      = $this->_registration->next(
1530
+				null,
1531
+				array(),
1532
+				'REG_ID'
1533
+			);
1534
+			$this->_template_args['next_registration']     = $next_reg
1535
+				? $this->_next_link(
1536
+					EE_Admin_Page::add_query_args_and_nonce(
1537
+						array(
1538
+							'action'  => 'view_registration',
1539
+							'_REG_ID' => $next_reg['REG_ID'],
1540
+						),
1541
+						REG_ADMIN_URL
1542
+					),
1543
+					'dashicons dashicons-arrow-right ee-icon-size-22'
1544
+				)
1545
+				: '';
1546
+			$previous_reg                                  = $this->_registration->previous(
1547
+				null,
1548
+				array(),
1549
+				'REG_ID'
1550
+			);
1551
+			$this->_template_args['previous_registration'] = $previous_reg
1552
+				? $this->_previous_link(
1553
+					EE_Admin_Page::add_query_args_and_nonce(
1554
+						array(
1555
+							'action'  => 'view_registration',
1556
+							'_REG_ID' => $previous_reg['REG_ID'],
1557
+						),
1558
+						REG_ADMIN_URL
1559
+					),
1560
+					'dashicons dashicons-arrow-left ee-icon-size-22'
1561
+				)
1562
+				: '';
1563
+			// grab header
1564
+			$template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1565
+			$this->_template_args['REG_ID']            = $this->_registration->ID();
1566
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template(
1567
+				$template_path,
1568
+				$this->_template_args,
1569
+				true
1570
+			);
1571
+		} else {
1572
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1573
+		}
1574
+		// the details template wrapper
1575
+		$this->display_admin_page_with_sidebar();
1576
+	}
1577
+
1578
+
1579
+	protected function _registration_details_metaboxes()
1580
+	{
1581
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1582
+		$this->_set_registration_object();
1583
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1584
+		add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1585
+			array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1586
+		add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1587
+			array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1588
+		if ($attendee instanceof EE_Attendee
1589
+			&& EE_Registry::instance()->CAP->current_user_can(
1590
+				'ee_edit_registration',
1591
+				'edit-reg-questions-mbox'
1592
+			)
1593
+		) {
1594
+			add_meta_box(
1595
+				'edit-reg-questions-mbox',
1596
+				esc_html__('Registration Form Answers', 'event_espresso'),
1597
+				array($this, '_reg_questions_meta_box'),
1598
+				$this->wp_page_slug,
1599
+				'normal',
1600
+				'high'
1601
+			);
1602
+		}
1603
+		add_meta_box(
1604
+			'edit-reg-registrant-mbox',
1605
+			esc_html__('Contact Details', 'event_espresso'),
1606
+			array($this, '_reg_registrant_side_meta_box'),
1607
+			$this->wp_page_slug,
1608
+			'side',
1609
+			'high'
1610
+		);
1611
+		if ($this->_registration->group_size() > 1) {
1612
+			add_meta_box(
1613
+				'edit-reg-attendees-mbox',
1614
+				esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1615
+				array($this, '_reg_attendees_meta_box'),
1616
+				$this->wp_page_slug,
1617
+				'normal',
1618
+				'high'
1619
+			);
1620
+		}
1621
+	}
1622
+
1623
+
1624
+	/**
1625
+	 * set_reg_status_buttons_metabox
1626
+	 *
1627
+	 * @access protected
1628
+	 * @return string
1629
+	 * @throws \EE_Error
1630
+	 */
1631
+	public function set_reg_status_buttons_metabox()
1632
+	{
1633
+		$this->_set_registration_object();
1634
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1635
+		echo $change_reg_status_form->form_open(
1636
+			self::add_query_args_and_nonce(
1637
+				array(
1638
+					'action' => 'change_reg_status',
1639
+				),
1640
+				REG_ADMIN_URL
1641
+			)
1642
+		);
1643
+		echo $change_reg_status_form->get_html();
1644
+		echo $change_reg_status_form->form_close();
1645
+	}
1646
+
1647
+
1648
+
1649
+	/**
1650
+	 * @return EE_Form_Section_Proper
1651
+	 * @throws EE_Error
1652
+	 */
1653
+	protected function _generate_reg_status_change_form()
1654
+	{
1655
+		return new EE_Form_Section_Proper(array(
1656
+			'name'            => 'reg_status_change_form',
1657
+			'html_id'         => 'reg-status-change-form',
1658
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1659
+			'subsections'     => array(
1660
+				'return'             => new EE_Hidden_Input(array(
1661
+					'name'    => 'return',
1662
+					'default' => 'view_registration',
1663
+				)),
1664
+				'REG_ID'             => new EE_Hidden_Input(array(
1665
+					'name'    => 'REG_ID',
1666
+					'default' => $this->_registration->ID(),
1667
+				)),
1668
+				'current_status'     => new EE_Form_Section_HTML(
1669
+					EEH_HTML::tr(
1670
+						EEH_HTML::th(
1671
+							EEH_HTML::label(
1672
+								EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1673
+								)
1674
+							)
1675
+						)
1676
+						. EEH_HTML::td(
1677
+							EEH_HTML::strong(
1678
+								$this->_registration->pretty_status(),
1679
+								'',
1680
+								'status-' . $this->_registration->status_ID(),
1681
+								'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1682
+							)
1683
+						)
1684
+					)
1685
+				),
1686
+				'reg_status'         => new EE_Select_Input(
1687
+					$this->_get_reg_statuses(),
1688
+					array(
1689
+						'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1690
+						'default'         => $this->_registration->status_ID(),
1691
+					)
1692
+				),
1693
+				'send_notifications' => new EE_Yes_No_Input(
1694
+					array(
1695
+						'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1696
+						'default'         => false,
1697
+						'html_help_text'  => esc_html__(
1698
+							'If set to "Yes", then the related messages will be sent to the registrant.',
1699
+							'event_espresso'
1700
+						),
1701
+					)
1702
+				),
1703
+				'submit'             => new EE_Submit_Input(
1704
+					array(
1705
+						'html_class'      => 'button-primary',
1706
+						'html_label_text' => '&nbsp;',
1707
+						'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1708
+					)
1709
+				),
1710
+			),
1711
+		));
1712
+	}
1713
+
1714
+
1715
+	/**
1716
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1717
+	 *
1718
+	 * @return array
1719
+	 * @throws EE_Error
1720
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1721
+	 */
1722
+	protected function _get_reg_statuses()
1723
+	{
1724
+		$reg_status_array = EEM_Registration::instance()->reg_status_array();
1725
+		unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1726
+		// get current reg status
1727
+		$current_status = $this->_registration->status_ID();
1728
+		// is registration for free event? This will determine whether to display the pending payment option
1729
+		if (
1730
+			$current_status !== EEM_Registration::status_id_pending_payment
1731
+			&& $this->_registration->transaction()->is_free()
1732
+		) {
1733
+			unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1734
+		}
1735
+		return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1736
+	}
1737
+
1738
+
1739
+
1740
+	/**
1741
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1742
+	 *
1743
+	 * @param bool $status REG status given for changing registrations to.
1744
+	 * @param bool $notify Whether to send messages notifications or not.
1745
+	 * @return array  (array with reg_id(s) updated and whether update was successful.
1746
+	 * @throws \EE_Error
1747
+	 */
1748
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1749
+	{
1750
+		if (isset($this->_req_data['reg_status_change_form'])) {
1751
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1752
+				? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1753
+		} else {
1754
+			$REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1755
+		}
1756
+		$success = $this->_set_registration_status($REG_IDs, $status);
1757
+		//notify?
1758
+		if ($success
1759
+			&& $notify
1760
+			&& EE_Registry::instance()->CAP->current_user_can(
1761
+				'ee_send_message',
1762
+				'espresso_registrations_resend_registration'
1763
+			)
1764
+		) {
1765
+			$this->_process_resend_registration();
1766
+		}
1767
+		return $success;
1768
+	}
1769
+
1770
+
1771
+
1772
+	/**
1773
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1774
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1775
+	 *
1776
+	 * @param array $REG_IDs
1777
+	 * @param bool  $status
1778
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1779
+	 * @throws \RuntimeException
1780
+	 * @throws \EE_Error
1781
+	 *               the array of updated registrations).
1782
+	 * @throws EE_Error
1783
+	 * @throws RuntimeException
1784
+	 */
1785
+	protected function _set_registration_status($REG_IDs = array(), $status = false)
1786
+	{
1787
+		$success = false;
1788
+		// typecast $REG_IDs
1789
+		$REG_IDs = (array)$REG_IDs;
1790
+		if ( ! empty($REG_IDs)) {
1791
+			$success = true;
1792
+			// set default status if none is passed
1793
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1794
+			// sanitize $REG_IDs
1795
+			$REG_IDs = array_filter($REG_IDs, 'absint');
1796
+			//loop through REG_ID's and change status
1797
+			foreach ($REG_IDs as $REG_ID) {
1798
+				$registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1799
+				if ($registration instanceof EE_Registration) {
1800
+					$registration->set_status($status);
1801
+					$result = $registration->save();
1802
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1803
+					$success = $result !== false ? $success : false;
1804
+				}
1805
+			}
1806
+		}
1807
+		//reset _req_data['_REG_ID'] for any potential future messages notifications
1808
+		$this->_req_data['_REG_ID'] = $REG_IDs;
1809
+		//return $success and processed registrations
1810
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1811
+	}
1812
+
1813
+
1814
+	/**
1815
+	 * Common logic for setting up success message and redirecting to appropriate route
1816
+	 *
1817
+	 * @param  string $STS_ID status id for the registration changed to
1818
+	 * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1819
+	 * @return void
1820
+	 */
1821
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1822
+	{
1823
+		$result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1824
+			: array('success' => false);
1825
+		$success = isset($result['success']) && $result['success'];
1826
+		//setup success message
1827
+		if ($success) {
1828
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1829
+				$msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1830
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1831
+			} else {
1832
+				$msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1833
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1834
+			}
1835
+			EE_Error::add_success($msg);
1836
+		} else {
1837
+			EE_Error::add_error(
1838
+				esc_html__(
1839
+					'Something went wrong, and the status was not changed',
1840
+					'event_espresso'
1841
+				), __FILE__, __LINE__, __FUNCTION__
1842
+			);
1843
+		}
1844
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1845
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1846
+		} else {
1847
+			$route = array('action' => 'default');
1848
+		}
1849
+		//unset nonces
1850
+		foreach ($this->_req_data as $ref => $value) {
1851
+			if (strpos($ref, 'nonce') !== false) {
1852
+				unset($this->_req_data[$ref]);
1853
+				continue;
1854
+			}
1855
+			$value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1856
+			$this->_req_data[$ref] = $value;
1857
+		}
1858
+		//merge request vars so that the reloaded list table contains any existing filter query params
1859
+		$route = array_merge($this->_req_data, $route);
1860
+		$this->_redirect_after_action($success, '', '', $route, true);
1861
+	}
1862
+
1863
+
1864
+	/**
1865
+	 * incoming reg status change from reg details page.
1866
+	 *
1867
+	 * @return void
1868
+	 */
1869
+	protected function _change_reg_status()
1870
+	{
1871
+		$this->_req_data['return'] = 'view_registration';
1872
+		//set notify based on whether the send notifications toggle is set or not
1873
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1874
+		//$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1875
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1876
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1877
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1878
+			case EEM_Registration::status_id_approved :
1879
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1880
+				$this->approve_registration($notify);
1881
+				break;
1882
+			case EEM_Registration::status_id_pending_payment :
1883
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1884
+				$this->pending_registration($notify);
1885
+				break;
1886
+			case EEM_Registration::status_id_not_approved :
1887
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1888
+				$this->not_approve_registration($notify);
1889
+				break;
1890
+			case EEM_Registration::status_id_declined :
1891
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1892
+				$this->decline_registration($notify);
1893
+				break;
1894
+			case EEM_Registration::status_id_cancelled :
1895
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1896
+				$this->cancel_registration($notify);
1897
+				break;
1898
+			case EEM_Registration::status_id_wait_list :
1899
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1900
+				$this->wait_list_registration($notify);
1901
+				break;
1902
+			case EEM_Registration::status_id_incomplete :
1903
+			default :
1904
+				$result['success'] = false;
1905
+				unset($this->_req_data['return']);
1906
+				$this->_reg_status_change_return('', false);
1907
+				break;
1908
+		}
1909
+	}
1910
+
1911
+
1912
+	/**
1913
+	 * Callback for bulk action routes.
1914
+	 * Note: although we could just register the singular route callbacks for each bulk action route as well, this
1915
+	 * method was chosen so there is one central place all the registration status bulk actions are going through.
1916
+	 * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to
1917
+	 * when an action is happening on just a single registration).
1918
+	 * @param      $action
1919
+	 * @param bool $notify
1920
+	 */
1921
+	protected function bulk_action_on_registrations($action, $notify = false) {
1922
+		do_action(
1923
+			'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution',
1924
+			$this,
1925
+			$action,
1926
+			$notify
1927
+		);
1928
+		$method = $action . '_registration';
1929
+		if (method_exists($this, $method)) {
1930
+			$this->$method($notify);
1931
+		}
1932
+	}
1933
+
1934
+
1935
+	/**
1936
+	 * approve_registration
1937
+	 *
1938
+	 * @access protected
1939
+	 * @param bool $notify whether or not to notify the registrant about their approval.
1940
+	 * @return void
1941
+	 */
1942
+	protected function approve_registration($notify = false)
1943
+	{
1944
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1945
+	}
1946
+
1947
+
1948
+	/**
1949
+	 *        decline_registration
1950
+	 *
1951
+	 * @access protected
1952
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1953
+	 * @return void
1954
+	 */
1955
+	protected function decline_registration($notify = false)
1956
+	{
1957
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1958
+	}
1959
+
1960
+
1961
+	/**
1962
+	 *        cancel_registration
1963
+	 *
1964
+	 * @access protected
1965
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1966
+	 * @return void
1967
+	 */
1968
+	protected function cancel_registration($notify = false)
1969
+	{
1970
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1971
+	}
1972
+
1973
+
1974
+	/**
1975
+	 *        not_approve_registration
1976
+	 *
1977
+	 * @access protected
1978
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1979
+	 * @return void
1980
+	 */
1981
+	protected function not_approve_registration($notify = false)
1982
+	{
1983
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1984
+	}
1985
+
1986
+
1987
+	/**
1988
+	 *        decline_registration
1989
+	 *
1990
+	 * @access protected
1991
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1992
+	 * @return void
1993
+	 */
1994
+	protected function pending_registration($notify = false)
1995
+	{
1996
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1997
+	}
1998
+
1999
+
2000
+	/**
2001
+	 * waitlist_registration
2002
+	 *
2003
+	 * @access protected
2004
+	 * @param bool $notify whether or not to notify the registrant about their status change.
2005
+	 * @return void
2006
+	 */
2007
+	protected function wait_list_registration($notify = false)
2008
+	{
2009
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
2010
+	}
2011
+
2012
+
2013
+	/**
2014
+	 *        generates HTML for the Registration main meta box
2015
+	 *
2016
+	 * @access public
2017
+	 * @return void
2018
+	 * @throws DomainException
2019
+	 * @throws EE_Error
2020
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
2021
+	 */
2022
+	public function _reg_details_meta_box()
2023
+	{
2024
+		EEH_Autoloader::register_line_item_display_autoloaders();
2025
+		EEH_Autoloader::register_line_item_filter_autoloaders();
2026
+		EE_Registry::instance()->load_helper('Line_Item');
2027
+		$transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
2028
+			: EE_Transaction::new_instance();
2029
+		$this->_session = $transaction->session_data();
2030
+		$filters        = new EE_Line_Item_Filter_Collection();
2031
+		//$filters->add( new EE_Non_Zero_Line_Item_Filter() );
2032
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
2033
+		$line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
2034
+			$transaction->total_line_item());
2035
+		$filtered_line_item_tree                 = $line_item_filter_processor->process();
2036
+		$line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
2037
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
2038
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item(
2039
+			$filtered_line_item_tree,
2040
+			array('EE_Registration' => $this->_registration)
2041
+		);
2042
+		$attendee                                = $this->_registration->attendee();
2043
+		if (EE_Registry::instance()->CAP->current_user_can(
2044
+			'ee_read_transaction',
2045
+			'espresso_transactions_view_transaction'
2046
+		)) {
2047
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
2048
+				EE_Admin_Page::add_query_args_and_nonce(
2049
+					array(
2050
+						'action' => 'view_transaction',
2051
+						'TXN_ID' => $transaction->ID(),
2052
+					),
2053
+					TXN_ADMIN_URL
2054
+				),
2055
+				esc_html__(' View Transaction', 'event_espresso'),
2056
+				'button secondary-button right',
2057
+				'dashicons dashicons-cart'
2058
+			);
2059
+		} else {
2060
+			$this->_template_args['view_transaction_button'] = '';
2061
+		}
2062
+		if ($attendee instanceof EE_Attendee
2063
+			&& EE_Registry::instance()->CAP->current_user_can(
2064
+				'ee_send_message',
2065
+				'espresso_registrations_resend_registration'
2066
+			)
2067
+		) {
2068
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
2069
+				EE_Admin_Page::add_query_args_and_nonce(
2070
+					array(
2071
+						'action'      => 'resend_registration',
2072
+						'_REG_ID'     => $this->_registration->ID(),
2073
+						'redirect_to' => 'view_registration',
2074
+					),
2075
+					REG_ADMIN_URL
2076
+				),
2077
+				esc_html__(' Resend Registration', 'event_espresso'),
2078
+				'button secondary-button right',
2079
+				'dashicons dashicons-email-alt'
2080
+			);
2081
+		} else {
2082
+			$this->_template_args['resend_registration_button'] = '';
2083
+		}
2084
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2085
+		$payment                               = $transaction->get_first_related('Payment');
2086
+		$payment                               = ! $payment instanceof EE_Payment
2087
+			? EE_Payment::new_instance()
2088
+			: $payment;
2089
+		$payment_method                        = $payment->get_first_related('Payment_Method');
2090
+		$payment_method                        = ! $payment_method instanceof EE_Payment_Method
2091
+			? EE_Payment_Method::new_instance()
2092
+			: $payment_method;
2093
+		$reg_details                           = array(
2094
+			'payment_method'       => $payment_method->name(),
2095
+			'response_msg'         => $payment->gateway_response(),
2096
+			'registration_id'      => $this->_registration->get('REG_code'),
2097
+			'registration_session' => $this->_registration->session_ID(),
2098
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
2099
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
2100
+		);
2101
+		if (isset($reg_details['registration_id'])) {
2102
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
2103
+			$this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
2104
+				'Registration ID',
2105
+				'event_espresso'
2106
+			);
2107
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2108
+		}
2109
+		if (isset($reg_details['payment_method'])) {
2110
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2111
+			$this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2112
+				'Most Recent Payment Method',
2113
+				'event_espresso'
2114
+			);
2115
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2116
+			$this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2117
+			$this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2118
+				'Payment method response',
2119
+				'event_espresso'
2120
+			);
2121
+			$this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2122
+		}
2123
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2124
+		$this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2125
+			'Registration Session',
2126
+			'event_espresso'
2127
+		);
2128
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2129
+		$this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2130
+		$this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2131
+			'Registration placed from IP',
2132
+			'event_espresso'
2133
+		);
2134
+		$this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2135
+		$this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2136
+		$this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2137
+			'event_espresso');
2138
+		$this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2139
+		$this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2140
+			array(
2141
+				'action'   => 'default',
2142
+				'event_id' => $this->_registration->event_ID(),
2143
+			),
2144
+			REG_ADMIN_URL
2145
+		);
2146
+		$this->_template_args['REG_ID']                                       = $this->_registration->ID();
2147
+		$this->_template_args['event_id']                                     = $this->_registration->event_ID();
2148
+		$template_path                                                        =
2149
+			REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2150
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2151
+	}
2152
+
2153
+
2154
+	/**
2155
+	 * generates HTML for the Registration Questions meta box.
2156
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2157
+	 * otherwise uses new forms system
2158
+	 *
2159
+	 * @access public
2160
+	 * @return void
2161
+	 * @throws DomainException
2162
+	 * @throws EE_Error
2163
+	 */
2164
+	public function _reg_questions_meta_box()
2165
+	{
2166
+		//allow someone to override this method entirely
2167
+		if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2168
+			$this->_registration)) {
2169
+			$form                                              = $this->_get_reg_custom_questions_form(
2170
+				$this->_registration->ID()
2171
+			);
2172
+			$this->_template_args['att_questions']             = count($form->subforms()) > 0
2173
+				? $form->get_html_and_js()
2174
+				: '';
2175
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
2176
+			$this->_template_args['REG_ID']                    = $this->_registration->ID();
2177
+			$template_path                                     =
2178
+				REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2179
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
2180
+		}
2181
+	}
2182
+
2183
+
2184
+	/**
2185
+	 * form_before_question_group
2186
+	 *
2187
+	 * @deprecated    as of 4.8.32.rc.000
2188
+	 * @access        public
2189
+	 * @param        string $output
2190
+	 * @return        string
2191
+	 */
2192
+	public function form_before_question_group($output)
2193
+	{
2194
+		EE_Error::doing_it_wrong(
2195
+			__CLASS__ . '::' . __FUNCTION__,
2196
+			esc_html__(
2197
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2198
+				'event_espresso'
2199
+			),
2200
+			'4.8.32.rc.000'
2201
+		);
2202
+		return '
2203 2203
 	<table class="form-table ee-width-100">
2204 2204
 		<tbody>
2205 2205
 			';
2206
-    }
2207
-
2208
-
2209
-    /**
2210
-     * form_after_question_group
2211
-     *
2212
-     * @deprecated    as of 4.8.32.rc.000
2213
-     * @access        public
2214
-     * @param        string $output
2215
-     * @return        string
2216
-     */
2217
-    public function form_after_question_group($output)
2218
-    {
2219
-        EE_Error::doing_it_wrong(
2220
-            __CLASS__ . '::' . __FUNCTION__,
2221
-            esc_html__(
2222
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2223
-                'event_espresso'
2224
-            ),
2225
-            '4.8.32.rc.000'
2226
-        );
2227
-        return '
2206
+	}
2207
+
2208
+
2209
+	/**
2210
+	 * form_after_question_group
2211
+	 *
2212
+	 * @deprecated    as of 4.8.32.rc.000
2213
+	 * @access        public
2214
+	 * @param        string $output
2215
+	 * @return        string
2216
+	 */
2217
+	public function form_after_question_group($output)
2218
+	{
2219
+		EE_Error::doing_it_wrong(
2220
+			__CLASS__ . '::' . __FUNCTION__,
2221
+			esc_html__(
2222
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2223
+				'event_espresso'
2224
+			),
2225
+			'4.8.32.rc.000'
2226
+		);
2227
+		return '
2228 2228
 			<tr class="hide-if-no-js">
2229 2229
 				<th> </th>
2230 2230
 				<td class="reg-admin-edit-attendee-question-td">
2231 2231
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2232
-               . esc_attr__('click to edit question', 'event_espresso')
2233
-               . '">
2232
+			   . esc_attr__('click to edit question', 'event_espresso')
2233
+			   . '">
2234 2234
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2235
-               . esc_html__('edit the above question group', 'event_espresso')
2236
-               . '</span>
2235
+			   . esc_html__('edit the above question group', 'event_espresso')
2236
+			   . '</span>
2237 2237
 						<div class="dashicons dashicons-edit"></div>
2238 2238
 					</a>
2239 2239
 				</td>
@@ -2241,558 +2241,558 @@  discard block
 block discarded – undo
2241 2241
 		</tbody>
2242 2242
 	</table>
2243 2243
 ';
2244
-    }
2245
-
2246
-
2247
-    /**
2248
-     * form_form_field_label_wrap
2249
-     *
2250
-     * @deprecated    as of 4.8.32.rc.000
2251
-     * @access        public
2252
-     * @param        string $label
2253
-     * @return        string
2254
-     */
2255
-    public function form_form_field_label_wrap($label)
2256
-    {
2257
-        EE_Error::doing_it_wrong(
2258
-            __CLASS__ . '::' . __FUNCTION__,
2259
-            esc_html__(
2260
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2261
-                'event_espresso'
2262
-            ),
2263
-            '4.8.32.rc.000'
2264
-        );
2265
-        return '
2244
+	}
2245
+
2246
+
2247
+	/**
2248
+	 * form_form_field_label_wrap
2249
+	 *
2250
+	 * @deprecated    as of 4.8.32.rc.000
2251
+	 * @access        public
2252
+	 * @param        string $label
2253
+	 * @return        string
2254
+	 */
2255
+	public function form_form_field_label_wrap($label)
2256
+	{
2257
+		EE_Error::doing_it_wrong(
2258
+			__CLASS__ . '::' . __FUNCTION__,
2259
+			esc_html__(
2260
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2261
+				'event_espresso'
2262
+			),
2263
+			'4.8.32.rc.000'
2264
+		);
2265
+		return '
2266 2266
 			<tr>
2267 2267
 				<th>
2268 2268
 					' . $label . '
2269 2269
 				</th>';
2270
-    }
2271
-
2272
-
2273
-    /**
2274
-     * form_form_field_input__wrap
2275
-     *
2276
-     * @deprecated    as of 4.8.32.rc.000
2277
-     * @access        public
2278
-     * @param        string $input
2279
-     * @return        string
2280
-     */
2281
-    public function form_form_field_input__wrap($input)
2282
-    {
2283
-        EE_Error::doing_it_wrong(
2284
-            __CLASS__ . '::' . __FUNCTION__,
2285
-            esc_html__(
2286
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2287
-                'event_espresso'
2288
-            ),
2289
-            '4.8.32.rc.000'
2290
-        );
2291
-        return '
2270
+	}
2271
+
2272
+
2273
+	/**
2274
+	 * form_form_field_input__wrap
2275
+	 *
2276
+	 * @deprecated    as of 4.8.32.rc.000
2277
+	 * @access        public
2278
+	 * @param        string $input
2279
+	 * @return        string
2280
+	 */
2281
+	public function form_form_field_input__wrap($input)
2282
+	{
2283
+		EE_Error::doing_it_wrong(
2284
+			__CLASS__ . '::' . __FUNCTION__,
2285
+			esc_html__(
2286
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2287
+				'event_espresso'
2288
+			),
2289
+			'4.8.32.rc.000'
2290
+		);
2291
+		return '
2292 2292
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2293 2293
 					' . $input . '
2294 2294
 				</td>
2295 2295
 			</tr>';
2296
-    }
2297
-
2298
-
2299
-    /**
2300
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
2301
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2302
-     * to display the page
2303
-     *
2304
-     * @access protected
2305
-     * @return void
2306
-     * @throws EE_Error
2307
-     */
2308
-    protected function _update_attendee_registration_form()
2309
-    {
2310
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2311
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2312
-            $REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2313
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
2314
-            if ($success) {
2315
-                $what  = esc_html__('Registration Form', 'event_espresso');
2316
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2317
-                    : array('action' => 'default');
2318
-                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2319
-            }
2320
-        }
2321
-    }
2322
-
2323
-
2324
-    /**
2325
-     * Gets the form for saving registrations custom questions (if done
2326
-     * previously retrieves the cached form object, which may have validation errors in it)
2327
-     *
2328
-     * @param int $REG_ID
2329
-     * @return EE_Registration_Custom_Questions_Form
2330
-     * @throws EE_Error
2331
-     */
2332
-    protected function _get_reg_custom_questions_form($REG_ID)
2333
-    {
2334
-        if ( ! $this->_reg_custom_questions_form) {
2335
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2336
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2337
-                EEM_Registration::instance()->get_one_by_ID($REG_ID)
2338
-            );
2339
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2340
-        }
2341
-        return $this->_reg_custom_questions_form;
2342
-    }
2343
-
2344
-
2345
-    /**
2346
-     * Saves
2347
-     *
2348
-     * @access private
2349
-     * @param bool $REG_ID
2350
-     * @return bool
2351
-     * @throws EE_Error
2352
-     */
2353
-    private function _save_reg_custom_questions_form($REG_ID = false)
2354
-    {
2355
-        if ( ! $REG_ID) {
2356
-            EE_Error::add_error(
2357
-                esc_html__(
2358
-                    'An error occurred. No registration ID was received.', 'event_espresso'),
2359
-                __FILE__, __FUNCTION__, __LINE__
2360
-            );
2361
-        }
2362
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
2363
-        $form->receive_form_submission($this->_req_data);
2364
-        $success = false;
2365
-        if ($form->is_valid()) {
2366
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2367
-                foreach ($question_group_form->inputs() as $question_id => $input) {
2368
-                    $where_conditions    = array(
2369
-                        'QST_ID' => $question_id,
2370
-                        'REG_ID' => $REG_ID,
2371
-                    );
2372
-                    $possibly_new_values = array(
2373
-                        'ANS_value' => $input->normalized_value(),
2374
-                    );
2375
-                    $answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2376
-                    if ($answer instanceof EE_Answer) {
2377
-                        $success = $answer->save($possibly_new_values);
2378
-                    } else {
2379
-                        //insert it then
2380
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2381
-                        $answer      = EE_Answer::new_instance($cols_n_vals);
2382
-                        $success     = $answer->save();
2383
-                    }
2384
-                }
2385
-            }
2386
-        } else {
2387
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2388
-        }
2389
-        return $success;
2390
-    }
2391
-
2392
-
2393
-    /**
2394
-     *        generates HTML for the Registration main meta box
2395
-     *
2396
-     * @access public
2397
-     * @return void
2398
-     * @throws DomainException
2399
-     * @throws EE_Error
2400
-     */
2401
-    public function _reg_attendees_meta_box()
2402
-    {
2403
-        $REG = EEM_Registration::instance();
2404
-        //get all other registrations on this transaction, and cache
2405
-        //the attendees for them so we don't have to run another query using force_join
2406
-        $registrations                           = $REG->get_all(array(
2407
-            array(
2408
-                'TXN_ID' => $this->_registration->transaction_ID(),
2409
-                'REG_ID' => array('!=', $this->_registration->ID()),
2410
-            ),
2411
-            'force_join' => array('Attendee'),
2412
-        ));
2413
-        $this->_template_args['attendees']       = array();
2414
-        $this->_template_args['attendee_notice'] = '';
2415
-        if (empty($registrations)
2416
-            || (is_array($registrations)
2417
-                && ! EEH_Array::get_one_item_from_array($registrations))
2418
-        ) {
2419
-            EE_Error::add_error(
2420
-                esc_html__(
2421
-                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2422
-                    'event_espresso'
2423
-                ), __FILE__, __FUNCTION__, __LINE__
2424
-            );
2425
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2426
-        } else {
2427
-            $att_nmbr = 1;
2428
-            foreach ($registrations as $registration) {
2429
-                /* @var $registration EE_Registration */
2430
-                $attendee                                                    = $registration->attendee()
2431
-                    ? $registration->attendee()
2432
-                    : EEM_Attendee::instance()
2433
-                                  ->create_default_object();
2434
-                $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2435
-                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2436
-                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2437
-                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2438
-                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2439
-                $this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2440
-                    ', ',
2441
-                    $attendee->full_address_as_array()
2442
-                );
2443
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2444
-                    array(
2445
-                        'action' => 'edit_attendee',
2446
-                        'post'   => $attendee->ID(),
2447
-                    ),
2448
-                    REG_ADMIN_URL
2449
-                );
2450
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2451
-                $att_nmbr++;
2452
-            }
2453
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2454
-        }
2455
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2456
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2457
-    }
2458
-
2459
-
2460
-    /**
2461
-     *        generates HTML for the Edit Registration side meta box
2462
-     *
2463
-     * @access public
2464
-     * @return void
2465
-     * @throws DomainException
2466
-     * @throws EE_Error
2467
-     */
2468
-    public function _reg_registrant_side_meta_box()
2469
-    {
2470
-        /*@var $attendee EE_Attendee */
2471
-        $att_check = $this->_registration->attendee();
2472
-        $attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2473
-        //now let's determine if this is not the primary registration.  If it isn't then we set the
2474
-        //primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2475
-        //primary registration object (that way we know if we need to show create button or not)
2476
-        if ( ! $this->_registration->is_primary_registrant()) {
2477
-            $primary_registration = $this->_registration->get_primary_registration();
2478
-            $primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2479
-                : null;
2480
-            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2481
-                //in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2482
-                //custom attendee object so let's not worry about the primary reg.
2483
-                $primary_registration = null;
2484
-            }
2485
-        } else {
2486
-            $primary_registration = null;
2487
-        }
2488
-        $this->_template_args['ATT_ID']            = $attendee->ID();
2489
-        $this->_template_args['fname']             = $attendee->fname();
2490
-        $this->_template_args['lname']             = $attendee->lname();
2491
-        $this->_template_args['email']             = $attendee->email();
2492
-        $this->_template_args['phone']             = $attendee->phone();
2493
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2494
-        //edit link
2495
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2496
-            'action' => 'edit_attendee',
2497
-            'post'   => $attendee->ID(),
2498
-        ), REG_ADMIN_URL);
2499
-        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2500
-        //create link
2501
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2502
-            ? EE_Admin_Page::add_query_args_and_nonce(array(
2503
-                'action'  => 'duplicate_attendee',
2504
-                '_REG_ID' => $this->_registration->ID(),
2505
-            ), REG_ADMIN_URL) : '';
2506
-        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2507
-        $this->_template_args['att_check']    = $att_check;
2508
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2509
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2510
-    }
2511
-
2512
-
2513
-    /**
2514
-     * trash or restore registrations
2515
-     *
2516
-     * @param  boolean $trash whether to archive or restore
2517
-     * @return void
2518
-     * @throws EE_Error
2519
-     * @throws RuntimeException
2520
-     * @access protected
2521
-     */
2522
-    protected function _trash_or_restore_registrations($trash = true)
2523
-    {
2524
-        //if empty _REG_ID then get out because there's nothing to do
2525
-        if (empty($this->_req_data['_REG_ID'])) {
2526
-            EE_Error::add_error(
2527
-                sprintf(
2528
-                    esc_html__(
2529
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2530
-                        'event_espresso'
2531
-                    ),
2532
-                    $trash ? 'trash' : 'restore'
2533
-                ),
2534
-                __FILE__, __LINE__, __FUNCTION__
2535
-            );
2536
-            $this->_redirect_after_action(false, '', '', array(), true);
2537
-        }
2538
-        $success = 0;
2539
-        $overwrite_msgs = false;
2540
-        //Checkboxes
2541
-        if ( ! is_array($this->_req_data['_REG_ID'])) {
2542
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2543
-        }
2544
-        $reg_count = count($this->_req_data['_REG_ID']);
2545
-        // cycle thru checkboxes
2546
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2547
-            /** @var EE_Registration $REG */
2548
-            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2549
-            $payments = $REG->registration_payments();
2550
-            if (! empty($payments)) {
2551
-                $name = $REG->attendee() instanceof EE_Attendee
2552
-                    ? $REG->attendee()->full_name()
2553
-                    : esc_html__('Unknown Attendee', 'event_espresso');
2554
-                $overwrite_msgs = true;
2555
-                EE_Error::add_error(
2556
-                    sprintf(
2557
-                        esc_html__(
2558
-                            'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2559
-                            'event_espresso'
2560
-                        ),
2561
-                        $name
2562
-                    ),
2563
-                    __FILE__, __FUNCTION__, __LINE__
2564
-                );
2565
-                //can't trash this registration because it has payments.
2566
-                continue;
2567
-            }
2568
-            $updated = $trash ? $REG->delete() : $REG->restore();
2569
-            if ($updated) {
2570
-                $success++;
2571
-            }
2572
-        }
2573
-        $this->_redirect_after_action(
2574
-            $success === $reg_count, // were ALL registrations affected?
2575
-            $success > 1
2576
-                ? esc_html__('Registrations', 'event_espresso')
2577
-                : esc_html__('Registration', 'event_espresso'),
2578
-            $trash
2579
-                ? esc_html__('moved to the trash', 'event_espresso')
2580
-                : esc_html__('restored', 'event_espresso'),
2581
-            array('action' => 'default'),
2582
-            $overwrite_msgs
2583
-        );
2584
-    }
2585
-
2586
-
2587
-    /**
2588
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2589
-     * registration but also.
2590
-     * 1. Removing relations to EE_Attendee
2591
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2592
-     * ALSO trashed.
2593
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2594
-     * 4. Removing relationships between all tickets and the related registrations
2595
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2596
-     * 6. Deleting permanently any related Checkins.
2597
-     *
2598
-     * @return void
2599
-     * @throws EE_Error
2600
-     */
2601
-    protected function _delete_registrations()
2602
-    {
2603
-        $REG_MDL = EEM_Registration::instance();
2604
-        $success = 1;
2605
-        //Checkboxes
2606
-        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2607
-            // if array has more than one element than success message should be plural
2608
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2609
-            // cycle thru checkboxes
2610
-            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2611
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2612
-                if ( ! $REG instanceof EE_Registration) {
2613
-                    continue;
2614
-                }
2615
-                $deleted = $this->_delete_registration($REG);
2616
-                if ( ! $deleted) {
2617
-                    $success = 0;
2618
-                }
2619
-            }
2620
-        } else {
2621
-            // grab single id and delete
2622
-            $REG_ID  = $this->_req_data['_REG_ID'];
2623
-            $REG     = $REG_MDL->get_one_by_ID($REG_ID);
2624
-            $deleted = $this->_delete_registration($REG);
2625
-            if ( ! $deleted) {
2626
-                $success = 0;
2627
-            }
2628
-        }
2629
-        $what        = $success > 1
2630
-            ? esc_html__('Registrations', 'event_espresso')
2631
-            : esc_html__('Registration', 'event_espresso');
2632
-        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2633
-        $this->_redirect_after_action(
2634
-            $success,
2635
-            $what,
2636
-            $action_desc,
2637
-            array('action' => 'default'),
2638
-            true
2639
-        );
2640
-    }
2641
-
2642
-
2643
-    /**
2644
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2645
-     * models get affected.
2646
-     *
2647
-     * @param  EE_Registration $REG registration to be deleted permenantly
2648
-     * @return bool true = successful deletion, false = fail.
2649
-     * @throws EE_Error
2650
-     */
2651
-    protected function _delete_registration(EE_Registration $REG)
2652
-    {
2653
-        //first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2654
-        //registrations on the transaction that are NOT trashed.
2655
-        $TXN         = $REG->get_first_related('Transaction');
2656
-        $REGS        = $TXN->get_many_related('Registration');
2657
-        $all_trashed = true;
2658
-        foreach ($REGS as $registration) {
2659
-            if ( ! $registration->get('REG_deleted')) {
2660
-                $all_trashed = false;
2661
-            }
2662
-        }
2663
-        if ( ! $all_trashed) {
2664
-            EE_Error::add_error(
2665
-                esc_html__(
2666
-                    'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2667
-                    'event_espresso'
2668
-                ),
2669
-                __FILE__, __FUNCTION__, __LINE__
2670
-            );
2671
-            return false;
2672
-        }
2673
-        //k made it here so that means we can delete all the related transactions and their answers (but let's do them
2674
-        //separately from THIS one).
2675
-        foreach ($REGS as $registration) {
2676
-            //delete related answers
2677
-            $registration->delete_related_permanently('Answer');
2678
-            //remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2679
-            $attendee = $registration->get_first_related('Attendee');
2680
-            if ($attendee instanceof EE_Attendee) {
2681
-                $registration->_remove_relation_to($attendee, 'Attendee');
2682
-            }
2683
-            //now remove relationships to tickets on this registration.
2684
-            $registration->_remove_relations('Ticket');
2685
-            //now delete permanently the checkins related to this registration.
2686
-            $registration->delete_related_permanently('Checkin');
2687
-            if ($registration->ID() === $REG->ID()) {
2688
-                continue;
2689
-            } //we don't want to delete permanently the existing registration just yet.
2690
-            //remove relation to transaction for these registrations if NOT the existing registrations
2691
-            $registration->_remove_relations('Transaction');
2692
-            //delete permanently any related messages.
2693
-            $registration->delete_related_permanently('Message');
2694
-            //now delete this registration permanently
2695
-            $registration->delete_permanently();
2696
-        }
2697
-        //now all related registrations on the transaction are handled.  So let's just handle this registration itself
2698
-        // (the transaction and line items should be all that's left).
2699
-        // delete the line items related to the transaction for this registration.
2700
-        $TXN->delete_related_permanently('Line_Item');
2701
-        //we need to remove all the relationships on the transaction
2702
-        $TXN->delete_related_permanently('Payment');
2703
-        $TXN->delete_related_permanently('Extra_Meta');
2704
-        $TXN->delete_related_permanently('Message');
2705
-        //now we can delete this REG permanently (and the transaction of course)
2706
-        $REG->delete_related_permanently('Transaction');
2707
-        return $REG->delete_permanently();
2708
-    }
2709
-
2710
-
2711
-    /**
2712
-     *    generates HTML for the Register New Attendee Admin page
2713
-     *
2714
-     * @access private
2715
-     * @throws DomainException
2716
-     * @throws EE_Error
2717
-     */
2718
-    public function new_registration()
2719
-    {
2720
-        if ( ! $this->_set_reg_event()) {
2721
-            throw new EE_Error(
2722
-                esc_html__(
2723
-                    'Unable to continue with registering because there is no Event ID in the request',
2724
-                    'event_espresso'
2725
-                )
2726
-            );
2727
-        }
2728
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2729
-        // gotta start with a clean slate if we're not coming here via ajax
2730
-        if ( ! defined('DOING_AJAX')
2731
-             && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2732
-        ) {
2733
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2734
-        }
2735
-        $this->_template_args['event_name'] = '';
2736
-        // event name
2737
-        if ($this->_reg_event) {
2738
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2739
-            $edit_event_url                     = self::add_query_args_and_nonce(array(
2740
-                'action' => 'edit',
2741
-                'post'   => $this->_reg_event->ID(),
2742
-            ), EVENTS_ADMIN_URL);
2743
-            $edit_event_lnk                     = '<a href="'
2744
-                                                  . $edit_event_url
2745
-                                                  . '" title="'
2746
-                                                  . esc_attr__('Edit ', 'event_espresso')
2747
-                                                  . $this->_reg_event->name()
2748
-                                                  . '">'
2749
-                                                  . esc_html__('Edit Event', 'event_espresso')
2750
-                                                  . '</a>';
2751
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2752
-                                                   . $edit_event_lnk
2753
-                                                   . '</span>';
2754
-        }
2755
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2756
-        if (defined('DOING_AJAX')) {
2757
-            $this->_return_json();
2758
-        }
2759
-        // grab header
2760
-        $template_path                              =
2761
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2762
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2763
-            $this->_template_args, true);
2764
-        //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2765
-        // the details template wrapper
2766
-        $this->display_admin_page_with_sidebar();
2767
-    }
2768
-
2769
-
2770
-    /**
2771
-     * This returns the content for a registration step
2772
-     *
2773
-     * @access protected
2774
-     * @return string html
2775
-     * @throws DomainException
2776
-     * @throws EE_Error
2777
-     */
2778
-    protected function _get_registration_step_content()
2779
-    {
2780
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2781
-            $warning_msg = sprintf(
2782
-                esc_html__(
2783
-                    '%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2784
-                    'event_espresso'
2785
-                ),
2786
-                '<br />',
2787
-                '<h3 class="important-notice">',
2788
-                '</h3>',
2789
-                '<div class="float-right">',
2790
-                '<span id="redirect_timer" class="important-notice">30</span>',
2791
-                '</div>',
2792
-                '<b>',
2793
-                '</b>'
2794
-            );
2795
-            return '
2296
+	}
2297
+
2298
+
2299
+	/**
2300
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
2301
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
2302
+	 * to display the page
2303
+	 *
2304
+	 * @access protected
2305
+	 * @return void
2306
+	 * @throws EE_Error
2307
+	 */
2308
+	protected function _update_attendee_registration_form()
2309
+	{
2310
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2311
+		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2312
+			$REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2313
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
2314
+			if ($success) {
2315
+				$what  = esc_html__('Registration Form', 'event_espresso');
2316
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2317
+					: array('action' => 'default');
2318
+				$this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2319
+			}
2320
+		}
2321
+	}
2322
+
2323
+
2324
+	/**
2325
+	 * Gets the form for saving registrations custom questions (if done
2326
+	 * previously retrieves the cached form object, which may have validation errors in it)
2327
+	 *
2328
+	 * @param int $REG_ID
2329
+	 * @return EE_Registration_Custom_Questions_Form
2330
+	 * @throws EE_Error
2331
+	 */
2332
+	protected function _get_reg_custom_questions_form($REG_ID)
2333
+	{
2334
+		if ( ! $this->_reg_custom_questions_form) {
2335
+			require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2336
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2337
+				EEM_Registration::instance()->get_one_by_ID($REG_ID)
2338
+			);
2339
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
2340
+		}
2341
+		return $this->_reg_custom_questions_form;
2342
+	}
2343
+
2344
+
2345
+	/**
2346
+	 * Saves
2347
+	 *
2348
+	 * @access private
2349
+	 * @param bool $REG_ID
2350
+	 * @return bool
2351
+	 * @throws EE_Error
2352
+	 */
2353
+	private function _save_reg_custom_questions_form($REG_ID = false)
2354
+	{
2355
+		if ( ! $REG_ID) {
2356
+			EE_Error::add_error(
2357
+				esc_html__(
2358
+					'An error occurred. No registration ID was received.', 'event_espresso'),
2359
+				__FILE__, __FUNCTION__, __LINE__
2360
+			);
2361
+		}
2362
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
2363
+		$form->receive_form_submission($this->_req_data);
2364
+		$success = false;
2365
+		if ($form->is_valid()) {
2366
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
2367
+				foreach ($question_group_form->inputs() as $question_id => $input) {
2368
+					$where_conditions    = array(
2369
+						'QST_ID' => $question_id,
2370
+						'REG_ID' => $REG_ID,
2371
+					);
2372
+					$possibly_new_values = array(
2373
+						'ANS_value' => $input->normalized_value(),
2374
+					);
2375
+					$answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2376
+					if ($answer instanceof EE_Answer) {
2377
+						$success = $answer->save($possibly_new_values);
2378
+					} else {
2379
+						//insert it then
2380
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2381
+						$answer      = EE_Answer::new_instance($cols_n_vals);
2382
+						$success     = $answer->save();
2383
+					}
2384
+				}
2385
+			}
2386
+		} else {
2387
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2388
+		}
2389
+		return $success;
2390
+	}
2391
+
2392
+
2393
+	/**
2394
+	 *        generates HTML for the Registration main meta box
2395
+	 *
2396
+	 * @access public
2397
+	 * @return void
2398
+	 * @throws DomainException
2399
+	 * @throws EE_Error
2400
+	 */
2401
+	public function _reg_attendees_meta_box()
2402
+	{
2403
+		$REG = EEM_Registration::instance();
2404
+		//get all other registrations on this transaction, and cache
2405
+		//the attendees for them so we don't have to run another query using force_join
2406
+		$registrations                           = $REG->get_all(array(
2407
+			array(
2408
+				'TXN_ID' => $this->_registration->transaction_ID(),
2409
+				'REG_ID' => array('!=', $this->_registration->ID()),
2410
+			),
2411
+			'force_join' => array('Attendee'),
2412
+		));
2413
+		$this->_template_args['attendees']       = array();
2414
+		$this->_template_args['attendee_notice'] = '';
2415
+		if (empty($registrations)
2416
+			|| (is_array($registrations)
2417
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2418
+		) {
2419
+			EE_Error::add_error(
2420
+				esc_html__(
2421
+					'There are no records attached to this registration. Something may have gone wrong with the registration',
2422
+					'event_espresso'
2423
+				), __FILE__, __FUNCTION__, __LINE__
2424
+			);
2425
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2426
+		} else {
2427
+			$att_nmbr = 1;
2428
+			foreach ($registrations as $registration) {
2429
+				/* @var $registration EE_Registration */
2430
+				$attendee                                                    = $registration->attendee()
2431
+					? $registration->attendee()
2432
+					: EEM_Attendee::instance()
2433
+								  ->create_default_object();
2434
+				$this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2435
+				$this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2436
+				$this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2437
+				$this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2438
+				$this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2439
+				$this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2440
+					', ',
2441
+					$attendee->full_address_as_array()
2442
+				);
2443
+				$this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2444
+					array(
2445
+						'action' => 'edit_attendee',
2446
+						'post'   => $attendee->ID(),
2447
+					),
2448
+					REG_ADMIN_URL
2449
+				);
2450
+				$this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2451
+				$att_nmbr++;
2452
+			}
2453
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2454
+		}
2455
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2456
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2457
+	}
2458
+
2459
+
2460
+	/**
2461
+	 *        generates HTML for the Edit Registration side meta box
2462
+	 *
2463
+	 * @access public
2464
+	 * @return void
2465
+	 * @throws DomainException
2466
+	 * @throws EE_Error
2467
+	 */
2468
+	public function _reg_registrant_side_meta_box()
2469
+	{
2470
+		/*@var $attendee EE_Attendee */
2471
+		$att_check = $this->_registration->attendee();
2472
+		$attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2473
+		//now let's determine if this is not the primary registration.  If it isn't then we set the
2474
+		//primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2475
+		//primary registration object (that way we know if we need to show create button or not)
2476
+		if ( ! $this->_registration->is_primary_registrant()) {
2477
+			$primary_registration = $this->_registration->get_primary_registration();
2478
+			$primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2479
+				: null;
2480
+			if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2481
+				//in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2482
+				//custom attendee object so let's not worry about the primary reg.
2483
+				$primary_registration = null;
2484
+			}
2485
+		} else {
2486
+			$primary_registration = null;
2487
+		}
2488
+		$this->_template_args['ATT_ID']            = $attendee->ID();
2489
+		$this->_template_args['fname']             = $attendee->fname();
2490
+		$this->_template_args['lname']             = $attendee->lname();
2491
+		$this->_template_args['email']             = $attendee->email();
2492
+		$this->_template_args['phone']             = $attendee->phone();
2493
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2494
+		//edit link
2495
+		$this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2496
+			'action' => 'edit_attendee',
2497
+			'post'   => $attendee->ID(),
2498
+		), REG_ADMIN_URL);
2499
+		$this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2500
+		//create link
2501
+		$this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2502
+			? EE_Admin_Page::add_query_args_and_nonce(array(
2503
+				'action'  => 'duplicate_attendee',
2504
+				'_REG_ID' => $this->_registration->ID(),
2505
+			), REG_ADMIN_URL) : '';
2506
+		$this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2507
+		$this->_template_args['att_check']    = $att_check;
2508
+		$template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2509
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2510
+	}
2511
+
2512
+
2513
+	/**
2514
+	 * trash or restore registrations
2515
+	 *
2516
+	 * @param  boolean $trash whether to archive or restore
2517
+	 * @return void
2518
+	 * @throws EE_Error
2519
+	 * @throws RuntimeException
2520
+	 * @access protected
2521
+	 */
2522
+	protected function _trash_or_restore_registrations($trash = true)
2523
+	{
2524
+		//if empty _REG_ID then get out because there's nothing to do
2525
+		if (empty($this->_req_data['_REG_ID'])) {
2526
+			EE_Error::add_error(
2527
+				sprintf(
2528
+					esc_html__(
2529
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2530
+						'event_espresso'
2531
+					),
2532
+					$trash ? 'trash' : 'restore'
2533
+				),
2534
+				__FILE__, __LINE__, __FUNCTION__
2535
+			);
2536
+			$this->_redirect_after_action(false, '', '', array(), true);
2537
+		}
2538
+		$success = 0;
2539
+		$overwrite_msgs = false;
2540
+		//Checkboxes
2541
+		if ( ! is_array($this->_req_data['_REG_ID'])) {
2542
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2543
+		}
2544
+		$reg_count = count($this->_req_data['_REG_ID']);
2545
+		// cycle thru checkboxes
2546
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2547
+			/** @var EE_Registration $REG */
2548
+			$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2549
+			$payments = $REG->registration_payments();
2550
+			if (! empty($payments)) {
2551
+				$name = $REG->attendee() instanceof EE_Attendee
2552
+					? $REG->attendee()->full_name()
2553
+					: esc_html__('Unknown Attendee', 'event_espresso');
2554
+				$overwrite_msgs = true;
2555
+				EE_Error::add_error(
2556
+					sprintf(
2557
+						esc_html__(
2558
+							'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2559
+							'event_espresso'
2560
+						),
2561
+						$name
2562
+					),
2563
+					__FILE__, __FUNCTION__, __LINE__
2564
+				);
2565
+				//can't trash this registration because it has payments.
2566
+				continue;
2567
+			}
2568
+			$updated = $trash ? $REG->delete() : $REG->restore();
2569
+			if ($updated) {
2570
+				$success++;
2571
+			}
2572
+		}
2573
+		$this->_redirect_after_action(
2574
+			$success === $reg_count, // were ALL registrations affected?
2575
+			$success > 1
2576
+				? esc_html__('Registrations', 'event_espresso')
2577
+				: esc_html__('Registration', 'event_espresso'),
2578
+			$trash
2579
+				? esc_html__('moved to the trash', 'event_espresso')
2580
+				: esc_html__('restored', 'event_espresso'),
2581
+			array('action' => 'default'),
2582
+			$overwrite_msgs
2583
+		);
2584
+	}
2585
+
2586
+
2587
+	/**
2588
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2589
+	 * registration but also.
2590
+	 * 1. Removing relations to EE_Attendee
2591
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2592
+	 * ALSO trashed.
2593
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2594
+	 * 4. Removing relationships between all tickets and the related registrations
2595
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2596
+	 * 6. Deleting permanently any related Checkins.
2597
+	 *
2598
+	 * @return void
2599
+	 * @throws EE_Error
2600
+	 */
2601
+	protected function _delete_registrations()
2602
+	{
2603
+		$REG_MDL = EEM_Registration::instance();
2604
+		$success = 1;
2605
+		//Checkboxes
2606
+		if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2607
+			// if array has more than one element than success message should be plural
2608
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2609
+			// cycle thru checkboxes
2610
+			while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2611
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2612
+				if ( ! $REG instanceof EE_Registration) {
2613
+					continue;
2614
+				}
2615
+				$deleted = $this->_delete_registration($REG);
2616
+				if ( ! $deleted) {
2617
+					$success = 0;
2618
+				}
2619
+			}
2620
+		} else {
2621
+			// grab single id and delete
2622
+			$REG_ID  = $this->_req_data['_REG_ID'];
2623
+			$REG     = $REG_MDL->get_one_by_ID($REG_ID);
2624
+			$deleted = $this->_delete_registration($REG);
2625
+			if ( ! $deleted) {
2626
+				$success = 0;
2627
+			}
2628
+		}
2629
+		$what        = $success > 1
2630
+			? esc_html__('Registrations', 'event_espresso')
2631
+			: esc_html__('Registration', 'event_espresso');
2632
+		$action_desc = esc_html__('permanently deleted.', 'event_espresso');
2633
+		$this->_redirect_after_action(
2634
+			$success,
2635
+			$what,
2636
+			$action_desc,
2637
+			array('action' => 'default'),
2638
+			true
2639
+		);
2640
+	}
2641
+
2642
+
2643
+	/**
2644
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2645
+	 * models get affected.
2646
+	 *
2647
+	 * @param  EE_Registration $REG registration to be deleted permenantly
2648
+	 * @return bool true = successful deletion, false = fail.
2649
+	 * @throws EE_Error
2650
+	 */
2651
+	protected function _delete_registration(EE_Registration $REG)
2652
+	{
2653
+		//first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2654
+		//registrations on the transaction that are NOT trashed.
2655
+		$TXN         = $REG->get_first_related('Transaction');
2656
+		$REGS        = $TXN->get_many_related('Registration');
2657
+		$all_trashed = true;
2658
+		foreach ($REGS as $registration) {
2659
+			if ( ! $registration->get('REG_deleted')) {
2660
+				$all_trashed = false;
2661
+			}
2662
+		}
2663
+		if ( ! $all_trashed) {
2664
+			EE_Error::add_error(
2665
+				esc_html__(
2666
+					'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2667
+					'event_espresso'
2668
+				),
2669
+				__FILE__, __FUNCTION__, __LINE__
2670
+			);
2671
+			return false;
2672
+		}
2673
+		//k made it here so that means we can delete all the related transactions and their answers (but let's do them
2674
+		//separately from THIS one).
2675
+		foreach ($REGS as $registration) {
2676
+			//delete related answers
2677
+			$registration->delete_related_permanently('Answer');
2678
+			//remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2679
+			$attendee = $registration->get_first_related('Attendee');
2680
+			if ($attendee instanceof EE_Attendee) {
2681
+				$registration->_remove_relation_to($attendee, 'Attendee');
2682
+			}
2683
+			//now remove relationships to tickets on this registration.
2684
+			$registration->_remove_relations('Ticket');
2685
+			//now delete permanently the checkins related to this registration.
2686
+			$registration->delete_related_permanently('Checkin');
2687
+			if ($registration->ID() === $REG->ID()) {
2688
+				continue;
2689
+			} //we don't want to delete permanently the existing registration just yet.
2690
+			//remove relation to transaction for these registrations if NOT the existing registrations
2691
+			$registration->_remove_relations('Transaction');
2692
+			//delete permanently any related messages.
2693
+			$registration->delete_related_permanently('Message');
2694
+			//now delete this registration permanently
2695
+			$registration->delete_permanently();
2696
+		}
2697
+		//now all related registrations on the transaction are handled.  So let's just handle this registration itself
2698
+		// (the transaction and line items should be all that's left).
2699
+		// delete the line items related to the transaction for this registration.
2700
+		$TXN->delete_related_permanently('Line_Item');
2701
+		//we need to remove all the relationships on the transaction
2702
+		$TXN->delete_related_permanently('Payment');
2703
+		$TXN->delete_related_permanently('Extra_Meta');
2704
+		$TXN->delete_related_permanently('Message');
2705
+		//now we can delete this REG permanently (and the transaction of course)
2706
+		$REG->delete_related_permanently('Transaction');
2707
+		return $REG->delete_permanently();
2708
+	}
2709
+
2710
+
2711
+	/**
2712
+	 *    generates HTML for the Register New Attendee Admin page
2713
+	 *
2714
+	 * @access private
2715
+	 * @throws DomainException
2716
+	 * @throws EE_Error
2717
+	 */
2718
+	public function new_registration()
2719
+	{
2720
+		if ( ! $this->_set_reg_event()) {
2721
+			throw new EE_Error(
2722
+				esc_html__(
2723
+					'Unable to continue with registering because there is no Event ID in the request',
2724
+					'event_espresso'
2725
+				)
2726
+			);
2727
+		}
2728
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2729
+		// gotta start with a clean slate if we're not coming here via ajax
2730
+		if ( ! defined('DOING_AJAX')
2731
+			 && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2732
+		) {
2733
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2734
+		}
2735
+		$this->_template_args['event_name'] = '';
2736
+		// event name
2737
+		if ($this->_reg_event) {
2738
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2739
+			$edit_event_url                     = self::add_query_args_and_nonce(array(
2740
+				'action' => 'edit',
2741
+				'post'   => $this->_reg_event->ID(),
2742
+			), EVENTS_ADMIN_URL);
2743
+			$edit_event_lnk                     = '<a href="'
2744
+												  . $edit_event_url
2745
+												  . '" title="'
2746
+												  . esc_attr__('Edit ', 'event_espresso')
2747
+												  . $this->_reg_event->name()
2748
+												  . '">'
2749
+												  . esc_html__('Edit Event', 'event_espresso')
2750
+												  . '</a>';
2751
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2752
+												   . $edit_event_lnk
2753
+												   . '</span>';
2754
+		}
2755
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2756
+		if (defined('DOING_AJAX')) {
2757
+			$this->_return_json();
2758
+		}
2759
+		// grab header
2760
+		$template_path                              =
2761
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2762
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2763
+			$this->_template_args, true);
2764
+		//$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2765
+		// the details template wrapper
2766
+		$this->display_admin_page_with_sidebar();
2767
+	}
2768
+
2769
+
2770
+	/**
2771
+	 * This returns the content for a registration step
2772
+	 *
2773
+	 * @access protected
2774
+	 * @return string html
2775
+	 * @throws DomainException
2776
+	 * @throws EE_Error
2777
+	 */
2778
+	protected function _get_registration_step_content()
2779
+	{
2780
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2781
+			$warning_msg = sprintf(
2782
+				esc_html__(
2783
+					'%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2784
+					'event_espresso'
2785
+				),
2786
+				'<br />',
2787
+				'<h3 class="important-notice">',
2788
+				'</h3>',
2789
+				'<div class="float-right">',
2790
+				'<span id="redirect_timer" class="important-notice">30</span>',
2791
+				'</div>',
2792
+				'<b>',
2793
+				'</b>'
2794
+			);
2795
+			return '
2796 2796
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2797 2797
 	<script >
2798 2798
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2805,792 +2805,792 @@  discard block
 block discarded – undo
2805 2805
 	        }
2806 2806
 	    }, 800 );
2807 2807
 	</script >';
2808
-        }
2809
-        $template_args = array(
2810
-            'title'                    => '',
2811
-            'content'                  => '',
2812
-            'step_button_text'         => '',
2813
-            'show_notification_toggle' => false,
2814
-        );
2815
-        //to indicate we're processing a new registration
2816
-        $hidden_fields = array(
2817
-            'processing_registration' => array(
2818
-                'type'  => 'hidden',
2819
-                'value' => 0,
2820
-            ),
2821
-            'event_id'                => array(
2822
-                'type'  => 'hidden',
2823
-                'value' => $this->_reg_event->ID(),
2824
-            ),
2825
-        );
2826
-        //if the cart is empty then we know we're at step one so we'll display ticket selector
2827
-        $cart = EE_Registry::instance()->SSN->cart();
2828
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2829
-        switch ($step) {
2830
-            case 'ticket' :
2831
-                $hidden_fields['processing_registration']['value'] = 1;
2832
-                $template_args['title']                            = esc_html__(
2833
-                    'Step One: Select the Ticket for this registration',
2834
-                    'event_espresso'
2835
-                );
2836
-                $template_args['content']                          =
2837
-                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2838
-                $template_args['step_button_text']                 = esc_html__(
2839
-                    'Add Tickets and Continue to Registrant Details',
2840
-                    'event_espresso'
2841
-                );
2842
-                $template_args['show_notification_toggle']         = false;
2843
-                break;
2844
-            case 'questions' :
2845
-                $hidden_fields['processing_registration']['value'] = 2;
2846
-                $template_args['title']                            = esc_html__(
2847
-                    'Step Two: Add Registrant Details for this Registration',
2848
-                    'event_espresso'
2849
-                );
2850
-                //in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2851
-                // properly by the first process_reg_step run.
2852
-                $template_args['content']                  =
2853
-                    EED_Single_Page_Checkout::registration_checkout_for_admin();
2854
-                $template_args['step_button_text']         = esc_html__(
2855
-                    'Save Registration and Continue to Details',
2856
-                    'event_espresso'
2857
-                );
2858
-                $template_args['show_notification_toggle'] = true;
2859
-                break;
2860
-        }
2861
-        //we come back to the process_registration_step route.
2862
-        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2863
-        return EEH_Template::display_template(
2864
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2865
-            $template_args,
2866
-            true
2867
-        );
2868
-    }
2869
-
2870
-
2871
-    /**
2872
-     *        set_reg_event
2873
-     *
2874
-     * @access private
2875
-     * @return bool
2876
-     * @throws EE_Error
2877
-     */
2878
-    private function _set_reg_event()
2879
-    {
2880
-        if (is_object($this->_reg_event)) {
2881
-            return true;
2882
-        }
2883
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2884
-        if ( ! $EVT_ID) {
2885
-            return false;
2886
-        }
2887
-        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2888
-        return true;
2889
-    }
2890
-
2891
-
2892
-    /**
2893
-     * process_reg_step
2894
-     *
2895
-     * @access        public
2896
-     * @return string
2897
-     * @throws DomainException
2898
-     * @throws EE_Error
2899
-     * @throws RuntimeException
2900
-     */
2901
-    public function process_reg_step()
2902
-    {
2903
-        EE_System::do_not_cache();
2904
-        $this->_set_reg_event();
2905
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2906
-        EE_Registry::instance()->REQ->set('uts', time());
2907
-        //what step are we on?
2908
-        $cart = EE_Registry::instance()->SSN->cart();
2909
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2910
-        //if doing ajax then we need to verify the nonce
2911
-        if (defined('DOING_AJAX')) {
2912
-            $nonce = isset($this->_req_data[$this->_req_nonce])
2913
-                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2914
-            $this->_verify_nonce($nonce, $this->_req_nonce);
2915
-        }
2916
-        switch ($step) {
2917
-            case 'ticket' :
2918
-                //process ticket selection
2919
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
2920
-                if ($success) {
2921
-                    EE_Error::add_success(
2922
-                        esc_html__(
2923
-                            'Tickets Selected. Now complete the registration.',
2924
-                            'event_espresso'
2925
-                        )
2926
-                    );
2927
-                } else {
2928
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
2929
-                }
2930
-                if (defined('DOING_AJAX')) {
2931
-                    $this->new_registration(); //display next step
2932
-                } else {
2933
-                    $query_args = array(
2934
-                        'action'                  => 'new_registration',
2935
-                        'processing_registration' => 1,
2936
-                        'event_id'                => $this->_reg_event->ID(),
2937
-                        'uts'                     => time(),
2938
-                    );
2939
-                    $this->_redirect_after_action(
2940
-                        false,
2941
-                        '',
2942
-                        '',
2943
-                        $query_args,
2944
-                        true
2945
-                    );
2946
-                }
2947
-                break;
2948
-            case 'questions' :
2949
-                if (! isset(
2950
-                    $this->_req_data['txn_reg_status_change'],
2951
-                    $this->_req_data['txn_reg_status_change']['send_notifications'])
2952
-                ) {
2953
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2954
-                }
2955
-                //process registration
2956
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2957
-                if ($cart instanceof EE_Cart) {
2958
-                    $grand_total = $cart->get_cart_grand_total();
2959
-                    if ($grand_total instanceof EE_Line_Item) {
2960
-                        $grand_total->save_this_and_descendants_to_txn();
2961
-                    }
2962
-                }
2963
-                if ( ! $transaction instanceof EE_Transaction) {
2964
-                    $query_args = array(
2965
-                        'action'                  => 'new_registration',
2966
-                        'processing_registration' => 2,
2967
-                        'event_id'                => $this->_reg_event->ID(),
2968
-                        'uts'                     => time(),
2969
-                    );
2970
-                    if (defined('DOING_AJAX')) {
2971
-                        //display registration form again because there are errors (maybe validation?)
2972
-                        $this->new_registration();
2973
-                        return;
2974
-                    } else {
2975
-                        $this->_redirect_after_action(
2976
-                            false,
2977
-                            '',
2978
-                            '',
2979
-                            $query_args,
2980
-                            true
2981
-                        );
2982
-                        return;
2983
-                    }
2984
-                }
2985
-                // maybe update status, and make sure to save transaction if not done already
2986
-                if ( ! $transaction->update_status_based_on_total_paid()) {
2987
-                    $transaction->save();
2988
-                }
2989
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2990
-                $this->_req_data = array();
2991
-                $query_args      = array(
2992
-                    'action'        => 'redirect_to_txn',
2993
-                    'TXN_ID'        => $transaction->ID(),
2994
-                    'EVT_ID'        => $this->_reg_event->ID(),
2995
-                    'event_name'    => urlencode($this->_reg_event->name()),
2996
-                    'redirect_from' => 'new_registration',
2997
-                );
2998
-                $this->_redirect_after_action(false, '', '', $query_args, true);
2999
-                break;
3000
-        }
3001
-        //what are you looking here for?  Should be nothing to do at this point.
3002
-    }
3003
-
3004
-
3005
-    /**
3006
-     * redirect_to_txn
3007
-     *
3008
-     * @access public
3009
-     * @return void
3010
-     * @throws EE_Error
3011
-     */
3012
-    public function redirect_to_txn()
3013
-    {
3014
-        EE_System::do_not_cache();
3015
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3016
-        $query_args = array(
3017
-            'action' => 'view_transaction',
3018
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3019
-            'page'   => 'espresso_transactions',
3020
-        );
3021
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3022
-            $query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
3023
-            $query_args['event_name']    = urlencode($this->_req_data['event_name']);
3024
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
3025
-        }
3026
-        EE_Error::add_success(
3027
-            esc_html__(
3028
-                'Registration Created.  Please review the transaction and add any payments as necessary',
3029
-                'event_espresso'
3030
-            )
3031
-        );
3032
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3033
-    }
3034
-
3035
-
3036
-    /**
3037
-     *        generates HTML for the Attendee Contact List
3038
-     *
3039
-     * @access protected
3040
-     * @return void
3041
-     */
3042
-    protected function _attendee_contact_list_table()
3043
-    {
3044
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3045
-        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3046
-        $this->display_admin_list_table_page_with_no_sidebar();
3047
-    }
3048
-
3049
-
3050
-    /**
3051
-     *        get_attendees
3052
-     *
3053
-     * @param      $per_page
3054
-     * @param bool $count whether to return count or data.
3055
-     * @param bool $trash
3056
-     * @return array
3057
-     * @throws EE_Error
3058
-     * @access public
3059
-     */
3060
-    public function get_attendees($per_page, $count = false, $trash = false)
3061
-    {
3062
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3063
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3064
-        $ATT_MDL                    = EEM_Attendee::instance();
3065
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3066
-        switch ($this->_req_data['orderby']) {
3067
-            case 'ATT_ID':
3068
-                $orderby = 'ATT_ID';
3069
-                break;
3070
-            case 'ATT_fname':
3071
-                $orderby = 'ATT_fname';
3072
-                break;
3073
-            case 'ATT_email':
3074
-                $orderby = 'ATT_email';
3075
-                break;
3076
-            case 'ATT_city':
3077
-                $orderby = 'ATT_city';
3078
-                break;
3079
-            case 'STA_ID':
3080
-                $orderby = 'STA_ID';
3081
-                break;
3082
-            case 'CNT_ID':
3083
-                $orderby = 'CNT_ID';
3084
-                break;
3085
-            default:
3086
-                $orderby = 'ATT_lname';
3087
-        }
3088
-        $sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3089
-            ? $this->_req_data['order']
3090
-            : 'ASC';
3091
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3092
-            ? $this->_req_data['paged']
3093
-            : 1;
3094
-        $per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3095
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3096
-            ? $this->_req_data['perpage']
3097
-            : $per_page;
3098
-        $_where       = array();
3099
-        if ( ! empty($this->_req_data['s'])) {
3100
-            $sstr         = '%' . $this->_req_data['s'] . '%';
3101
-            $_where['OR'] = array(
3102
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3103
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3104
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3105
-                'ATT_fname'                         => array('LIKE', $sstr),
3106
-                'ATT_lname'                         => array('LIKE', $sstr),
3107
-                'ATT_short_bio'                     => array('LIKE', $sstr),
3108
-                'ATT_email'                         => array('LIKE', $sstr),
3109
-                'ATT_address'                       => array('LIKE', $sstr),
3110
-                'ATT_address2'                      => array('LIKE', $sstr),
3111
-                'ATT_city'                          => array('LIKE', $sstr),
3112
-                'Country.CNT_name'                  => array('LIKE', $sstr),
3113
-                'State.STA_name'                    => array('LIKE', $sstr),
3114
-                'ATT_phone'                         => array('LIKE', $sstr),
3115
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
3116
-                'Registration.REG_code'             => array('LIKE', $sstr),
3117
-                'Registration.REG_count'            => array('LIKE', $sstr),
3118
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
3119
-            );
3120
-        }
3121
-        $offset = ($current_page - 1) * $per_page;
3122
-        $limit  = $count ? null : array($offset, $per_page);
3123
-        if ($trash) {
3124
-            $_where['status'] = array('!=', 'publish');
3125
-            $all_attendees    = $count
3126
-                ? $ATT_MDL->count(array(
3127
-                    $_where,
3128
-                    'order_by' => array($orderby => $sort),
3129
-                    'limit'    => $limit,
3130
-                ), 'ATT_ID', true)
3131
-                : $ATT_MDL->get_all(array(
3132
-                    $_where,
3133
-                    'order_by' => array($orderby => $sort),
3134
-                    'limit'    => $limit,
3135
-                ));
3136
-        } else {
3137
-            $_where['status'] = array('IN', array('publish'));
3138
-            $all_attendees    = $count
3139
-                ? $ATT_MDL->count(array(
3140
-                    $_where,
3141
-                    'order_by' => array($orderby => $sort),
3142
-                    'limit'    => $limit,
3143
-                ), 'ATT_ID', true)
3144
-                : $ATT_MDL->get_all(array(
3145
-                    $_where,
3146
-                    'order_by' => array($orderby => $sort),
3147
-                    'limit'    => $limit,
3148
-                ));
3149
-        }
3150
-        return $all_attendees;
3151
-    }
3152
-
3153
-
3154
-    /**
3155
-     * This is just taking care of resending the registration confirmation
3156
-     *
3157
-     * @access protected
3158
-     * @return void
3159
-     */
3160
-    protected function _resend_registration()
3161
-    {
3162
-        $this->_process_resend_registration();
3163
-        $query_args = isset($this->_req_data['redirect_to'])
3164
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3165
-            : array('action' => 'default');
3166
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3167
-    }
3168
-
3169
-    /**
3170
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3171
-     * to use when selecting registrations
3172
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3173
-     *                                                     the query parameters from the request
3174
-     * @return void ends the request with a redirect or download
3175
-     */
3176
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3177
-    {
3178
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3179
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3180
-                array(
3181
-                    'page'        => 'espresso_batch',
3182
-                    'batch'       => 'file',
3183
-                    'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3184
-                    'filters'     => urlencode(
3185
-                        serialize(
3186
-                            call_user_func(
3187
-                                array( $this, $method_name_for_getting_query_params ),
3188
-                                EEH_Array::is_set(
3189
-                                    $this->_req_data,
3190
-                                    'filters',
3191
-                                    array()
3192
-                                )
3193
-                            )
3194
-                        )
3195
-                ),
3196
-                'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3197
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3198
-                'return_url'  => urlencode($this->_req_data['return_url']),
3199
-            )));
3200
-        } else {
3201
-            $new_request_args = array(
3202
-                'export' => 'report',
3203
-                'action' => 'registrations_report_for_event',
3204
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3205
-            );
3206
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3207
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3208
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3209
-                $EE_Export = EE_Export::instance($this->_req_data);
3210
-                $EE_Export->export();
3211
-            }
3212
-        }
3213
-    }
3214
-
3215
-
3216
-
3217
-    /**
3218
-     * Creates a registration report using only query parameters in the request
3219
-     * @return void
3220
-     */
3221
-    public function _registrations_report()
3222
-    {
3223
-        $this->_registrations_report_base('_get_registration_query_parameters');
3224
-    }
3225
-
3226
-
3227
-    public function _contact_list_export()
3228
-    {
3229
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3230
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3231
-            $EE_Export = EE_Export::instance($this->_req_data);
3232
-            $EE_Export->export_attendees();
3233
-        }
3234
-    }
3235
-
3236
-
3237
-    public function _contact_list_report()
3238
-    {
3239
-        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3240
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3241
-                'page'        => 'espresso_batch',
3242
-                'batch'       => 'file',
3243
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3244
-                'return_url'  => urlencode($this->_req_data['return_url']),
3245
-            )));
3246
-        } else {
3247
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3248
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3249
-                $EE_Export = EE_Export::instance($this->_req_data);
3250
-                $EE_Export->report_attendees();
3251
-            }
3252
-        }
3253
-    }
3254
-
3255
-
3256
-
3257
-
3258
-
3259
-    /***************************************        ATTENDEE DETAILS        ***************************************/
3260
-    /**
3261
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3262
-     *
3263
-     * @return void
3264
-     * @throws EE_Error
3265
-     */
3266
-    protected function _duplicate_attendee()
3267
-    {
3268
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3269
-        //verify we have necessary info
3270
-        if (empty($this->_req_data['_REG_ID'])) {
3271
-            EE_Error::add_error(
3272
-                esc_html__(
3273
-                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3274
-                    'event_espresso'
3275
-                ), __FILE__, __LINE__, __FUNCTION__
3276
-            );
3277
-            $query_args = array('action' => $action);
3278
-            $this->_redirect_after_action('', '', '', $query_args, true);
3279
-        }
3280
-        //okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3281
-        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3282
-        $attendee     = $registration->attendee();
3283
-        //remove relation of existing attendee on registration
3284
-        $registration->_remove_relation_to($attendee, 'Attendee');
3285
-        //new attendee
3286
-        $new_attendee = clone $attendee;
3287
-        $new_attendee->set('ATT_ID', 0);
3288
-        $new_attendee->save();
3289
-        //add new attendee to reg
3290
-        $registration->_add_relation_to($new_attendee, 'Attendee');
3291
-        EE_Error::add_success(
3292
-            esc_html__(
3293
-                'New Contact record created.  Now make any edits you wish to make for this contact.',
3294
-                'event_espresso'
3295
-            )
3296
-        );
3297
-        //redirect to edit page for attendee
3298
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3299
-        $this->_redirect_after_action('', '', '', $query_args, true);
3300
-    }
3301
-
3302
-
3303
-    //related to cpt routes
3304
-    protected function _insert_update_cpt_item($post_id, $post)
3305
-    {
3306
-        $success  = true;
3307
-        $attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
3308
-        //for attendee updates
3309
-        if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
3310
-            //note we should only be UPDATING attendees at this point.
3311
-            $updated_fields = array(
3312
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
3313
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
3314
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3315
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3316
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3317
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3318
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3319
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3320
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3321
-                'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
3322
-                'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
3323
-            );
3324
-            foreach ($updated_fields as $field => $value) {
3325
-                $attendee->set($field, $value);
3326
-            }
3327
-            $success                   = $attendee->save();
3328
-            $attendee_update_callbacks = apply_filters(
3329
-                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3330
-                array()
3331
-            );
3332
-            foreach ($attendee_update_callbacks as $a_callback) {
3333
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3334
-                    throw new EE_Error(
3335
-                        sprintf(
3336
-                            esc_html__(
3337
-                                'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3338
-                                'event_espresso'
3339
-                            ),
3340
-                            $a_callback
3341
-                        )
3342
-                    );
3343
-                }
3344
-            }
3345
-        }
3346
-        if ($success === false) {
3347
-            EE_Error::add_error(
3348
-                esc_html__(
3349
-                    'Something went wrong with updating the meta table data for the registration.',
3350
-                    'event_espresso'
3351
-                ),
3352
-                __FILE__, __FUNCTION__, __LINE__
3353
-            );
3354
-        }
3355
-    }
3356
-
3357
-
3358
-    public function trash_cpt_item($post_id)
3359
-    {
3360
-    }
3361
-
3362
-
3363
-    public function delete_cpt_item($post_id)
3364
-    {
3365
-    }
3366
-
3367
-
3368
-    public function restore_cpt_item($post_id)
3369
-    {
3370
-    }
3371
-
3372
-
3373
-    protected function _restore_cpt_item($post_id, $revision_id)
3374
-    {
3375
-    }
3376
-
3377
-
3378
-    public function attendee_editor_metaboxes()
3379
-    {
3380
-        $this->verify_cpt_object();
3381
-        remove_meta_box(
3382
-            'postexcerpt',
3383
-            esc_html__('Excerpt', 'event_espresso'),
3384
-            'post_excerpt_meta_box',
3385
-            $this->_cpt_routes[$this->_req_action],
3386
-            'normal',
3387
-            'core'
3388
-        );
3389
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3390
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
3391
-            add_meta_box(
3392
-                'postexcerpt',
3393
-                esc_html__('Short Biography', 'event_espresso'),
3394
-                'post_excerpt_meta_box',
3395
-                $this->_cpt_routes[$this->_req_action],
3396
-                'normal'
3397
-            );
3398
-        }
3399
-        if (post_type_supports('espresso_attendees', 'comments')) {
3400
-            add_meta_box(
3401
-                'commentsdiv',
3402
-                esc_html__('Notes on the Contact', 'event_espresso'),
3403
-                'post_comment_meta_box',
3404
-                $this->_cpt_routes[$this->_req_action],
3405
-                'normal',
3406
-                'core'
3407
-            );
3408
-        }
3409
-        add_meta_box(
3410
-            'attendee_contact_info',
3411
-            esc_html__('Contact Info', 'event_espresso'),
3412
-            array($this, 'attendee_contact_info'),
3413
-            $this->_cpt_routes[$this->_req_action],
3414
-            'side',
3415
-            'core'
3416
-        );
3417
-        add_meta_box(
3418
-            'attendee_details_address',
3419
-            esc_html__('Address Details', 'event_espresso'),
3420
-            array($this, 'attendee_address_details'),
3421
-            $this->_cpt_routes[$this->_req_action],
3422
-            'normal',
3423
-            'core'
3424
-        );
3425
-        add_meta_box(
3426
-            'attendee_registrations',
3427
-            esc_html__('Registrations for this Contact', 'event_espresso'),
3428
-            array($this, 'attendee_registrations_meta_box'),
3429
-            $this->_cpt_routes[$this->_req_action],
3430
-            'normal',
3431
-            'high'
3432
-        );
3433
-    }
3434
-
3435
-
3436
-    /**
3437
-     * Metabox for attendee contact info
3438
-     *
3439
-     * @param  WP_Post $post wp post object
3440
-     * @return string attendee contact info ( and form )
3441
-     * @throws DomainException
3442
-     */
3443
-    public function attendee_contact_info($post)
3444
-    {
3445
-        //get attendee object ( should already have it )
3446
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3447
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3448
-        EEH_Template::display_template($template, $this->_template_args);
3449
-    }
3450
-
3451
-
3452
-    /**
3453
-     * Metabox for attendee details
3454
-     *
3455
-     * @param  WP_Post $post wp post object
3456
-     * @return string attendee address details (and form)
3457
-     * @throws DomainException
3458
-     */
3459
-    public function attendee_address_details($post)
3460
-    {
3461
-        //get attendee object (should already have it)
3462
-        $this->_template_args['attendee']     = $this->_cpt_model_obj;
3463
-        $this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3464
-            new EE_Question_Form_Input(
3465
-                EE_Question::new_instance(
3466
-                    array(
3467
-                        'QST_ID'           => 0,
3468
-                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3469
-                        'QST_system'       => 'admin-state',
3470
-                    )
3471
-                ),
3472
-                EE_Answer::new_instance(
3473
-                    array(
3474
-                        'ANS_ID'    => 0,
3475
-                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3476
-                    )
3477
-                ),
3478
-                array(
3479
-                    'input_id'       => 'STA_ID',
3480
-                    'input_name'     => 'STA_ID',
3481
-                    'input_prefix'   => '',
3482
-                    'append_qstn_id' => false,
3483
-                )
3484
-            )
3485
-        );
3486
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3487
-            new EE_Question_Form_Input(
3488
-                EE_Question::new_instance(
3489
-                    array(
3490
-                        'QST_ID'           => 0,
3491
-                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3492
-                        'QST_system'       => 'admin-country',
3493
-                    )
3494
-                ),
3495
-                EE_Answer::new_instance(
3496
-                    array(
3497
-                        'ANS_ID'    => 0,
3498
-                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3499
-                    )
3500
-                ),
3501
-                array(
3502
-                    'input_id'       => 'CNT_ISO',
3503
-                    'input_name'     => 'CNT_ISO',
3504
-                    'input_prefix'   => '',
3505
-                    'append_qstn_id' => false,
3506
-                )
3507
-            )
3508
-        );
3509
-        $template                             =
3510
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3511
-        EEH_Template::display_template($template, $this->_template_args);
3512
-    }
3513
-
3514
-
3515
-    /**
3516
-     *        _attendee_details
3517
-     *
3518
-     * @access protected
3519
-     * @param $post
3520
-     * @return void
3521
-     * @throws DomainException
3522
-     * @throws EE_Error
3523
-     */
3524
-    public function attendee_registrations_meta_box($post)
3525
-    {
3526
-        $this->_template_args['attendee']      = $this->_cpt_model_obj;
3527
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3528
-        $template                              =
3529
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3530
-        EEH_Template::display_template($template, $this->_template_args);
3531
-    }
3532
-
3533
-
3534
-    /**
3535
-     * add in the form fields for the attendee edit
3536
-     *
3537
-     * @param  WP_Post $post wp post object
3538
-     * @return string html for new form.
3539
-     * @throws DomainException
3540
-     */
3541
-    public function after_title_form_fields($post)
3542
-    {
3543
-        if ($post->post_type == 'espresso_attendees') {
3544
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3545
-            $template_args['attendee'] = $this->_cpt_model_obj;
3546
-            EEH_Template::display_template($template, $template_args);
3547
-        }
3548
-    }
3549
-
3550
-
3551
-    /**
3552
-     *        _trash_or_restore_attendee
3553
-     *
3554
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3555
-     * @return void
3556
-     * @throws EE_Error
3557
-     * @access protected
3558
-     */
3559
-    protected function _trash_or_restore_attendees($trash = true)
3560
-    {
3561
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3562
-        $ATT_MDL = EEM_Attendee::instance();
3563
-        $success = 1;
3564
-        //Checkboxes
3565
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3566
-            // if array has more than one element than success message should be plural
3567
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3568
-            // cycle thru checkboxes
3569
-            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3570
-                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3571
-                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3572
-                if ( ! $updated) {
3573
-                    $success = 0;
3574
-                }
3575
-            }
3576
-        } else {
3577
-            // grab single id and delete
3578
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3579
-            //get attendee
3580
-            $att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3581
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3582
-            $updated = $att->save();
3583
-            if ( ! $updated) {
3584
-                $success = 0;
3585
-            }
3586
-        }
3587
-        $what        = $success > 1
3588
-            ? esc_html__('Contacts', 'event_espresso')
3589
-            : esc_html__('Contact', 'event_espresso');
3590
-        $action_desc = $trash
3591
-            ? esc_html__('moved to the trash', 'event_espresso')
3592
-            : esc_html__('restored', 'event_espresso');
3593
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3594
-    }
2808
+		}
2809
+		$template_args = array(
2810
+			'title'                    => '',
2811
+			'content'                  => '',
2812
+			'step_button_text'         => '',
2813
+			'show_notification_toggle' => false,
2814
+		);
2815
+		//to indicate we're processing a new registration
2816
+		$hidden_fields = array(
2817
+			'processing_registration' => array(
2818
+				'type'  => 'hidden',
2819
+				'value' => 0,
2820
+			),
2821
+			'event_id'                => array(
2822
+				'type'  => 'hidden',
2823
+				'value' => $this->_reg_event->ID(),
2824
+			),
2825
+		);
2826
+		//if the cart is empty then we know we're at step one so we'll display ticket selector
2827
+		$cart = EE_Registry::instance()->SSN->cart();
2828
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2829
+		switch ($step) {
2830
+			case 'ticket' :
2831
+				$hidden_fields['processing_registration']['value'] = 1;
2832
+				$template_args['title']                            = esc_html__(
2833
+					'Step One: Select the Ticket for this registration',
2834
+					'event_espresso'
2835
+				);
2836
+				$template_args['content']                          =
2837
+					EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2838
+				$template_args['step_button_text']                 = esc_html__(
2839
+					'Add Tickets and Continue to Registrant Details',
2840
+					'event_espresso'
2841
+				);
2842
+				$template_args['show_notification_toggle']         = false;
2843
+				break;
2844
+			case 'questions' :
2845
+				$hidden_fields['processing_registration']['value'] = 2;
2846
+				$template_args['title']                            = esc_html__(
2847
+					'Step Two: Add Registrant Details for this Registration',
2848
+					'event_espresso'
2849
+				);
2850
+				//in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2851
+				// properly by the first process_reg_step run.
2852
+				$template_args['content']                  =
2853
+					EED_Single_Page_Checkout::registration_checkout_for_admin();
2854
+				$template_args['step_button_text']         = esc_html__(
2855
+					'Save Registration and Continue to Details',
2856
+					'event_espresso'
2857
+				);
2858
+				$template_args['show_notification_toggle'] = true;
2859
+				break;
2860
+		}
2861
+		//we come back to the process_registration_step route.
2862
+		$this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2863
+		return EEH_Template::display_template(
2864
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2865
+			$template_args,
2866
+			true
2867
+		);
2868
+	}
2869
+
2870
+
2871
+	/**
2872
+	 *        set_reg_event
2873
+	 *
2874
+	 * @access private
2875
+	 * @return bool
2876
+	 * @throws EE_Error
2877
+	 */
2878
+	private function _set_reg_event()
2879
+	{
2880
+		if (is_object($this->_reg_event)) {
2881
+			return true;
2882
+		}
2883
+		$EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2884
+		if ( ! $EVT_ID) {
2885
+			return false;
2886
+		}
2887
+		$this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2888
+		return true;
2889
+	}
2890
+
2891
+
2892
+	/**
2893
+	 * process_reg_step
2894
+	 *
2895
+	 * @access        public
2896
+	 * @return string
2897
+	 * @throws DomainException
2898
+	 * @throws EE_Error
2899
+	 * @throws RuntimeException
2900
+	 */
2901
+	public function process_reg_step()
2902
+	{
2903
+		EE_System::do_not_cache();
2904
+		$this->_set_reg_event();
2905
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2906
+		EE_Registry::instance()->REQ->set('uts', time());
2907
+		//what step are we on?
2908
+		$cart = EE_Registry::instance()->SSN->cart();
2909
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2910
+		//if doing ajax then we need to verify the nonce
2911
+		if (defined('DOING_AJAX')) {
2912
+			$nonce = isset($this->_req_data[$this->_req_nonce])
2913
+				? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2914
+			$this->_verify_nonce($nonce, $this->_req_nonce);
2915
+		}
2916
+		switch ($step) {
2917
+			case 'ticket' :
2918
+				//process ticket selection
2919
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
2920
+				if ($success) {
2921
+					EE_Error::add_success(
2922
+						esc_html__(
2923
+							'Tickets Selected. Now complete the registration.',
2924
+							'event_espresso'
2925
+						)
2926
+					);
2927
+				} else {
2928
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
2929
+				}
2930
+				if (defined('DOING_AJAX')) {
2931
+					$this->new_registration(); //display next step
2932
+				} else {
2933
+					$query_args = array(
2934
+						'action'                  => 'new_registration',
2935
+						'processing_registration' => 1,
2936
+						'event_id'                => $this->_reg_event->ID(),
2937
+						'uts'                     => time(),
2938
+					);
2939
+					$this->_redirect_after_action(
2940
+						false,
2941
+						'',
2942
+						'',
2943
+						$query_args,
2944
+						true
2945
+					);
2946
+				}
2947
+				break;
2948
+			case 'questions' :
2949
+				if (! isset(
2950
+					$this->_req_data['txn_reg_status_change'],
2951
+					$this->_req_data['txn_reg_status_change']['send_notifications'])
2952
+				) {
2953
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2954
+				}
2955
+				//process registration
2956
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2957
+				if ($cart instanceof EE_Cart) {
2958
+					$grand_total = $cart->get_cart_grand_total();
2959
+					if ($grand_total instanceof EE_Line_Item) {
2960
+						$grand_total->save_this_and_descendants_to_txn();
2961
+					}
2962
+				}
2963
+				if ( ! $transaction instanceof EE_Transaction) {
2964
+					$query_args = array(
2965
+						'action'                  => 'new_registration',
2966
+						'processing_registration' => 2,
2967
+						'event_id'                => $this->_reg_event->ID(),
2968
+						'uts'                     => time(),
2969
+					);
2970
+					if (defined('DOING_AJAX')) {
2971
+						//display registration form again because there are errors (maybe validation?)
2972
+						$this->new_registration();
2973
+						return;
2974
+					} else {
2975
+						$this->_redirect_after_action(
2976
+							false,
2977
+							'',
2978
+							'',
2979
+							$query_args,
2980
+							true
2981
+						);
2982
+						return;
2983
+					}
2984
+				}
2985
+				// maybe update status, and make sure to save transaction if not done already
2986
+				if ( ! $transaction->update_status_based_on_total_paid()) {
2987
+					$transaction->save();
2988
+				}
2989
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2990
+				$this->_req_data = array();
2991
+				$query_args      = array(
2992
+					'action'        => 'redirect_to_txn',
2993
+					'TXN_ID'        => $transaction->ID(),
2994
+					'EVT_ID'        => $this->_reg_event->ID(),
2995
+					'event_name'    => urlencode($this->_reg_event->name()),
2996
+					'redirect_from' => 'new_registration',
2997
+				);
2998
+				$this->_redirect_after_action(false, '', '', $query_args, true);
2999
+				break;
3000
+		}
3001
+		//what are you looking here for?  Should be nothing to do at this point.
3002
+	}
3003
+
3004
+
3005
+	/**
3006
+	 * redirect_to_txn
3007
+	 *
3008
+	 * @access public
3009
+	 * @return void
3010
+	 * @throws EE_Error
3011
+	 */
3012
+	public function redirect_to_txn()
3013
+	{
3014
+		EE_System::do_not_cache();
3015
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
3016
+		$query_args = array(
3017
+			'action' => 'view_transaction',
3018
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
3019
+			'page'   => 'espresso_transactions',
3020
+		);
3021
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
3022
+			$query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
3023
+			$query_args['event_name']    = urlencode($this->_req_data['event_name']);
3024
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
3025
+		}
3026
+		EE_Error::add_success(
3027
+			esc_html__(
3028
+				'Registration Created.  Please review the transaction and add any payments as necessary',
3029
+				'event_espresso'
3030
+			)
3031
+		);
3032
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3033
+	}
3034
+
3035
+
3036
+	/**
3037
+	 *        generates HTML for the Attendee Contact List
3038
+	 *
3039
+	 * @access protected
3040
+	 * @return void
3041
+	 */
3042
+	protected function _attendee_contact_list_table()
3043
+	{
3044
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3045
+		$this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
3046
+		$this->display_admin_list_table_page_with_no_sidebar();
3047
+	}
3048
+
3049
+
3050
+	/**
3051
+	 *        get_attendees
3052
+	 *
3053
+	 * @param      $per_page
3054
+	 * @param bool $count whether to return count or data.
3055
+	 * @param bool $trash
3056
+	 * @return array
3057
+	 * @throws EE_Error
3058
+	 * @access public
3059
+	 */
3060
+	public function get_attendees($per_page, $count = false, $trash = false)
3061
+	{
3062
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3063
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
3064
+		$ATT_MDL                    = EEM_Attendee::instance();
3065
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
3066
+		switch ($this->_req_data['orderby']) {
3067
+			case 'ATT_ID':
3068
+				$orderby = 'ATT_ID';
3069
+				break;
3070
+			case 'ATT_fname':
3071
+				$orderby = 'ATT_fname';
3072
+				break;
3073
+			case 'ATT_email':
3074
+				$orderby = 'ATT_email';
3075
+				break;
3076
+			case 'ATT_city':
3077
+				$orderby = 'ATT_city';
3078
+				break;
3079
+			case 'STA_ID':
3080
+				$orderby = 'STA_ID';
3081
+				break;
3082
+			case 'CNT_ID':
3083
+				$orderby = 'CNT_ID';
3084
+				break;
3085
+			default:
3086
+				$orderby = 'ATT_lname';
3087
+		}
3088
+		$sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
3089
+			? $this->_req_data['order']
3090
+			: 'ASC';
3091
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
3092
+			? $this->_req_data['paged']
3093
+			: 1;
3094
+		$per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
3095
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
3096
+			? $this->_req_data['perpage']
3097
+			: $per_page;
3098
+		$_where       = array();
3099
+		if ( ! empty($this->_req_data['s'])) {
3100
+			$sstr         = '%' . $this->_req_data['s'] . '%';
3101
+			$_where['OR'] = array(
3102
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
3103
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
3104
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
3105
+				'ATT_fname'                         => array('LIKE', $sstr),
3106
+				'ATT_lname'                         => array('LIKE', $sstr),
3107
+				'ATT_short_bio'                     => array('LIKE', $sstr),
3108
+				'ATT_email'                         => array('LIKE', $sstr),
3109
+				'ATT_address'                       => array('LIKE', $sstr),
3110
+				'ATT_address2'                      => array('LIKE', $sstr),
3111
+				'ATT_city'                          => array('LIKE', $sstr),
3112
+				'Country.CNT_name'                  => array('LIKE', $sstr),
3113
+				'State.STA_name'                    => array('LIKE', $sstr),
3114
+				'ATT_phone'                         => array('LIKE', $sstr),
3115
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
3116
+				'Registration.REG_code'             => array('LIKE', $sstr),
3117
+				'Registration.REG_count'            => array('LIKE', $sstr),
3118
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
3119
+			);
3120
+		}
3121
+		$offset = ($current_page - 1) * $per_page;
3122
+		$limit  = $count ? null : array($offset, $per_page);
3123
+		if ($trash) {
3124
+			$_where['status'] = array('!=', 'publish');
3125
+			$all_attendees    = $count
3126
+				? $ATT_MDL->count(array(
3127
+					$_where,
3128
+					'order_by' => array($orderby => $sort),
3129
+					'limit'    => $limit,
3130
+				), 'ATT_ID', true)
3131
+				: $ATT_MDL->get_all(array(
3132
+					$_where,
3133
+					'order_by' => array($orderby => $sort),
3134
+					'limit'    => $limit,
3135
+				));
3136
+		} else {
3137
+			$_where['status'] = array('IN', array('publish'));
3138
+			$all_attendees    = $count
3139
+				? $ATT_MDL->count(array(
3140
+					$_where,
3141
+					'order_by' => array($orderby => $sort),
3142
+					'limit'    => $limit,
3143
+				), 'ATT_ID', true)
3144
+				: $ATT_MDL->get_all(array(
3145
+					$_where,
3146
+					'order_by' => array($orderby => $sort),
3147
+					'limit'    => $limit,
3148
+				));
3149
+		}
3150
+		return $all_attendees;
3151
+	}
3152
+
3153
+
3154
+	/**
3155
+	 * This is just taking care of resending the registration confirmation
3156
+	 *
3157
+	 * @access protected
3158
+	 * @return void
3159
+	 */
3160
+	protected function _resend_registration()
3161
+	{
3162
+		$this->_process_resend_registration();
3163
+		$query_args = isset($this->_req_data['redirect_to'])
3164
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3165
+			: array('action' => 'default');
3166
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3167
+	}
3168
+
3169
+	/**
3170
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3171
+	 * to use when selecting registrations
3172
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3173
+	 *                                                     the query parameters from the request
3174
+	 * @return void ends the request with a redirect or download
3175
+	 */
3176
+	public function _registrations_report_base( $method_name_for_getting_query_params )
3177
+	{
3178
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3179
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3180
+				array(
3181
+					'page'        => 'espresso_batch',
3182
+					'batch'       => 'file',
3183
+					'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3184
+					'filters'     => urlencode(
3185
+						serialize(
3186
+							call_user_func(
3187
+								array( $this, $method_name_for_getting_query_params ),
3188
+								EEH_Array::is_set(
3189
+									$this->_req_data,
3190
+									'filters',
3191
+									array()
3192
+								)
3193
+							)
3194
+						)
3195
+				),
3196
+				'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3197
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3198
+				'return_url'  => urlencode($this->_req_data['return_url']),
3199
+			)));
3200
+		} else {
3201
+			$new_request_args = array(
3202
+				'export' => 'report',
3203
+				'action' => 'registrations_report_for_event',
3204
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3205
+			);
3206
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
3207
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3208
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3209
+				$EE_Export = EE_Export::instance($this->_req_data);
3210
+				$EE_Export->export();
3211
+			}
3212
+		}
3213
+	}
3214
+
3215
+
3216
+
3217
+	/**
3218
+	 * Creates a registration report using only query parameters in the request
3219
+	 * @return void
3220
+	 */
3221
+	public function _registrations_report()
3222
+	{
3223
+		$this->_registrations_report_base('_get_registration_query_parameters');
3224
+	}
3225
+
3226
+
3227
+	public function _contact_list_export()
3228
+	{
3229
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3230
+			require_once(EE_CLASSES . 'EE_Export.class.php');
3231
+			$EE_Export = EE_Export::instance($this->_req_data);
3232
+			$EE_Export->export_attendees();
3233
+		}
3234
+	}
3235
+
3236
+
3237
+	public function _contact_list_report()
3238
+	{
3239
+		if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3240
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3241
+				'page'        => 'espresso_batch',
3242
+				'batch'       => 'file',
3243
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3244
+				'return_url'  => urlencode($this->_req_data['return_url']),
3245
+			)));
3246
+		} else {
3247
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3248
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3249
+				$EE_Export = EE_Export::instance($this->_req_data);
3250
+				$EE_Export->report_attendees();
3251
+			}
3252
+		}
3253
+	}
3254
+
3255
+
3256
+
3257
+
3258
+
3259
+	/***************************************        ATTENDEE DETAILS        ***************************************/
3260
+	/**
3261
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
3262
+	 *
3263
+	 * @return void
3264
+	 * @throws EE_Error
3265
+	 */
3266
+	protected function _duplicate_attendee()
3267
+	{
3268
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3269
+		//verify we have necessary info
3270
+		if (empty($this->_req_data['_REG_ID'])) {
3271
+			EE_Error::add_error(
3272
+				esc_html__(
3273
+					'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3274
+					'event_espresso'
3275
+				), __FILE__, __LINE__, __FUNCTION__
3276
+			);
3277
+			$query_args = array('action' => $action);
3278
+			$this->_redirect_after_action('', '', '', $query_args, true);
3279
+		}
3280
+		//okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3281
+		$registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3282
+		$attendee     = $registration->attendee();
3283
+		//remove relation of existing attendee on registration
3284
+		$registration->_remove_relation_to($attendee, 'Attendee');
3285
+		//new attendee
3286
+		$new_attendee = clone $attendee;
3287
+		$new_attendee->set('ATT_ID', 0);
3288
+		$new_attendee->save();
3289
+		//add new attendee to reg
3290
+		$registration->_add_relation_to($new_attendee, 'Attendee');
3291
+		EE_Error::add_success(
3292
+			esc_html__(
3293
+				'New Contact record created.  Now make any edits you wish to make for this contact.',
3294
+				'event_espresso'
3295
+			)
3296
+		);
3297
+		//redirect to edit page for attendee
3298
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3299
+		$this->_redirect_after_action('', '', '', $query_args, true);
3300
+	}
3301
+
3302
+
3303
+	//related to cpt routes
3304
+	protected function _insert_update_cpt_item($post_id, $post)
3305
+	{
3306
+		$success  = true;
3307
+		$attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
3308
+		//for attendee updates
3309
+		if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
3310
+			//note we should only be UPDATING attendees at this point.
3311
+			$updated_fields = array(
3312
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
3313
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
3314
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3315
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3316
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3317
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3318
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3319
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3320
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3321
+				'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
3322
+				'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
3323
+			);
3324
+			foreach ($updated_fields as $field => $value) {
3325
+				$attendee->set($field, $value);
3326
+			}
3327
+			$success                   = $attendee->save();
3328
+			$attendee_update_callbacks = apply_filters(
3329
+				'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3330
+				array()
3331
+			);
3332
+			foreach ($attendee_update_callbacks as $a_callback) {
3333
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3334
+					throw new EE_Error(
3335
+						sprintf(
3336
+							esc_html__(
3337
+								'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3338
+								'event_espresso'
3339
+							),
3340
+							$a_callback
3341
+						)
3342
+					);
3343
+				}
3344
+			}
3345
+		}
3346
+		if ($success === false) {
3347
+			EE_Error::add_error(
3348
+				esc_html__(
3349
+					'Something went wrong with updating the meta table data for the registration.',
3350
+					'event_espresso'
3351
+				),
3352
+				__FILE__, __FUNCTION__, __LINE__
3353
+			);
3354
+		}
3355
+	}
3356
+
3357
+
3358
+	public function trash_cpt_item($post_id)
3359
+	{
3360
+	}
3361
+
3362
+
3363
+	public function delete_cpt_item($post_id)
3364
+	{
3365
+	}
3366
+
3367
+
3368
+	public function restore_cpt_item($post_id)
3369
+	{
3370
+	}
3371
+
3372
+
3373
+	protected function _restore_cpt_item($post_id, $revision_id)
3374
+	{
3375
+	}
3376
+
3377
+
3378
+	public function attendee_editor_metaboxes()
3379
+	{
3380
+		$this->verify_cpt_object();
3381
+		remove_meta_box(
3382
+			'postexcerpt',
3383
+			esc_html__('Excerpt', 'event_espresso'),
3384
+			'post_excerpt_meta_box',
3385
+			$this->_cpt_routes[$this->_req_action],
3386
+			'normal',
3387
+			'core'
3388
+		);
3389
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3390
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
3391
+			add_meta_box(
3392
+				'postexcerpt',
3393
+				esc_html__('Short Biography', 'event_espresso'),
3394
+				'post_excerpt_meta_box',
3395
+				$this->_cpt_routes[$this->_req_action],
3396
+				'normal'
3397
+			);
3398
+		}
3399
+		if (post_type_supports('espresso_attendees', 'comments')) {
3400
+			add_meta_box(
3401
+				'commentsdiv',
3402
+				esc_html__('Notes on the Contact', 'event_espresso'),
3403
+				'post_comment_meta_box',
3404
+				$this->_cpt_routes[$this->_req_action],
3405
+				'normal',
3406
+				'core'
3407
+			);
3408
+		}
3409
+		add_meta_box(
3410
+			'attendee_contact_info',
3411
+			esc_html__('Contact Info', 'event_espresso'),
3412
+			array($this, 'attendee_contact_info'),
3413
+			$this->_cpt_routes[$this->_req_action],
3414
+			'side',
3415
+			'core'
3416
+		);
3417
+		add_meta_box(
3418
+			'attendee_details_address',
3419
+			esc_html__('Address Details', 'event_espresso'),
3420
+			array($this, 'attendee_address_details'),
3421
+			$this->_cpt_routes[$this->_req_action],
3422
+			'normal',
3423
+			'core'
3424
+		);
3425
+		add_meta_box(
3426
+			'attendee_registrations',
3427
+			esc_html__('Registrations for this Contact', 'event_espresso'),
3428
+			array($this, 'attendee_registrations_meta_box'),
3429
+			$this->_cpt_routes[$this->_req_action],
3430
+			'normal',
3431
+			'high'
3432
+		);
3433
+	}
3434
+
3435
+
3436
+	/**
3437
+	 * Metabox for attendee contact info
3438
+	 *
3439
+	 * @param  WP_Post $post wp post object
3440
+	 * @return string attendee contact info ( and form )
3441
+	 * @throws DomainException
3442
+	 */
3443
+	public function attendee_contact_info($post)
3444
+	{
3445
+		//get attendee object ( should already have it )
3446
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3447
+		$template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3448
+		EEH_Template::display_template($template, $this->_template_args);
3449
+	}
3450
+
3451
+
3452
+	/**
3453
+	 * Metabox for attendee details
3454
+	 *
3455
+	 * @param  WP_Post $post wp post object
3456
+	 * @return string attendee address details (and form)
3457
+	 * @throws DomainException
3458
+	 */
3459
+	public function attendee_address_details($post)
3460
+	{
3461
+		//get attendee object (should already have it)
3462
+		$this->_template_args['attendee']     = $this->_cpt_model_obj;
3463
+		$this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3464
+			new EE_Question_Form_Input(
3465
+				EE_Question::new_instance(
3466
+					array(
3467
+						'QST_ID'           => 0,
3468
+						'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3469
+						'QST_system'       => 'admin-state',
3470
+					)
3471
+				),
3472
+				EE_Answer::new_instance(
3473
+					array(
3474
+						'ANS_ID'    => 0,
3475
+						'ANS_value' => $this->_cpt_model_obj->state_ID(),
3476
+					)
3477
+				),
3478
+				array(
3479
+					'input_id'       => 'STA_ID',
3480
+					'input_name'     => 'STA_ID',
3481
+					'input_prefix'   => '',
3482
+					'append_qstn_id' => false,
3483
+				)
3484
+			)
3485
+		);
3486
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3487
+			new EE_Question_Form_Input(
3488
+				EE_Question::new_instance(
3489
+					array(
3490
+						'QST_ID'           => 0,
3491
+						'QST_display_text' => esc_html__('Country', 'event_espresso'),
3492
+						'QST_system'       => 'admin-country',
3493
+					)
3494
+				),
3495
+				EE_Answer::new_instance(
3496
+					array(
3497
+						'ANS_ID'    => 0,
3498
+						'ANS_value' => $this->_cpt_model_obj->country_ID(),
3499
+					)
3500
+				),
3501
+				array(
3502
+					'input_id'       => 'CNT_ISO',
3503
+					'input_name'     => 'CNT_ISO',
3504
+					'input_prefix'   => '',
3505
+					'append_qstn_id' => false,
3506
+				)
3507
+			)
3508
+		);
3509
+		$template                             =
3510
+			REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3511
+		EEH_Template::display_template($template, $this->_template_args);
3512
+	}
3513
+
3514
+
3515
+	/**
3516
+	 *        _attendee_details
3517
+	 *
3518
+	 * @access protected
3519
+	 * @param $post
3520
+	 * @return void
3521
+	 * @throws DomainException
3522
+	 * @throws EE_Error
3523
+	 */
3524
+	public function attendee_registrations_meta_box($post)
3525
+	{
3526
+		$this->_template_args['attendee']      = $this->_cpt_model_obj;
3527
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3528
+		$template                              =
3529
+			REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3530
+		EEH_Template::display_template($template, $this->_template_args);
3531
+	}
3532
+
3533
+
3534
+	/**
3535
+	 * add in the form fields for the attendee edit
3536
+	 *
3537
+	 * @param  WP_Post $post wp post object
3538
+	 * @return string html for new form.
3539
+	 * @throws DomainException
3540
+	 */
3541
+	public function after_title_form_fields($post)
3542
+	{
3543
+		if ($post->post_type == 'espresso_attendees') {
3544
+			$template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3545
+			$template_args['attendee'] = $this->_cpt_model_obj;
3546
+			EEH_Template::display_template($template, $template_args);
3547
+		}
3548
+	}
3549
+
3550
+
3551
+	/**
3552
+	 *        _trash_or_restore_attendee
3553
+	 *
3554
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3555
+	 * @return void
3556
+	 * @throws EE_Error
3557
+	 * @access protected
3558
+	 */
3559
+	protected function _trash_or_restore_attendees($trash = true)
3560
+	{
3561
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3562
+		$ATT_MDL = EEM_Attendee::instance();
3563
+		$success = 1;
3564
+		//Checkboxes
3565
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3566
+			// if array has more than one element than success message should be plural
3567
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3568
+			// cycle thru checkboxes
3569
+			while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3570
+				$updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3571
+					: $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3572
+				if ( ! $updated) {
3573
+					$success = 0;
3574
+				}
3575
+			}
3576
+		} else {
3577
+			// grab single id and delete
3578
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3579
+			//get attendee
3580
+			$att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3581
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3582
+			$updated = $att->save();
3583
+			if ( ! $updated) {
3584
+				$success = 0;
3585
+			}
3586
+		}
3587
+		$what        = $success > 1
3588
+			? esc_html__('Contacts', 'event_espresso')
3589
+			: esc_html__('Contact', 'event_espresso');
3590
+		$action_desc = $trash
3591
+			? esc_html__('moved to the trash', 'event_espresso')
3592
+			: esc_html__('restored', 'event_espresso');
3593
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3594
+	}
3595 3595
 
3596 3596
 }
Please login to merge, or discard this patch.
admin_pages/registrations/EE_Registrations_List_Table.class.php 1 patch
Indentation   +846 added lines, -846 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
 
@@ -26,875 +26,875 @@  discard block
 block discarded – undo
26 26
 
27 27
 
28 28
 
29
-    private $_status;
30
-
31
-
32
-
33
-    /**
34
-     * An array of transaction details for the related transaction to the registration being processed.
35
-     * This is set via the _set_related_details method.
36
-     *
37
-     * @var array
38
-     */
39
-    protected $_transaction_details = array();
40
-
41
-
42
-
43
-    /**
44
-     * An array of event details for the related event to the registration being processed.
45
-     * This is set via the _set_related_details method.
46
-     *
47
-     * @var array
48
-     */
49
-    protected $_event_details = array();
50
-
51
-
52
-
53
-    /**
54
-     * @param \Registrations_Admin_Page $admin_page
55
-     */
56
-    public function __construct(Registrations_Admin_Page $admin_page)
57
-    {
58
-        if ( ! empty($_GET['event_id'])) {
59
-            $extra_query_args = array();
60
-            foreach ($admin_page->get_views() as $key => $view_details) {
61
-                $extra_query_args[$view_details['slug']] = array('event_id' => $_GET['event_id']);
62
-            }
63
-            $this->_views = $admin_page->get_list_table_view_RLs($extra_query_args);
64
-        }
65
-        parent::__construct($admin_page);
66
-        $this->_status = $this->_admin_page->get_registration_status_array();
67
-    }
68
-
69
-
70
-
71
-    /**
72
-     *    _setup_data
73
-     *
74
-     * @access protected
75
-     * @return void
76
-     */
77
-    protected function _setup_data()
78
-    {
79
-        $this->_data = $this->_admin_page->get_registrations($this->_per_page);
80
-        $this->_all_data_count = $this->_admin_page->get_registrations($this->_per_page, true, false, false);
81
-    }
82
-
83
-
84
-
85
-    /**
86
-     *    _set_properties
87
-     *
88
-     * @access protected
89
-     * @return void
90
-     */
91
-    protected function _set_properties()
92
-    {
93
-        $this->_wp_list_args = array(
94
-            'singular' => __('registration', 'event_espresso'),
95
-            'plural'   => __('registrations', 'event_espresso'),
96
-            'ajax'     => true,
97
-            'screen'   => $this->_admin_page->get_current_screen()->id,
98
-        );
99
-        $ID_column_name = __('ID', 'event_espresso');
100
-        $ID_column_name .= ' : <span class="show-on-mobile-view-only" style="float:none">';
101
-        $ID_column_name .= __('Registrant Name', 'event_espresso');
102
-        $ID_column_name .= '</span> ';
103
-        if (isset($_GET['event_id'])) {
104
-            $this->_columns = array(
105
-                'cb'               => '<input type="checkbox" />', //Render a checkbox instead of text
106
-                '_REG_ID'          => $ID_column_name,
107
-                'ATT_fname'        => __('Name', 'event_espresso'),
108
-                'ATT_email'        => __('Email', 'event_espresso'),
109
-                '_REG_date'        => __('Reg Date', 'event_espresso'),
110
-                'PRC_amount'       => __('TKT Price', 'event_espresso'),
111
-                '_REG_final_price' => __('Final Price', 'event_espresso'),
112
-                'TXN_total'        => __('Total Txn', 'event_espresso'),
113
-                'TXN_paid'         => __('Paid', 'event_espresso'),
114
-                'actions'          => __('Actions', 'event_espresso'),
115
-            );
116
-            $this->_bottom_buttons = array(
117
-                'report' => array(
118
-                    'route'         => 'registrations_report',
119
-                    'extra_request' => array(
120
-                        'EVT_ID'     => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
121
-                        'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
122
-                    ),
123
-                ),
124
-            );
125
-        } else {
126
-            $this->_columns = array(
127
-                'cb'               => '<input type="checkbox" />', //Render a checkbox instead of text
128
-                '_REG_ID'          => $ID_column_name,
129
-                'ATT_fname'        => __('Name', 'event_espresso'),
130
-                '_REG_date'        => __('TXN Date', 'event_espresso'),
131
-                'event_name'       => __('Event', 'event_espresso'),
132
-                'DTT_EVT_start'    => __('Event Date', 'event_espresso'),
133
-                '_REG_final_price' => __('Price', 'event_espresso'),
134
-                '_REG_paid'        => __('Paid', 'event_espresso'),
135
-                'actions'          => __('Actions', 'event_espresso'),
136
-            );
137
-            $this->_bottom_buttons = array(
138
-                'report_all' => array(
139
-                    'route'         => 'registrations_report',
140
-                    'extra_request' => array(
141
-                        'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
142
-                    ),
143
-                ),
144
-            );
145
-        }
146
-        $this->_bottom_buttons['report_filtered'] = array(
147
-            'route'         => 'registrations_report',
148
-            'extra_request' => array(
149
-                'use_filters' => true,
150
-                'filters'     => array_diff_key($this->_req_data, array_flip(array(
151
-                            'page',
152
-                            'action',
153
-                            'default_nonce',
154
-                        ))),
155
-                'return_url'  => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
156
-            ),
157
-        );
158
-        $this->_primary_column = '_REG_ID';
159
-        $this->_sortable_columns = array(
160
-            '_REG_date'     => array('_REG_date' => true),   //true means its already sorted
161
-            /**
162
-             * Allows users to change the default sort if they wish.
163
-             * Returning a falsey on this filter will result in the default sort to be by firstname rather than last name.
164
-             */
165
-            'ATT_fname'     => array(
166
-                    'FHEE__EE_Registrations_List_Table___set_properties__default_sort_by_registration_last_name',
167
-                    true,
168
-                    $this
169
-                )
170
-                ? array('ATT_lname' => false)
171
-                : array('ATT_fname' => false),
172
-            'event_name'    => array('event_name' => false),
173
-            'DTT_EVT_start' => array('DTT_EVT_start' => false),
174
-            '_REG_ID'       => array('_REG_ID' => false),
175
-        );
176
-        $this->_hidden_columns = array();
177
-    }
178
-
179
-
180
-
181
-    /**
182
-     * This simply sets up the row class for the table rows.
183
-     * Allows for easier overriding of child methods for setting up sorting.
184
-     *
185
-     * @param  EE_Registration $item the current item
186
-     * @return string
187
-     */
188
-    protected function _get_row_class($item)
189
-    {
190
-        $class = parent::_get_row_class($item);
191
-        //add status class
192
-        $class .= ' ee-status-strip reg-status-' . $item->status_ID();
193
-        if ($this->_has_checkbox_column) {
194
-            $class .= ' has-checkbox-column';
195
-        }
196
-        return $class;
197
-    }
198
-
199
-
200
-
201
-    /**
202
-     * Set the $_transaction_details property if not set yet.
203
-     *
204
-     * @param EE_Registration $registration
205
-     * @throws \EE_Error
206
-     */
207
-    protected function _set_related_details(EE_Registration $registration)
208
-    {
209
-        $transaction = $registration->get_first_related('Transaction');
210
-        $status = $transaction instanceof EE_Transaction ? $transaction->status_ID()
211
-            : EEM_Transaction::failed_status_code;
212
-        $this->_transaction_details = array(
213
-            'transaction' => $transaction,
214
-            'status'      => $status,
215
-            'id'          => $transaction instanceof EE_Transaction ? $transaction->ID() : 0,
216
-            'title_attr'  => sprintf(__('View Transaction Details (%s)', 'event_espresso'),
217
-                EEH_Template::pretty_status($status, false, 'sentence')),
218
-        );
219
-        try {
220
-            $event = $registration->event();
221
-        } catch (\EventEspresso\core\exceptions\EntityNotFoundException $e) {
222
-            $event = null;
223
-        }
224
-        $status = $event instanceof EE_Event ? $event->get_active_status() : EE_Datetime::inactive;
225
-        $this->_event_details = array(
226
-            'event'      => $event,
227
-            'status'     => $status,
228
-            'id'         => $event instanceof EE_Event ? $event->ID() : 0,
229
-            'title_attr' => sprintf(__('Edit Event (%s)', 'event_espresso'),
230
-                EEH_Template::pretty_status($status, false, 'sentence')),
231
-        );
232
-    }
233
-
234
-
235
-
236
-    /**
237
-     *    _get_table_filters
238
-     *
239
-     * @access protected
240
-     * @return array
241
-     */
242
-    protected function _get_table_filters()
243
-    {
244
-        $filters = array();
245
-        //todo we're currently using old functions here. We need to move things into the Events_Admin_Page() class as methods.
246
-        $cur_date = isset($this->_req_data['month_range']) ? $this->_req_data['month_range'] : '';
247
-        $cur_category = isset($this->_req_data['EVT_CAT']) ? $this->_req_data['EVT_CAT'] : -1;
248
-        $reg_status = isset($this->_req_data['_reg_status']) ? $this->_req_data['_reg_status'] : '';
249
-        $filters[] = EEH_Form_Fields::generate_registration_months_dropdown($cur_date, $reg_status, $cur_category);
250
-        $filters[] = EEH_Form_Fields::generate_event_category_dropdown($cur_category);
251
-        $status = array();
252
-        $status[] = array('id' => 0, 'text' => __('Select Status', 'event_espresso'));
253
-        foreach ($this->_status as $key => $value) {
254
-            $status[] = array('id' => $key, 'text' => $value);
255
-        }
256
-        if ($this->_view !== 'incomplete') {
257
-            $filters[] = EEH_Form_Fields::select_input('_reg_status', $status,
258
-                isset($this->_req_data['_reg_status']) ? strtoupper(sanitize_key($this->_req_data['_reg_status']))
259
-                    : '');
260
-        }
261
-        if (isset($this->_req_data['event_id'])) {
262
-            $filters[] = EEH_Form_Fields::hidden_input('event_id', $this->_req_data['event_id'], 'reg_event_id');
263
-        }
264
-        return $filters;
265
-    }
266
-
267
-
268
-
269
-    /**
270
-     *    _add_view_counts
271
-     *
272
-     * @access protected
273
-     * @return void
274
-     * @throws \EE_Error
275
-     */
276
-    protected function _add_view_counts()
277
-    {
278
-        $this->_views['all']['count'] = $this->_total_registrations();
279
-        $this->_views['month']['count'] = $this->_total_registrations_this_month();
280
-        $this->_views['today']['count'] = $this->_total_registrations_today();
281
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registrations',
282
-            'espresso_registrations_trash_registrations')
283
-        ) {
284
-            $this->_views['incomplete']['count'] = $this->_total_registrations('incomplete');
285
-            $this->_views['trash']['count'] = $this->_total_registrations('trash');
286
-        }
287
-    }
288
-
289
-
290
-
291
-    /**
292
-     * _total_registrations
293
-     *
294
-     * @access protected
295
-     * @param string $view
296
-     * @return int
297
-     * @throws \EE_Error
298
-     */
299
-    protected function _total_registrations($view = '')
300
-    {
301
-        $_where = array();
302
-        $EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
303
-        if ($EVT_ID) {
304
-            $_where['EVT_ID'] = $EVT_ID;
305
-        }
306
-        switch ($view) {
307
-            case 'trash' :
308
-                return EEM_Registration::instance()->count_deleted(array($_where));
309
-                break;
310
-            case 'incomplete' :
311
-                $_where['STS_ID'] = EEM_Registration::status_id_incomplete;
312
-                break;
313
-            default :
314
-                $_where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
315
-        }
316
-        return EEM_Registration::instance()->count(array($_where));
317
-    }
318
-
319
-
320
-
321
-    /**
322
-     * _total_registrations_this_month
323
-     *
324
-     * @access protected
325
-     * @return int
326
-     * @throws \EE_Error
327
-     */
328
-    protected function _total_registrations_this_month()
329
-    {
330
-        $EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
331
-        $_where = $EVT_ID ? array('EVT_ID' => $EVT_ID) : array();
332
-        $this_year_r = date('Y', current_time('timestamp'));
333
-        $time_start = ' 00:00:00';
334
-        $time_end = ' 23:59:59';
335
-        $this_month_r = date('m', current_time('timestamp'));
336
-        $days_this_month = date('t', current_time('timestamp'));
337
-        //setup date query.
338
-        $beginning_string = EEM_Registration::instance()
339
-                                            ->convert_datetime_for_query('REG_date',
340
-                                                $this_year_r . '-' . $this_month_r . '-01' . ' ' . $time_start,
341
-                                                'Y-m-d H:i:s');
342
-        $end_string = EEM_Registration::instance()
343
-                                      ->convert_datetime_for_query('REG_date',
344
-                                          $this_year_r . '-' . $this_month_r . '-' . $days_this_month . ' ' . $time_end,
345
-                                          'Y-m-d H:i:s');
346
-        $_where['REG_date'] = array(
347
-            'BETWEEN',
348
-            array(
349
-                $beginning_string,
350
-                $end_string,
351
-            ),
352
-        );
353
-        $_where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
354
-        return EEM_Registration::instance()->count(array($_where));
355
-    }
356
-
357
-
358
-
359
-    /**
360
-     * _total_registrations_today
361
-     *
362
-     * @access protected
363
-     * @return int
364
-     * @throws \EE_Error
365
-     */
366
-    protected function _total_registrations_today()
367
-    {
368
-        $EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
369
-        $_where = $EVT_ID ? array('EVT_ID' => $EVT_ID) : array();
370
-        $current_date = date('Y-m-d', current_time('timestamp'));
371
-        $time_start = ' 00:00:00';
372
-        $time_end = ' 23:59:59';
373
-        $_where['REG_date'] = array(
374
-            'BETWEEN',
375
-            array(
376
-                EEM_Registration::instance()
377
-                                ->convert_datetime_for_query('REG_date', $current_date . $time_start, 'Y-m-d H:i:s'),
378
-                EEM_Registration::instance()
379
-                                ->convert_datetime_for_query('REG_date', $current_date . $time_end, 'Y-m-d H:i:s'),
380
-            ),
381
-        );
382
-        $_where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
383
-        return EEM_Registration::instance()->count(array($_where));
384
-    }
385
-
386
-
387
-
388
-    /**
389
-     * column_cb
390
-     *
391
-     * @access public
392
-     * @param \EE_Registration $item
393
-     * @return string
394
-     * @throws \EE_Error
395
-     */
396
-    public function column_cb($item)
397
-    {
398
-        /** checkbox/lock **/
399
-        $transaction = $item->get_first_related('Transaction');
400
-        $payment_count = $transaction instanceof EE_Transaction ? $transaction->count_related('Payment') : 0;
401
-        return $payment_count > 0
402
-            ||  ! EE_Registry::instance()->CAP->current_user_can(
403
-                'ee_edit_registration',
404
-                'registration_list_table_checkbox_input',
405
-                $item->ID()
406
-            )
407
-            ? sprintf('<input type="checkbox" name="_REG_ID[]" value="%1$d" />', $item->ID())
408
-                                    . '<span class="ee-lock-icon"></span>'
409
-            : sprintf('<input type="checkbox" name="_REG_ID[]" value="%1$d" />', $item->ID());
410
-    }
411
-
412
-
413
-
414
-    /**
415
-     * column__REG_ID
416
-     *
417
-     * @access public
418
-     * @param \EE_Registration $item
419
-     * @return string
420
-     * @throws \EE_Error
421
-     */
422
-    public function column__REG_ID(EE_Registration $item)
423
-    {
424
-        $attendee = $item->attendee();
425
-        $content = $item->ID();
426
-        $content .= '<div class="show-on-mobile-view-only">';
427
-        $content .= '<br>';
428
-        $content .= $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
429
-        $content .= '&nbsp;' . sprintf(__('(%1$s / %2$s)', 'event_espresso'), $item->count(), $item->group_size());
430
-        $content .= '<br>' . sprintf(__('Reg Code: %s', 'event_espresso'), $item->get('REG_code'));
431
-        $content .= '</div>';
432
-        return $content;
433
-    }
434
-
435
-
436
-
437
-    /**
438
-     * column__REG_date
439
-     *
440
-     * @access public
441
-     * @param \EE_Registration $item
442
-     * @return string
443
-     * @throws \EE_Error
444
-     */
445
-    public function column__REG_date(EE_Registration $item)
446
-    {
447
-        $this->_set_related_details($item);
448
-        //Build row actions
449
-        $view_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
450
-            'action' => 'view_transaction',
451
-            'TXN_ID' => $this->_transaction_details['id'],
452
-        ), TXN_ADMIN_URL);
453
-        $view_link = EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
454
-            'espresso_transactions_view_transaction') ? '<a class="ee-status-color-'
455
-                                                        . $this->_transaction_details['status']
456
-                                                        . '" href="'
457
-                                                        . $view_lnk_url
458
-                                                        . '" title="'
459
-                                                        . esc_attr($this->_transaction_details['title_attr'])
460
-                                                        . '">'
461
-                                                        . $item->get_i18n_datetime('REG_date')
462
-                                                        . '</a>' : $item->get_i18n_datetime('REG_date');
463
-        $view_link .= '<br><span class="ee-status-text-small">'
464
-                      . EEH_Template::pretty_status($this->_transaction_details['status'], false, 'sentence')
465
-                      . '</span>';
466
-        return $view_link;
467
-    }
468
-
469
-
470
-
471
-    /**
472
-     * column_event_name
473
-     *
474
-     * @access public
475
-     * @param \EE_Registration $item
476
-     * @return string
477
-     * @throws \EE_Error
478
-     */
479
-    public function column_event_name(EE_Registration $item)
480
-    {
481
-        $this->_set_related_details($item);
482
-        // page=espresso_events&action=edit_event&EVT_ID=2&edit_event_nonce=cf3a7e5b62
483
-        $EVT_ID = $item->event_ID();
484
-        $event_name = $item->event_name();
485
-        $event_name = $event_name ? $event_name : __("No Associated Event", 'event_espresso');
486
-        $event_name = wp_trim_words($event_name, 30, '...');
487
-        if ($EVT_ID) {
488
-            $edit_event_url = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'edit', 'post' => $EVT_ID),
489
-                EVENTS_ADMIN_URL);
490
-            $edit_event = EE_Registry::instance()->CAP->current_user_can('ee_edit_event', 'edit_event', $EVT_ID)
491
-                ? '<a class="ee-status-color-'
492
-                  . $this->_event_details['status']
493
-                  . '" href="'
494
-                  . $edit_event_url
495
-                  . '" title="'
496
-                  . esc_attr($this->_event_details['title_attr'])
497
-                  . '">'
498
-                  . $event_name
499
-                  . '</a>' : $event_name;
500
-            $edit_event_url = EE_Admin_Page::add_query_args_and_nonce(array('event_id' => $EVT_ID), REG_ADMIN_URL);
501
-            $actions['event_filter'] = '<a href="' . $edit_event_url . '" title="';
502
-            $actions['event_filter'] .= sprintf(esc_attr__('Filter this list to only show registrations for %s',
503
-                'event_espresso'), $event_name);
504
-            $actions['event_filter'] .= '">' . __('View Registrations', 'event_espresso') . '</a>';
505
-        } else {
506
-            $edit_event = $event_name;
507
-            $actions['event_filter'] = '';
508
-        }
509
-        return sprintf('%1$s %2$s', $edit_event, $this->row_actions($actions));
510
-    }
511
-
512
-
513
-
514
-    /**
515
-     * column_DTT_EVT_start
516
-     *
517
-     * @access public
518
-     * @param \EE_Registration $item
519
-     * @return string
520
-     * @throws \EE_Error
521
-     */
522
-    public function column_DTT_EVT_start(EE_Registration $item)
523
-    {
524
-        $datetime_strings = array();
525
-        $ticket = $item->ticket(true);
526
-        if ($ticket instanceof EE_Ticket) {
527
-            $remove_defaults = array('default_where_conditions' => 'none');
528
-            $datetimes = $ticket->datetimes($remove_defaults);
529
-            foreach ($datetimes as $datetime) {
530
-                $datetime_strings[] = $datetime->get_i18n_datetime('DTT_EVT_start');
531
-            }
532
-            return implode("<br />", $datetime_strings);
533
-        } else {
534
-            return __('There is no ticket on this registration', 'event_espresso');
535
-        }
536
-    }
537
-
538
-
539
-
540
-    /**
541
-     * column_ATT_fname
542
-     *
543
-     * @access public
544
-     * @param \EE_Registration $item
545
-     * @return string
546
-     * @throws \EE_Error
547
-     */
548
-    public function column_ATT_fname(EE_Registration $item)
549
-    {
550
-        $attendee = $item->attendee();
551
-        $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
552
-            'action'  => 'view_registration',
553
-            '_REG_ID' => $item->ID(),
554
-        ), REG_ADMIN_URL);
555
-        $attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
556
-        $link = EE_Registry::instance()->CAP->current_user_can('ee_read_registration',
557
-            'espresso_registrations_view_registration', $item->ID()) ? '<a href="'
558
-                                                                       . $edit_lnk_url
559
-                                                                       . '" title="'
560
-                                                                       . esc_attr__('View Registration Details',
561
-                'event_espresso')
562
-                                                                       . '">'
563
-                                                                       . $attendee_name
564
-                                                                       . '</a>' : $attendee_name;
565
-        $link .= $item->count() === 1
566
-            ? '&nbsp;<sup><div class="dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8"></div></sup>' : '';
567
-        $t = $item->get_first_related('Transaction');
568
-        $payment_count = $t instanceof EE_Transaction ? $t->count_related('Payment') : 0;
569
-        //append group count to name
570
-        $link .= '&nbsp;' . sprintf(__('(%1$s / %2$s)', 'event_espresso'), $item->count(), $item->group_size());
571
-        //append reg_code
572
-        $link .= '<br>' . sprintf(__('Reg Code: %s', 'event_espresso'), $item->get('REG_code'));
573
-        //reg status text for accessibility
574
-        $link .= '<br><span class="ee-status-text-small">' . EEH_Template::pretty_status($item->status_ID(), false,
575
-                'sentence') . '</span>';
576
-        //trash/restore/delete actions
577
-        $actions = array();
578
-        if ($this->_view !== 'trash'
579
-            && $payment_count === 0
580
-            && EE_Registry::instance()->CAP->current_user_can('ee_delete_registration',
581
-                'espresso_registrations_trash_registrations', $item->ID())
582
-        ) {
583
-            $trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
584
-                'action'  => 'trash_registrations',
585
-                '_REG_ID' => $item->ID(),
586
-            ), REG_ADMIN_URL);
587
-            $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="' . esc_attr__('Trash Registration',
588
-                    'event_espresso') . '">' . __('Trash', 'event_espresso') . '</a>';
589
-        } elseif ($this->_view === 'trash') {
590
-            // restore registration link
591
-            if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registration',
592
-                'espresso_registrations_restore_registrations', $item->ID())
593
-            ) {
594
-                $restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
595
-                    'action'  => 'restore_registrations',
596
-                    '_REG_ID' => $item->ID(),
597
-                ), REG_ADMIN_URL);
598
-                $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="' . esc_attr__('Restore Registration',
599
-                        'event_espresso') . '">' . __('Restore', 'event_espresso') . '</a>';
600
-            }
601
-            if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registration',
602
-                'espresso_registrations_ee_delete_registrations', $item->ID())
603
-            ) {
604
-                $delete_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
605
-                    'action'  => 'delete_registrations',
606
-                    '_REG_ID' => $item->ID(),
607
-                ), REG_ADMIN_URL);
608
-                $actions['delete'] = '<a href="'
609
-                                     . $delete_lnk_url
610
-                                     . '" title="'
611
-                                     . esc_attr__('Delete Registration Permanently', 'event_espresso')
612
-                                     . '">'
613
-                                     . __('Delete', 'event_espresso')
614
-                                     . '</a>';
615
-            }
616
-        }
617
-        return sprintf('%1$s %2$s', $link, $this->row_actions($actions));
618
-    }
619
-
620
-
621
-
622
-    /**
623
-     * column_ATT_email
624
-     *
625
-     * @access public
626
-     * @param \EE_Registration $item
627
-     * @return string
628
-     * @throws \EE_Error
629
-     */
630
-    public function column_ATT_email(EE_Registration $item)
631
-    {
632
-        $attendee = $item->get_first_related('Attendee');
633
-        return ! $attendee instanceof EE_Attendee ? __('No attached contact record.', 'event_espresso')
634
-            : $attendee->email();
635
-    }
636
-
637
-
638
-
639
-    /**
640
-     * column__REG_count
641
-     *
642
-     * @access public
643
-     * @param \EE_Registration $item
644
-     * @return string
645
-     */
646
-    public function column__REG_count(EE_Registration $item)
647
-    {
648
-        return sprintf(__('%1$s / %2$s', 'event_espresso'), $item->count(), $item->group_size());
649
-    }
650
-
651
-
652
-
653
-    /**
654
-     * column_PRC_amount
655
-     *
656
-     * @access public
657
-     * @param \EE_Registration $item
658
-     * @return string
659
-     */
660
-    public function column_PRC_amount(EE_Registration $item)
661
-    {
662
-        $ticket = $item->ticket();
663
-        $content = isset($_GET['event_id']) && $ticket instanceof EE_Ticket ? '<span class="TKT_name">'
664
-                                                                              . $ticket->name()
665
-                                                                              . '</span><br />' : '';
666
-        if ($item->final_price() > 0) {
667
-            $content .= '<span class="reg-pad-rght">' . $item->pretty_final_price() . '</span>';
668
-        } else {
669
-            // free event
670
-            $content .= '<span class="reg-overview-free-event-spn reg-pad-rght">'
671
-                        . __('free', 'event_espresso')
672
-                        . '</span>';
673
-        }
674
-        return $content;
675
-    }
676
-
677
-
678
-
679
-    /**
680
-     * column__REG_final_price
681
-     *
682
-     * @access public
683
-     * @param \EE_Registration $item
684
-     * @return string
685
-     */
686
-    public function column__REG_final_price(EE_Registration $item)
687
-    {
688
-        $ticket = $item->ticket();
689
-        $content = isset($_GET['event_id']) || ! $ticket instanceof EE_Ticket
690
-            ? ''
691
-            : '<span class="TKT_name">'
692
-              . $ticket->name()
693
-              . '</span><br />';
694
-        $content .= '<span class="reg-pad-rght">' . $item->pretty_final_price() . '</span>';
695
-        return $content;
696
-    }
697
-
698
-
699
-
700
-    /**
701
-     * column__REG_paid
702
-     *
703
-     * @access public
704
-     * @param \EE_Registration $item
705
-     * @return string
706
-     */
707
-    public function column__REG_paid(EE_Registration $item)
708
-    {
709
-        $payment_method = $item->payment_method();
710
-        $payment_method_name = $payment_method instanceof EE_Payment_Method ? $payment_method->admin_name()
711
-            : __('Unknown', 'event_espresso');
712
-        $content = '<span class="reg-pad-rght">' . $item->pretty_paid() . '</span>';
713
-        if ($item->paid() > 0) {
714
-            $content .= '<br><span class="ee-status-text-small">' . sprintf(__('...via %s', 'event_espresso'),
715
-                    $payment_method_name) . '</span>';
716
-        }
717
-        return $content;
718
-    }
719
-
720
-
721
-
722
-    /**
723
-     * column_TXN_total
724
-     *
725
-     * @access public
726
-     * @param \EE_Registration $item
727
-     * @return string
728
-     * @throws \EE_Error
729
-     */
730
-    public function column_TXN_total(EE_Registration $item)
731
-    {
732
-        if ($item->transaction()) {
733
-            $view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
734
-                'action' => 'view_transaction',
735
-                'TXN_ID' => $item->transaction_ID(),
736
-            ), TXN_ADMIN_URL);
737
-            return EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
738
-                'espresso_transactions_view_transaction', $item->transaction_ID())
739
-                ? '<span class="reg-pad-rght"><a class="status-'
740
-                  . $item->transaction()->status_ID()
741
-                  . '" href="'
742
-                  . $view_txn_lnk_url
743
-                  . '"  title="'
744
-                  . esc_attr__('View Transaction', 'event_espresso')
745
-                  . '">'
746
-                  . $item->transaction()->pretty_total()
747
-                  . '</a></span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_total() . '</span>';
748
-        } else {
749
-            return __("None", "event_espresso");
750
-        }
751
-    }
752
-
753
-
754
-
755
-    /**
756
-     * column_TXN_paid
757
-     *
758
-     * @access public
759
-     * @param \EE_Registration $item
760
-     * @return string
761
-     * @throws \EE_Error
762
-     */
763
-    public function column_TXN_paid(EE_Registration $item)
764
-    {
765
-        if ($item->count() === 1) {
766
-            $transaction = $item->transaction() ? $item->transaction() : EE_Transaction::new_instance();
767
-            if ($transaction->paid() >= $transaction->total()) {
768
-                return '<span class="reg-pad-rght"><div class="dashicons dashicons-yes green-icon"></div></span>';
769
-            } else {
770
-                $view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
771
-                    'action' => 'view_transaction',
772
-                    'TXN_ID' => $item->transaction_ID(),
773
-                ), TXN_ADMIN_URL);
774
-                return EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
775
-                    'espresso_transactions_view_transaction', $item->transaction_ID())
776
-                    ? '<span class="reg-pad-rght"><a class="status-'
777
-                      . $transaction->status_ID()
778
-                      . '" href="'
779
-                      . $view_txn_lnk_url
780
-                      . '"  title="'
781
-                      . esc_attr__('View Transaction', 'event_espresso')
782
-                      . '">'
783
-                      . $item->transaction()->pretty_paid()
784
-                      . '</a><span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_paid() . '</span>';
785
-            }
786
-        }
787
-        return '&nbsp;';
788
-    }
789
-
790
-
791
-
792
-    /**
793
-     * column_actions
794
-     *
795
-     * @access public
796
-     * @param \EE_Registration $item
797
-     * @return string
798
-     * @throws \EE_Error
799
-     */
800
-    public function column_actions(EE_Registration $item)
801
-    {
802
-        $actions = array();
803
-        $attendee = $item->attendee();
804
-        $this->_set_related_details($item);
805
-        //Build row actions
806
-        $view_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
807
-            'action'  => 'view_registration',
808
-            '_REG_ID' => $item->ID(),
809
-        ), REG_ADMIN_URL);
810
-        $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
811
-            'action' => 'edit_attendee',
812
-            'post'   => $item->attendee_ID(),
813
-        ), REG_ADMIN_URL);
814
-        // page=attendees&event_admin_reports=resend_email&registration_id=43653465634&event_id=2&form_action=resend_email
815
-        //$resend_reg_lnk_url_params = array( 'action'=>'resend_registration', '_REG_ID'=>$item->REG_ID );
816
-        $resend_reg_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
817
-            'action'  => 'resend_registration',
818
-            '_REG_ID' => $item->ID(),
819
-        ), REG_ADMIN_URL, true);
820
-        //Build row actions
821
-        $actions['view_lnk'] = EE_Registry::instance()->CAP->current_user_can('ee_read_registration',
822
-            'espresso_registrations_view_registration', $item->ID()) ? '
29
+	private $_status;
30
+
31
+
32
+
33
+	/**
34
+	 * An array of transaction details for the related transaction to the registration being processed.
35
+	 * This is set via the _set_related_details method.
36
+	 *
37
+	 * @var array
38
+	 */
39
+	protected $_transaction_details = array();
40
+
41
+
42
+
43
+	/**
44
+	 * An array of event details for the related event to the registration being processed.
45
+	 * This is set via the _set_related_details method.
46
+	 *
47
+	 * @var array
48
+	 */
49
+	protected $_event_details = array();
50
+
51
+
52
+
53
+	/**
54
+	 * @param \Registrations_Admin_Page $admin_page
55
+	 */
56
+	public function __construct(Registrations_Admin_Page $admin_page)
57
+	{
58
+		if ( ! empty($_GET['event_id'])) {
59
+			$extra_query_args = array();
60
+			foreach ($admin_page->get_views() as $key => $view_details) {
61
+				$extra_query_args[$view_details['slug']] = array('event_id' => $_GET['event_id']);
62
+			}
63
+			$this->_views = $admin_page->get_list_table_view_RLs($extra_query_args);
64
+		}
65
+		parent::__construct($admin_page);
66
+		$this->_status = $this->_admin_page->get_registration_status_array();
67
+	}
68
+
69
+
70
+
71
+	/**
72
+	 *    _setup_data
73
+	 *
74
+	 * @access protected
75
+	 * @return void
76
+	 */
77
+	protected function _setup_data()
78
+	{
79
+		$this->_data = $this->_admin_page->get_registrations($this->_per_page);
80
+		$this->_all_data_count = $this->_admin_page->get_registrations($this->_per_page, true, false, false);
81
+	}
82
+
83
+
84
+
85
+	/**
86
+	 *    _set_properties
87
+	 *
88
+	 * @access protected
89
+	 * @return void
90
+	 */
91
+	protected function _set_properties()
92
+	{
93
+		$this->_wp_list_args = array(
94
+			'singular' => __('registration', 'event_espresso'),
95
+			'plural'   => __('registrations', 'event_espresso'),
96
+			'ajax'     => true,
97
+			'screen'   => $this->_admin_page->get_current_screen()->id,
98
+		);
99
+		$ID_column_name = __('ID', 'event_espresso');
100
+		$ID_column_name .= ' : <span class="show-on-mobile-view-only" style="float:none">';
101
+		$ID_column_name .= __('Registrant Name', 'event_espresso');
102
+		$ID_column_name .= '</span> ';
103
+		if (isset($_GET['event_id'])) {
104
+			$this->_columns = array(
105
+				'cb'               => '<input type="checkbox" />', //Render a checkbox instead of text
106
+				'_REG_ID'          => $ID_column_name,
107
+				'ATT_fname'        => __('Name', 'event_espresso'),
108
+				'ATT_email'        => __('Email', 'event_espresso'),
109
+				'_REG_date'        => __('Reg Date', 'event_espresso'),
110
+				'PRC_amount'       => __('TKT Price', 'event_espresso'),
111
+				'_REG_final_price' => __('Final Price', 'event_espresso'),
112
+				'TXN_total'        => __('Total Txn', 'event_espresso'),
113
+				'TXN_paid'         => __('Paid', 'event_espresso'),
114
+				'actions'          => __('Actions', 'event_espresso'),
115
+			);
116
+			$this->_bottom_buttons = array(
117
+				'report' => array(
118
+					'route'         => 'registrations_report',
119
+					'extra_request' => array(
120
+						'EVT_ID'     => isset($this->_req_data['event_id']) ? $this->_req_data['event_id'] : null,
121
+						'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
122
+					),
123
+				),
124
+			);
125
+		} else {
126
+			$this->_columns = array(
127
+				'cb'               => '<input type="checkbox" />', //Render a checkbox instead of text
128
+				'_REG_ID'          => $ID_column_name,
129
+				'ATT_fname'        => __('Name', 'event_espresso'),
130
+				'_REG_date'        => __('TXN Date', 'event_espresso'),
131
+				'event_name'       => __('Event', 'event_espresso'),
132
+				'DTT_EVT_start'    => __('Event Date', 'event_espresso'),
133
+				'_REG_final_price' => __('Price', 'event_espresso'),
134
+				'_REG_paid'        => __('Paid', 'event_espresso'),
135
+				'actions'          => __('Actions', 'event_espresso'),
136
+			);
137
+			$this->_bottom_buttons = array(
138
+				'report_all' => array(
139
+					'route'         => 'registrations_report',
140
+					'extra_request' => array(
141
+						'return_url' => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
142
+					),
143
+				),
144
+			);
145
+		}
146
+		$this->_bottom_buttons['report_filtered'] = array(
147
+			'route'         => 'registrations_report',
148
+			'extra_request' => array(
149
+				'use_filters' => true,
150
+				'filters'     => array_diff_key($this->_req_data, array_flip(array(
151
+							'page',
152
+							'action',
153
+							'default_nonce',
154
+						))),
155
+				'return_url'  => urlencode("//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"),
156
+			),
157
+		);
158
+		$this->_primary_column = '_REG_ID';
159
+		$this->_sortable_columns = array(
160
+			'_REG_date'     => array('_REG_date' => true),   //true means its already sorted
161
+			/**
162
+			 * Allows users to change the default sort if they wish.
163
+			 * Returning a falsey on this filter will result in the default sort to be by firstname rather than last name.
164
+			 */
165
+			'ATT_fname'     => array(
166
+					'FHEE__EE_Registrations_List_Table___set_properties__default_sort_by_registration_last_name',
167
+					true,
168
+					$this
169
+				)
170
+				? array('ATT_lname' => false)
171
+				: array('ATT_fname' => false),
172
+			'event_name'    => array('event_name' => false),
173
+			'DTT_EVT_start' => array('DTT_EVT_start' => false),
174
+			'_REG_ID'       => array('_REG_ID' => false),
175
+		);
176
+		$this->_hidden_columns = array();
177
+	}
178
+
179
+
180
+
181
+	/**
182
+	 * This simply sets up the row class for the table rows.
183
+	 * Allows for easier overriding of child methods for setting up sorting.
184
+	 *
185
+	 * @param  EE_Registration $item the current item
186
+	 * @return string
187
+	 */
188
+	protected function _get_row_class($item)
189
+	{
190
+		$class = parent::_get_row_class($item);
191
+		//add status class
192
+		$class .= ' ee-status-strip reg-status-' . $item->status_ID();
193
+		if ($this->_has_checkbox_column) {
194
+			$class .= ' has-checkbox-column';
195
+		}
196
+		return $class;
197
+	}
198
+
199
+
200
+
201
+	/**
202
+	 * Set the $_transaction_details property if not set yet.
203
+	 *
204
+	 * @param EE_Registration $registration
205
+	 * @throws \EE_Error
206
+	 */
207
+	protected function _set_related_details(EE_Registration $registration)
208
+	{
209
+		$transaction = $registration->get_first_related('Transaction');
210
+		$status = $transaction instanceof EE_Transaction ? $transaction->status_ID()
211
+			: EEM_Transaction::failed_status_code;
212
+		$this->_transaction_details = array(
213
+			'transaction' => $transaction,
214
+			'status'      => $status,
215
+			'id'          => $transaction instanceof EE_Transaction ? $transaction->ID() : 0,
216
+			'title_attr'  => sprintf(__('View Transaction Details (%s)', 'event_espresso'),
217
+				EEH_Template::pretty_status($status, false, 'sentence')),
218
+		);
219
+		try {
220
+			$event = $registration->event();
221
+		} catch (\EventEspresso\core\exceptions\EntityNotFoundException $e) {
222
+			$event = null;
223
+		}
224
+		$status = $event instanceof EE_Event ? $event->get_active_status() : EE_Datetime::inactive;
225
+		$this->_event_details = array(
226
+			'event'      => $event,
227
+			'status'     => $status,
228
+			'id'         => $event instanceof EE_Event ? $event->ID() : 0,
229
+			'title_attr' => sprintf(__('Edit Event (%s)', 'event_espresso'),
230
+				EEH_Template::pretty_status($status, false, 'sentence')),
231
+		);
232
+	}
233
+
234
+
235
+
236
+	/**
237
+	 *    _get_table_filters
238
+	 *
239
+	 * @access protected
240
+	 * @return array
241
+	 */
242
+	protected function _get_table_filters()
243
+	{
244
+		$filters = array();
245
+		//todo we're currently using old functions here. We need to move things into the Events_Admin_Page() class as methods.
246
+		$cur_date = isset($this->_req_data['month_range']) ? $this->_req_data['month_range'] : '';
247
+		$cur_category = isset($this->_req_data['EVT_CAT']) ? $this->_req_data['EVT_CAT'] : -1;
248
+		$reg_status = isset($this->_req_data['_reg_status']) ? $this->_req_data['_reg_status'] : '';
249
+		$filters[] = EEH_Form_Fields::generate_registration_months_dropdown($cur_date, $reg_status, $cur_category);
250
+		$filters[] = EEH_Form_Fields::generate_event_category_dropdown($cur_category);
251
+		$status = array();
252
+		$status[] = array('id' => 0, 'text' => __('Select Status', 'event_espresso'));
253
+		foreach ($this->_status as $key => $value) {
254
+			$status[] = array('id' => $key, 'text' => $value);
255
+		}
256
+		if ($this->_view !== 'incomplete') {
257
+			$filters[] = EEH_Form_Fields::select_input('_reg_status', $status,
258
+				isset($this->_req_data['_reg_status']) ? strtoupper(sanitize_key($this->_req_data['_reg_status']))
259
+					: '');
260
+		}
261
+		if (isset($this->_req_data['event_id'])) {
262
+			$filters[] = EEH_Form_Fields::hidden_input('event_id', $this->_req_data['event_id'], 'reg_event_id');
263
+		}
264
+		return $filters;
265
+	}
266
+
267
+
268
+
269
+	/**
270
+	 *    _add_view_counts
271
+	 *
272
+	 * @access protected
273
+	 * @return void
274
+	 * @throws \EE_Error
275
+	 */
276
+	protected function _add_view_counts()
277
+	{
278
+		$this->_views['all']['count'] = $this->_total_registrations();
279
+		$this->_views['month']['count'] = $this->_total_registrations_this_month();
280
+		$this->_views['today']['count'] = $this->_total_registrations_today();
281
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registrations',
282
+			'espresso_registrations_trash_registrations')
283
+		) {
284
+			$this->_views['incomplete']['count'] = $this->_total_registrations('incomplete');
285
+			$this->_views['trash']['count'] = $this->_total_registrations('trash');
286
+		}
287
+	}
288
+
289
+
290
+
291
+	/**
292
+	 * _total_registrations
293
+	 *
294
+	 * @access protected
295
+	 * @param string $view
296
+	 * @return int
297
+	 * @throws \EE_Error
298
+	 */
299
+	protected function _total_registrations($view = '')
300
+	{
301
+		$_where = array();
302
+		$EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
303
+		if ($EVT_ID) {
304
+			$_where['EVT_ID'] = $EVT_ID;
305
+		}
306
+		switch ($view) {
307
+			case 'trash' :
308
+				return EEM_Registration::instance()->count_deleted(array($_where));
309
+				break;
310
+			case 'incomplete' :
311
+				$_where['STS_ID'] = EEM_Registration::status_id_incomplete;
312
+				break;
313
+			default :
314
+				$_where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
315
+		}
316
+		return EEM_Registration::instance()->count(array($_where));
317
+	}
318
+
319
+
320
+
321
+	/**
322
+	 * _total_registrations_this_month
323
+	 *
324
+	 * @access protected
325
+	 * @return int
326
+	 * @throws \EE_Error
327
+	 */
328
+	protected function _total_registrations_this_month()
329
+	{
330
+		$EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
331
+		$_where = $EVT_ID ? array('EVT_ID' => $EVT_ID) : array();
332
+		$this_year_r = date('Y', current_time('timestamp'));
333
+		$time_start = ' 00:00:00';
334
+		$time_end = ' 23:59:59';
335
+		$this_month_r = date('m', current_time('timestamp'));
336
+		$days_this_month = date('t', current_time('timestamp'));
337
+		//setup date query.
338
+		$beginning_string = EEM_Registration::instance()
339
+											->convert_datetime_for_query('REG_date',
340
+												$this_year_r . '-' . $this_month_r . '-01' . ' ' . $time_start,
341
+												'Y-m-d H:i:s');
342
+		$end_string = EEM_Registration::instance()
343
+									  ->convert_datetime_for_query('REG_date',
344
+										  $this_year_r . '-' . $this_month_r . '-' . $days_this_month . ' ' . $time_end,
345
+										  'Y-m-d H:i:s');
346
+		$_where['REG_date'] = array(
347
+			'BETWEEN',
348
+			array(
349
+				$beginning_string,
350
+				$end_string,
351
+			),
352
+		);
353
+		$_where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
354
+		return EEM_Registration::instance()->count(array($_where));
355
+	}
356
+
357
+
358
+
359
+	/**
360
+	 * _total_registrations_today
361
+	 *
362
+	 * @access protected
363
+	 * @return int
364
+	 * @throws \EE_Error
365
+	 */
366
+	protected function _total_registrations_today()
367
+	{
368
+		$EVT_ID = isset($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : false;
369
+		$_where = $EVT_ID ? array('EVT_ID' => $EVT_ID) : array();
370
+		$current_date = date('Y-m-d', current_time('timestamp'));
371
+		$time_start = ' 00:00:00';
372
+		$time_end = ' 23:59:59';
373
+		$_where['REG_date'] = array(
374
+			'BETWEEN',
375
+			array(
376
+				EEM_Registration::instance()
377
+								->convert_datetime_for_query('REG_date', $current_date . $time_start, 'Y-m-d H:i:s'),
378
+				EEM_Registration::instance()
379
+								->convert_datetime_for_query('REG_date', $current_date . $time_end, 'Y-m-d H:i:s'),
380
+			),
381
+		);
382
+		$_where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
383
+		return EEM_Registration::instance()->count(array($_where));
384
+	}
385
+
386
+
387
+
388
+	/**
389
+	 * column_cb
390
+	 *
391
+	 * @access public
392
+	 * @param \EE_Registration $item
393
+	 * @return string
394
+	 * @throws \EE_Error
395
+	 */
396
+	public function column_cb($item)
397
+	{
398
+		/** checkbox/lock **/
399
+		$transaction = $item->get_first_related('Transaction');
400
+		$payment_count = $transaction instanceof EE_Transaction ? $transaction->count_related('Payment') : 0;
401
+		return $payment_count > 0
402
+			||  ! EE_Registry::instance()->CAP->current_user_can(
403
+				'ee_edit_registration',
404
+				'registration_list_table_checkbox_input',
405
+				$item->ID()
406
+			)
407
+			? sprintf('<input type="checkbox" name="_REG_ID[]" value="%1$d" />', $item->ID())
408
+									. '<span class="ee-lock-icon"></span>'
409
+			: sprintf('<input type="checkbox" name="_REG_ID[]" value="%1$d" />', $item->ID());
410
+	}
411
+
412
+
413
+
414
+	/**
415
+	 * column__REG_ID
416
+	 *
417
+	 * @access public
418
+	 * @param \EE_Registration $item
419
+	 * @return string
420
+	 * @throws \EE_Error
421
+	 */
422
+	public function column__REG_ID(EE_Registration $item)
423
+	{
424
+		$attendee = $item->attendee();
425
+		$content = $item->ID();
426
+		$content .= '<div class="show-on-mobile-view-only">';
427
+		$content .= '<br>';
428
+		$content .= $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
429
+		$content .= '&nbsp;' . sprintf(__('(%1$s / %2$s)', 'event_espresso'), $item->count(), $item->group_size());
430
+		$content .= '<br>' . sprintf(__('Reg Code: %s', 'event_espresso'), $item->get('REG_code'));
431
+		$content .= '</div>';
432
+		return $content;
433
+	}
434
+
435
+
436
+
437
+	/**
438
+	 * column__REG_date
439
+	 *
440
+	 * @access public
441
+	 * @param \EE_Registration $item
442
+	 * @return string
443
+	 * @throws \EE_Error
444
+	 */
445
+	public function column__REG_date(EE_Registration $item)
446
+	{
447
+		$this->_set_related_details($item);
448
+		//Build row actions
449
+		$view_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
450
+			'action' => 'view_transaction',
451
+			'TXN_ID' => $this->_transaction_details['id'],
452
+		), TXN_ADMIN_URL);
453
+		$view_link = EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
454
+			'espresso_transactions_view_transaction') ? '<a class="ee-status-color-'
455
+														. $this->_transaction_details['status']
456
+														. '" href="'
457
+														. $view_lnk_url
458
+														. '" title="'
459
+														. esc_attr($this->_transaction_details['title_attr'])
460
+														. '">'
461
+														. $item->get_i18n_datetime('REG_date')
462
+														. '</a>' : $item->get_i18n_datetime('REG_date');
463
+		$view_link .= '<br><span class="ee-status-text-small">'
464
+					  . EEH_Template::pretty_status($this->_transaction_details['status'], false, 'sentence')
465
+					  . '</span>';
466
+		return $view_link;
467
+	}
468
+
469
+
470
+
471
+	/**
472
+	 * column_event_name
473
+	 *
474
+	 * @access public
475
+	 * @param \EE_Registration $item
476
+	 * @return string
477
+	 * @throws \EE_Error
478
+	 */
479
+	public function column_event_name(EE_Registration $item)
480
+	{
481
+		$this->_set_related_details($item);
482
+		// page=espresso_events&action=edit_event&EVT_ID=2&edit_event_nonce=cf3a7e5b62
483
+		$EVT_ID = $item->event_ID();
484
+		$event_name = $item->event_name();
485
+		$event_name = $event_name ? $event_name : __("No Associated Event", 'event_espresso');
486
+		$event_name = wp_trim_words($event_name, 30, '...');
487
+		if ($EVT_ID) {
488
+			$edit_event_url = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'edit', 'post' => $EVT_ID),
489
+				EVENTS_ADMIN_URL);
490
+			$edit_event = EE_Registry::instance()->CAP->current_user_can('ee_edit_event', 'edit_event', $EVT_ID)
491
+				? '<a class="ee-status-color-'
492
+				  . $this->_event_details['status']
493
+				  . '" href="'
494
+				  . $edit_event_url
495
+				  . '" title="'
496
+				  . esc_attr($this->_event_details['title_attr'])
497
+				  . '">'
498
+				  . $event_name
499
+				  . '</a>' : $event_name;
500
+			$edit_event_url = EE_Admin_Page::add_query_args_and_nonce(array('event_id' => $EVT_ID), REG_ADMIN_URL);
501
+			$actions['event_filter'] = '<a href="' . $edit_event_url . '" title="';
502
+			$actions['event_filter'] .= sprintf(esc_attr__('Filter this list to only show registrations for %s',
503
+				'event_espresso'), $event_name);
504
+			$actions['event_filter'] .= '">' . __('View Registrations', 'event_espresso') . '</a>';
505
+		} else {
506
+			$edit_event = $event_name;
507
+			$actions['event_filter'] = '';
508
+		}
509
+		return sprintf('%1$s %2$s', $edit_event, $this->row_actions($actions));
510
+	}
511
+
512
+
513
+
514
+	/**
515
+	 * column_DTT_EVT_start
516
+	 *
517
+	 * @access public
518
+	 * @param \EE_Registration $item
519
+	 * @return string
520
+	 * @throws \EE_Error
521
+	 */
522
+	public function column_DTT_EVT_start(EE_Registration $item)
523
+	{
524
+		$datetime_strings = array();
525
+		$ticket = $item->ticket(true);
526
+		if ($ticket instanceof EE_Ticket) {
527
+			$remove_defaults = array('default_where_conditions' => 'none');
528
+			$datetimes = $ticket->datetimes($remove_defaults);
529
+			foreach ($datetimes as $datetime) {
530
+				$datetime_strings[] = $datetime->get_i18n_datetime('DTT_EVT_start');
531
+			}
532
+			return implode("<br />", $datetime_strings);
533
+		} else {
534
+			return __('There is no ticket on this registration', 'event_espresso');
535
+		}
536
+	}
537
+
538
+
539
+
540
+	/**
541
+	 * column_ATT_fname
542
+	 *
543
+	 * @access public
544
+	 * @param \EE_Registration $item
545
+	 * @return string
546
+	 * @throws \EE_Error
547
+	 */
548
+	public function column_ATT_fname(EE_Registration $item)
549
+	{
550
+		$attendee = $item->attendee();
551
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
552
+			'action'  => 'view_registration',
553
+			'_REG_ID' => $item->ID(),
554
+		), REG_ADMIN_URL);
555
+		$attendee_name = $attendee instanceof EE_Attendee ? $attendee->full_name() : '';
556
+		$link = EE_Registry::instance()->CAP->current_user_can('ee_read_registration',
557
+			'espresso_registrations_view_registration', $item->ID()) ? '<a href="'
558
+																	   . $edit_lnk_url
559
+																	   . '" title="'
560
+																	   . esc_attr__('View Registration Details',
561
+				'event_espresso')
562
+																	   . '">'
563
+																	   . $attendee_name
564
+																	   . '</a>' : $attendee_name;
565
+		$link .= $item->count() === 1
566
+			? '&nbsp;<sup><div class="dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8"></div></sup>' : '';
567
+		$t = $item->get_first_related('Transaction');
568
+		$payment_count = $t instanceof EE_Transaction ? $t->count_related('Payment') : 0;
569
+		//append group count to name
570
+		$link .= '&nbsp;' . sprintf(__('(%1$s / %2$s)', 'event_espresso'), $item->count(), $item->group_size());
571
+		//append reg_code
572
+		$link .= '<br>' . sprintf(__('Reg Code: %s', 'event_espresso'), $item->get('REG_code'));
573
+		//reg status text for accessibility
574
+		$link .= '<br><span class="ee-status-text-small">' . EEH_Template::pretty_status($item->status_ID(), false,
575
+				'sentence') . '</span>';
576
+		//trash/restore/delete actions
577
+		$actions = array();
578
+		if ($this->_view !== 'trash'
579
+			&& $payment_count === 0
580
+			&& EE_Registry::instance()->CAP->current_user_can('ee_delete_registration',
581
+				'espresso_registrations_trash_registrations', $item->ID())
582
+		) {
583
+			$trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
584
+				'action'  => 'trash_registrations',
585
+				'_REG_ID' => $item->ID(),
586
+			), REG_ADMIN_URL);
587
+			$actions['trash'] = '<a href="' . $trash_lnk_url . '" title="' . esc_attr__('Trash Registration',
588
+					'event_espresso') . '">' . __('Trash', 'event_espresso') . '</a>';
589
+		} elseif ($this->_view === 'trash') {
590
+			// restore registration link
591
+			if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registration',
592
+				'espresso_registrations_restore_registrations', $item->ID())
593
+			) {
594
+				$restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
595
+					'action'  => 'restore_registrations',
596
+					'_REG_ID' => $item->ID(),
597
+				), REG_ADMIN_URL);
598
+				$actions['restore'] = '<a href="' . $restore_lnk_url . '" title="' . esc_attr__('Restore Registration',
599
+						'event_espresso') . '">' . __('Restore', 'event_espresso') . '</a>';
600
+			}
601
+			if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registration',
602
+				'espresso_registrations_ee_delete_registrations', $item->ID())
603
+			) {
604
+				$delete_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
605
+					'action'  => 'delete_registrations',
606
+					'_REG_ID' => $item->ID(),
607
+				), REG_ADMIN_URL);
608
+				$actions['delete'] = '<a href="'
609
+									 . $delete_lnk_url
610
+									 . '" title="'
611
+									 . esc_attr__('Delete Registration Permanently', 'event_espresso')
612
+									 . '">'
613
+									 . __('Delete', 'event_espresso')
614
+									 . '</a>';
615
+			}
616
+		}
617
+		return sprintf('%1$s %2$s', $link, $this->row_actions($actions));
618
+	}
619
+
620
+
621
+
622
+	/**
623
+	 * column_ATT_email
624
+	 *
625
+	 * @access public
626
+	 * @param \EE_Registration $item
627
+	 * @return string
628
+	 * @throws \EE_Error
629
+	 */
630
+	public function column_ATT_email(EE_Registration $item)
631
+	{
632
+		$attendee = $item->get_first_related('Attendee');
633
+		return ! $attendee instanceof EE_Attendee ? __('No attached contact record.', 'event_espresso')
634
+			: $attendee->email();
635
+	}
636
+
637
+
638
+
639
+	/**
640
+	 * column__REG_count
641
+	 *
642
+	 * @access public
643
+	 * @param \EE_Registration $item
644
+	 * @return string
645
+	 */
646
+	public function column__REG_count(EE_Registration $item)
647
+	{
648
+		return sprintf(__('%1$s / %2$s', 'event_espresso'), $item->count(), $item->group_size());
649
+	}
650
+
651
+
652
+
653
+	/**
654
+	 * column_PRC_amount
655
+	 *
656
+	 * @access public
657
+	 * @param \EE_Registration $item
658
+	 * @return string
659
+	 */
660
+	public function column_PRC_amount(EE_Registration $item)
661
+	{
662
+		$ticket = $item->ticket();
663
+		$content = isset($_GET['event_id']) && $ticket instanceof EE_Ticket ? '<span class="TKT_name">'
664
+																			  . $ticket->name()
665
+																			  . '</span><br />' : '';
666
+		if ($item->final_price() > 0) {
667
+			$content .= '<span class="reg-pad-rght">' . $item->pretty_final_price() . '</span>';
668
+		} else {
669
+			// free event
670
+			$content .= '<span class="reg-overview-free-event-spn reg-pad-rght">'
671
+						. __('free', 'event_espresso')
672
+						. '</span>';
673
+		}
674
+		return $content;
675
+	}
676
+
677
+
678
+
679
+	/**
680
+	 * column__REG_final_price
681
+	 *
682
+	 * @access public
683
+	 * @param \EE_Registration $item
684
+	 * @return string
685
+	 */
686
+	public function column__REG_final_price(EE_Registration $item)
687
+	{
688
+		$ticket = $item->ticket();
689
+		$content = isset($_GET['event_id']) || ! $ticket instanceof EE_Ticket
690
+			? ''
691
+			: '<span class="TKT_name">'
692
+			  . $ticket->name()
693
+			  . '</span><br />';
694
+		$content .= '<span class="reg-pad-rght">' . $item->pretty_final_price() . '</span>';
695
+		return $content;
696
+	}
697
+
698
+
699
+
700
+	/**
701
+	 * column__REG_paid
702
+	 *
703
+	 * @access public
704
+	 * @param \EE_Registration $item
705
+	 * @return string
706
+	 */
707
+	public function column__REG_paid(EE_Registration $item)
708
+	{
709
+		$payment_method = $item->payment_method();
710
+		$payment_method_name = $payment_method instanceof EE_Payment_Method ? $payment_method->admin_name()
711
+			: __('Unknown', 'event_espresso');
712
+		$content = '<span class="reg-pad-rght">' . $item->pretty_paid() . '</span>';
713
+		if ($item->paid() > 0) {
714
+			$content .= '<br><span class="ee-status-text-small">' . sprintf(__('...via %s', 'event_espresso'),
715
+					$payment_method_name) . '</span>';
716
+		}
717
+		return $content;
718
+	}
719
+
720
+
721
+
722
+	/**
723
+	 * column_TXN_total
724
+	 *
725
+	 * @access public
726
+	 * @param \EE_Registration $item
727
+	 * @return string
728
+	 * @throws \EE_Error
729
+	 */
730
+	public function column_TXN_total(EE_Registration $item)
731
+	{
732
+		if ($item->transaction()) {
733
+			$view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
734
+				'action' => 'view_transaction',
735
+				'TXN_ID' => $item->transaction_ID(),
736
+			), TXN_ADMIN_URL);
737
+			return EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
738
+				'espresso_transactions_view_transaction', $item->transaction_ID())
739
+				? '<span class="reg-pad-rght"><a class="status-'
740
+				  . $item->transaction()->status_ID()
741
+				  . '" href="'
742
+				  . $view_txn_lnk_url
743
+				  . '"  title="'
744
+				  . esc_attr__('View Transaction', 'event_espresso')
745
+				  . '">'
746
+				  . $item->transaction()->pretty_total()
747
+				  . '</a></span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_total() . '</span>';
748
+		} else {
749
+			return __("None", "event_espresso");
750
+		}
751
+	}
752
+
753
+
754
+
755
+	/**
756
+	 * column_TXN_paid
757
+	 *
758
+	 * @access public
759
+	 * @param \EE_Registration $item
760
+	 * @return string
761
+	 * @throws \EE_Error
762
+	 */
763
+	public function column_TXN_paid(EE_Registration $item)
764
+	{
765
+		if ($item->count() === 1) {
766
+			$transaction = $item->transaction() ? $item->transaction() : EE_Transaction::new_instance();
767
+			if ($transaction->paid() >= $transaction->total()) {
768
+				return '<span class="reg-pad-rght"><div class="dashicons dashicons-yes green-icon"></div></span>';
769
+			} else {
770
+				$view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
771
+					'action' => 'view_transaction',
772
+					'TXN_ID' => $item->transaction_ID(),
773
+				), TXN_ADMIN_URL);
774
+				return EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
775
+					'espresso_transactions_view_transaction', $item->transaction_ID())
776
+					? '<span class="reg-pad-rght"><a class="status-'
777
+					  . $transaction->status_ID()
778
+					  . '" href="'
779
+					  . $view_txn_lnk_url
780
+					  . '"  title="'
781
+					  . esc_attr__('View Transaction', 'event_espresso')
782
+					  . '">'
783
+					  . $item->transaction()->pretty_paid()
784
+					  . '</a><span>' : '<span class="reg-pad-rght">' . $item->transaction()->pretty_paid() . '</span>';
785
+			}
786
+		}
787
+		return '&nbsp;';
788
+	}
789
+
790
+
791
+
792
+	/**
793
+	 * column_actions
794
+	 *
795
+	 * @access public
796
+	 * @param \EE_Registration $item
797
+	 * @return string
798
+	 * @throws \EE_Error
799
+	 */
800
+	public function column_actions(EE_Registration $item)
801
+	{
802
+		$actions = array();
803
+		$attendee = $item->attendee();
804
+		$this->_set_related_details($item);
805
+		//Build row actions
806
+		$view_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
807
+			'action'  => 'view_registration',
808
+			'_REG_ID' => $item->ID(),
809
+		), REG_ADMIN_URL);
810
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
811
+			'action' => 'edit_attendee',
812
+			'post'   => $item->attendee_ID(),
813
+		), REG_ADMIN_URL);
814
+		// page=attendees&event_admin_reports=resend_email&registration_id=43653465634&event_id=2&form_action=resend_email
815
+		//$resend_reg_lnk_url_params = array( 'action'=>'resend_registration', '_REG_ID'=>$item->REG_ID );
816
+		$resend_reg_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
817
+			'action'  => 'resend_registration',
818
+			'_REG_ID' => $item->ID(),
819
+		), REG_ADMIN_URL, true);
820
+		//Build row actions
821
+		$actions['view_lnk'] = EE_Registry::instance()->CAP->current_user_can('ee_read_registration',
822
+			'espresso_registrations_view_registration', $item->ID()) ? '
823 823
 			<li>
824 824
 			<a href="' . $view_lnk_url . '" title="' . esc_attr__('View Registration Details', 'event_espresso') . '" class="tiny-text">
825 825
 				<div class="dashicons dashicons-clipboard"></div>
826 826
 			</a>
827 827
 			</li>' : '';
828
-        $actions['edit_lnk'] = EE_Registry::instance()->CAP->current_user_can('ee_edit_contacts',
829
-            'espresso_registrations_edit_attendee')
830
-                               && $attendee instanceof EE_Attendee ? '
828
+		$actions['edit_lnk'] = EE_Registry::instance()->CAP->current_user_can('ee_edit_contacts',
829
+			'espresso_registrations_edit_attendee')
830
+							   && $attendee instanceof EE_Attendee ? '
831 831
 			<li>
832 832
 			<a href="' . $edit_lnk_url . '" title="' . esc_attr__('Edit Contact Details', 'event_espresso') . '" class="tiny-text">
833 833
 				<div class="ee-icon ee-icon-user-edit ee-icon-size-16"></div>
834 834
 			</a>
835 835
 			</li>' : '';
836
-        $actions['resend_reg_lnk'] = $attendee instanceof EE_Attendee
837
-                                     && EE_Registry::instance()->CAP->current_user_can('ee_send_message',
838
-            'espresso_registrations_resend_registration', $item->ID()) ? '
836
+		$actions['resend_reg_lnk'] = $attendee instanceof EE_Attendee
837
+									 && EE_Registry::instance()->CAP->current_user_can('ee_send_message',
838
+			'espresso_registrations_resend_registration', $item->ID()) ? '
839 839
 			<li>
840 840
 			<a href="'
841
-                                                                         . $resend_reg_lnk_url
842
-                                                                         . '" title="'
843
-                                                                         . esc_attr__('Resend Registration Details',
844
-                'event_espresso')
845
-                                                                         . '" class="tiny-text">
841
+																		 . $resend_reg_lnk_url
842
+																		 . '" title="'
843
+																		 . esc_attr__('Resend Registration Details',
844
+				'event_espresso')
845
+																		 . '" class="tiny-text">
846 846
 				<div class="dashicons dashicons-email-alt"></div>
847 847
 			</a>
848 848
 			</li>' : '';
849
-        // page=transactions&action=view_transaction&txn=256&_wpnonce=6414da4dbb
850
-        $view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
851
-            'action' => 'view_transaction',
852
-            'TXN_ID' => $this->_transaction_details['id'],
853
-        ), TXN_ADMIN_URL);
854
-        $actions['view_txn_lnk'] = EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
855
-            'espresso_transactions_view_transaction', $this->_transaction_details['id']) ? '
849
+		// page=transactions&action=view_transaction&txn=256&_wpnonce=6414da4dbb
850
+		$view_txn_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
851
+			'action' => 'view_transaction',
852
+			'TXN_ID' => $this->_transaction_details['id'],
853
+		), TXN_ADMIN_URL);
854
+		$actions['view_txn_lnk'] = EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
855
+			'espresso_transactions_view_transaction', $this->_transaction_details['id']) ? '
856 856
 			<li>
857 857
 			<a class="ee-status-color-'
858
-                                                                                           . $this->_transaction_details['status']
859
-                                                                                           . ' tiny-text" href="'
860
-                                                                                           . $view_txn_lnk_url
861
-                                                                                           . '"  title="'
862
-                                                                                           . $this->_transaction_details['title_attr']
863
-                                                                                           . '">
858
+																						   . $this->_transaction_details['status']
859
+																						   . ' tiny-text" href="'
860
+																						   . $view_txn_lnk_url
861
+																						   . '"  title="'
862
+																						   . $this->_transaction_details['title_attr']
863
+																						   . '">
864 864
 				<div class="dashicons dashicons-cart"></div>
865 865
 			</a>
866 866
 			</li>' : '';
867
-        //invoice link
868
-        $actions['dl_invoice_lnk'] = '';
869
-        $dl_invoice_lnk_url = $item->invoice_url();
870
-        //only show invoice link if message type is active.
871
-        if ($attendee instanceof EE_Attendee
872
-            && $item->is_primary_registrant()
873
-            && EEH_MSG_Template::is_mt_active('invoice')
874
-        ) {
875
-            $actions['dl_invoice_lnk'] = '
867
+		//invoice link
868
+		$actions['dl_invoice_lnk'] = '';
869
+		$dl_invoice_lnk_url = $item->invoice_url();
870
+		//only show invoice link if message type is active.
871
+		if ($attendee instanceof EE_Attendee
872
+			&& $item->is_primary_registrant()
873
+			&& EEH_MSG_Template::is_mt_active('invoice')
874
+		) {
875
+			$actions['dl_invoice_lnk'] = '
876 876
 		<li>
877 877
 			<a title="'
878
-                                         . esc_attr__('View Transaction Invoice', 'event_espresso')
879
-                                         . '" target="_blank" href="'
880
-                                         . $dl_invoice_lnk_url
881
-                                         . '" class="tiny-text">
878
+										 . esc_attr__('View Transaction Invoice', 'event_espresso')
879
+										 . '" target="_blank" href="'
880
+										 . $dl_invoice_lnk_url
881
+										 . '" class="tiny-text">
882 882
 				<span class="dashicons dashicons-media-spreadsheet ee-icon-size-18"></span>
883 883
 			</a>
884 884
 		</li>';
885
-        }
886
-        $actions['filtered_messages_link'] = '';
887
-        //message list table link (filtered by REG_ID
888
-        if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
889
-            $actions['filtered_messages_link'] = '<li>'
890
-                                                 . EEH_MSG_Template::get_message_action_link('see_notifications_for',
891
-                    null, array(
892
-                        '_REG_ID' => $item->ID(),
893
-                    ))
894
-                                                 . '</li>';
895
-        }
896
-        $actions = apply_filters('FHEE__EE_Registrations_List_Table__column_actions__actions', $actions, $item, $this);
897
-        return $this->_action_string(implode('', $actions), $item, 'ul', 'reg-overview-actions-ul');
898
-    }
885
+		}
886
+		$actions['filtered_messages_link'] = '';
887
+		//message list table link (filtered by REG_ID
888
+		if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
889
+			$actions['filtered_messages_link'] = '<li>'
890
+												 . EEH_MSG_Template::get_message_action_link('see_notifications_for',
891
+					null, array(
892
+						'_REG_ID' => $item->ID(),
893
+					))
894
+												 . '</li>';
895
+		}
896
+		$actions = apply_filters('FHEE__EE_Registrations_List_Table__column_actions__actions', $actions, $item, $this);
897
+		return $this->_action_string(implode('', $actions), $item, 'ul', 'reg-overview-actions-ul');
898
+	}
899 899
 
900 900
 }
Please login to merge, or discard this patch.
core/db_models/EEM_Change_Log.model.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
                 ),
107 107
             ),
108 108
         );
109
-        $this->_model_relations    = array();
109
+        $this->_model_relations = array();
110 110
         foreach ($models_this_can_attach_to as $model) {
111 111
             if ($model == 'WP_User') {
112 112
                 $this->_model_relations[$model] = new EE_Belongs_To_Relation();
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
      */
164 164
     public function gateway_log($message, $related_obj_id, $related_obj_type)
165 165
     {
166
-        if (! EE_Registry::instance()->is_model_name($related_obj_type)) {
166
+        if ( ! EE_Registry::instance()->is_model_name($related_obj_type)) {
167 167
             throw new EE_Error(
168 168
                 sprintf(
169 169
                     esc_html__(
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
         global $wpdb;
213 213
         return $wpdb->query(
214 214
             $wpdb->prepare(
215
-                'DELETE FROM ' . $this->table() . ' WHERE LOG_type = %s AND LOG_time < %s',
215
+                'DELETE FROM '.$this->table().' WHERE LOG_type = %s AND LOG_time < %s',
216 216
                 EEM_Change_Log::type_gateway,
217 217
                 $datetime->format(EE_Datetime_Field::mysql_timestamp_format)
218 218
             )
Please login to merge, or discard this patch.
Indentation   +228 added lines, -228 removed lines patch added patch discarded remove patch
@@ -13,246 +13,246 @@
 block discarded – undo
13 13
 class EEM_Change_Log extends EEM_Base
14 14
 {
15 15
 
16
-    /**
17
-     * the related object was created log type
18
-     */
19
-    const type_create = 'create';
20
-    /**
21
-     * the related object was updated (changed, or soft-deleted)
22
-     */
23
-    const type_update = 'update';
24
-    /**
25
-     * the related object was deleted permanently
26
-     */
27
-    const type_delete = 'delete';
28
-    /**
29
-     * the related item had something worth noting happen on it, but
30
-     * only for the purposes of debugging problems
31
-     */
32
-    const type_debug = 'debug';
33
-    /**
34
-     * the related item had an error occur on it
35
-     */
36
-    const type_error = 'error';
37
-    /**
38
-     * the related item is regarding some gateway interaction, like an IPN
39
-     * or request to process a payment
40
-     */
41
-    const type_gateway = 'gateway';
16
+	/**
17
+	 * the related object was created log type
18
+	 */
19
+	const type_create = 'create';
20
+	/**
21
+	 * the related object was updated (changed, or soft-deleted)
22
+	 */
23
+	const type_update = 'update';
24
+	/**
25
+	 * the related object was deleted permanently
26
+	 */
27
+	const type_delete = 'delete';
28
+	/**
29
+	 * the related item had something worth noting happen on it, but
30
+	 * only for the purposes of debugging problems
31
+	 */
32
+	const type_debug = 'debug';
33
+	/**
34
+	 * the related item had an error occur on it
35
+	 */
36
+	const type_error = 'error';
37
+	/**
38
+	 * the related item is regarding some gateway interaction, like an IPN
39
+	 * or request to process a payment
40
+	 */
41
+	const type_gateway = 'gateway';
42 42
 
43
-    /**
44
-     * private instance of the EEM_Change_Log object
45
-     *
46
-     * @access private
47
-     * @var EEM_Change_Log $_instance
48
-     */
49
-    protected static $_instance = null;
43
+	/**
44
+	 * private instance of the EEM_Change_Log object
45
+	 *
46
+	 * @access private
47
+	 * @var EEM_Change_Log $_instance
48
+	 */
49
+	protected static $_instance = null;
50 50
 
51 51
 
52
-    /**
53
-     * constructor
54
-     *
55
-     * @access protected
56
-     * @param null $timezone
57
-     * @throws EE_Error
58
-     */
59
-    protected function __construct($timezone = null)
60
-    {
61
-        global $current_user;
62
-        $this->singular_item       = esc_html__('Log', 'event_espresso');
63
-        $this->plural_item         = esc_html__('Logs', 'event_espresso');
64
-        $this->_tables             = array(
65
-            'Log' => new EE_Primary_Table('esp_log', 'LOG_ID'),
66
-        );
67
-        $models_this_can_attach_to = array_keys(EE_Registry::instance()->non_abstract_db_models);
68
-        $this->_fields             = array(
69
-            'Log' => array(
70
-                'LOG_ID'      => new EE_Primary_Key_Int_Field('LOG_ID', esc_html__('Log ID', 'event_espresso')),
71
-                'LOG_time'    => new EE_Datetime_Field(
72
-                    'LOG_time',
73
-                    esc_html__("Log Time", 'event_espresso'),
74
-                    false,
75
-                    EE_Datetime_Field::now
76
-                ),
77
-                'OBJ_ID'      => new EE_Foreign_Key_String_Field(
78
-                    'OBJ_ID',
79
-                    esc_html__("Object ID (int or string)", 'event_espresso'),
80
-                    true,
81
-                    null,
82
-                    $models_this_can_attach_to
83
-                ),
84
-                'OBJ_type'    => new EE_Any_Foreign_Model_Name_Field(
85
-                    'OBJ_type',
86
-                    esc_html__("Object Type", 'event_espresso'),
87
-                    true,
88
-                    null,
89
-                    $models_this_can_attach_to
90
-                ),
91
-                'LOG_type'    => new EE_Plain_Text_Field(
92
-                    'LOG_type',
93
-                    esc_html__("Type of log entry", "event_espresso"),
94
-                    false,
95
-                    self::type_debug
96
-                ),
97
-                'LOG_message' => new EE_Maybe_Serialized_Text_Field(
98
-                    'LOG_message',
99
-                    esc_html__("Log Message (body)", 'event_espresso'),
100
-                    true
101
-                ),
102
-                'LOG_wp_user' => new EE_WP_User_Field(
103
-                    'LOG_wp_user',
104
-                    esc_html__("User who was logged in while this occurred", 'event_espresso'),
105
-                    true
106
-                ),
107
-            ),
108
-        );
109
-        $this->_model_relations    = array();
110
-        foreach ($models_this_can_attach_to as $model) {
111
-            if ($model == 'WP_User') {
112
-                $this->_model_relations[$model] = new EE_Belongs_To_Relation();
113
-            } elseif ($model != 'Change_Log') {
114
-                $this->_model_relations[$model] = new EE_Belongs_To_Any_Relation();
115
-            }
116
-        }
117
-        //use completely custom caps for this
118
-        $this->_cap_restriction_generators = false;
119
-        //caps-wise this is all-or-nothing: if you have the default role you can access anything, otherwise nothing
120
-        foreach ($this->_cap_contexts_to_cap_action_map as $cap_context => $action) {
121
-            $this->_cap_restrictions[$cap_context][EE_Restriction_Generator_Base::get_default_restrictions_cap()]
122
-                = new EE_Return_None_Where_Conditions();
123
-        }
124
-        parent::__construct($timezone);
125
-    }
52
+	/**
53
+	 * constructor
54
+	 *
55
+	 * @access protected
56
+	 * @param null $timezone
57
+	 * @throws EE_Error
58
+	 */
59
+	protected function __construct($timezone = null)
60
+	{
61
+		global $current_user;
62
+		$this->singular_item       = esc_html__('Log', 'event_espresso');
63
+		$this->plural_item         = esc_html__('Logs', 'event_espresso');
64
+		$this->_tables             = array(
65
+			'Log' => new EE_Primary_Table('esp_log', 'LOG_ID'),
66
+		);
67
+		$models_this_can_attach_to = array_keys(EE_Registry::instance()->non_abstract_db_models);
68
+		$this->_fields             = array(
69
+			'Log' => array(
70
+				'LOG_ID'      => new EE_Primary_Key_Int_Field('LOG_ID', esc_html__('Log ID', 'event_espresso')),
71
+				'LOG_time'    => new EE_Datetime_Field(
72
+					'LOG_time',
73
+					esc_html__("Log Time", 'event_espresso'),
74
+					false,
75
+					EE_Datetime_Field::now
76
+				),
77
+				'OBJ_ID'      => new EE_Foreign_Key_String_Field(
78
+					'OBJ_ID',
79
+					esc_html__("Object ID (int or string)", 'event_espresso'),
80
+					true,
81
+					null,
82
+					$models_this_can_attach_to
83
+				),
84
+				'OBJ_type'    => new EE_Any_Foreign_Model_Name_Field(
85
+					'OBJ_type',
86
+					esc_html__("Object Type", 'event_espresso'),
87
+					true,
88
+					null,
89
+					$models_this_can_attach_to
90
+				),
91
+				'LOG_type'    => new EE_Plain_Text_Field(
92
+					'LOG_type',
93
+					esc_html__("Type of log entry", "event_espresso"),
94
+					false,
95
+					self::type_debug
96
+				),
97
+				'LOG_message' => new EE_Maybe_Serialized_Text_Field(
98
+					'LOG_message',
99
+					esc_html__("Log Message (body)", 'event_espresso'),
100
+					true
101
+				),
102
+				'LOG_wp_user' => new EE_WP_User_Field(
103
+					'LOG_wp_user',
104
+					esc_html__("User who was logged in while this occurred", 'event_espresso'),
105
+					true
106
+				),
107
+			),
108
+		);
109
+		$this->_model_relations    = array();
110
+		foreach ($models_this_can_attach_to as $model) {
111
+			if ($model == 'WP_User') {
112
+				$this->_model_relations[$model] = new EE_Belongs_To_Relation();
113
+			} elseif ($model != 'Change_Log') {
114
+				$this->_model_relations[$model] = new EE_Belongs_To_Any_Relation();
115
+			}
116
+		}
117
+		//use completely custom caps for this
118
+		$this->_cap_restriction_generators = false;
119
+		//caps-wise this is all-or-nothing: if you have the default role you can access anything, otherwise nothing
120
+		foreach ($this->_cap_contexts_to_cap_action_map as $cap_context => $action) {
121
+			$this->_cap_restrictions[$cap_context][EE_Restriction_Generator_Base::get_default_restrictions_cap()]
122
+				= new EE_Return_None_Where_Conditions();
123
+		}
124
+		parent::__construct($timezone);
125
+	}
126 126
 
127
-    /**
128
-     * @param string        $log_type !see the acceptable values of LOG_type in EEM__Change_Log::__construct
129
-     * @param mixed         $message  array|string of the message you want to record
130
-     * @param EE_Base_Class $related_model_obj
131
-     * @return EE_Change_Log
132
-     * @throws EE_Error
133
-     */
134
-    public function log($log_type, $message, $related_model_obj)
135
-    {
136
-        if ($related_model_obj instanceof EE_Base_Class) {
137
-            $obj_id   = $related_model_obj->ID();
138
-            $obj_type = $related_model_obj->get_model()->get_this_model_name();
139
-        } else {
140
-            $obj_id   = null;
141
-            $obj_type = null;
142
-        }
143
-        /** @var EE_Change_Log $log */
144
-        $log = EE_Change_Log::new_instance(array(
145
-            'LOG_type'    => $log_type,
146
-            'LOG_message' => $message,
147
-            'OBJ_ID'      => $obj_id,
148
-            'OBJ_type'    => $obj_type,
149
-        ));
150
-        $log->save();
151
-        return $log;
152
-    }
127
+	/**
128
+	 * @param string        $log_type !see the acceptable values of LOG_type in EEM__Change_Log::__construct
129
+	 * @param mixed         $message  array|string of the message you want to record
130
+	 * @param EE_Base_Class $related_model_obj
131
+	 * @return EE_Change_Log
132
+	 * @throws EE_Error
133
+	 */
134
+	public function log($log_type, $message, $related_model_obj)
135
+	{
136
+		if ($related_model_obj instanceof EE_Base_Class) {
137
+			$obj_id   = $related_model_obj->ID();
138
+			$obj_type = $related_model_obj->get_model()->get_this_model_name();
139
+		} else {
140
+			$obj_id   = null;
141
+			$obj_type = null;
142
+		}
143
+		/** @var EE_Change_Log $log */
144
+		$log = EE_Change_Log::new_instance(array(
145
+			'LOG_type'    => $log_type,
146
+			'LOG_message' => $message,
147
+			'OBJ_ID'      => $obj_id,
148
+			'OBJ_type'    => $obj_type,
149
+		));
150
+		$log->save();
151
+		return $log;
152
+	}
153 153
 
154 154
 
155
-    /**
156
-     * Adds a gateway log for the specified object, given its ID and type
157
-     *
158
-     * @param string $message
159
-     * @param mixed  $related_obj_id
160
-     * @param string $related_obj_type
161
-     * @throws EE_Error
162
-     * @return EE_Change_Log
163
-     */
164
-    public function gateway_log($message, $related_obj_id, $related_obj_type)
165
-    {
166
-        if (! EE_Registry::instance()->is_model_name($related_obj_type)) {
167
-            throw new EE_Error(
168
-                sprintf(
169
-                    esc_html__(
170
-                        "'%s' is not a model name. A model name must be provided when making a gateway log. Eg, 'Payment', 'Payment_Method', etc",
171
-                        "event_espresso"
172
-                    ),
173
-                    $related_obj_type
174
-                )
175
-            );
176
-        }
177
-        /** @var EE_Change_Log $log */
178
-        $log = EE_Change_Log::new_instance(array(
179
-            'LOG_type'    => EEM_Change_Log::type_gateway,
180
-            'LOG_message' => $message,
181
-            'OBJ_ID'      => $related_obj_id,
182
-            'OBJ_type'    => $related_obj_type,
183
-        ));
184
-        $log->save();
185
-        return $log;
186
-    }
155
+	/**
156
+	 * Adds a gateway log for the specified object, given its ID and type
157
+	 *
158
+	 * @param string $message
159
+	 * @param mixed  $related_obj_id
160
+	 * @param string $related_obj_type
161
+	 * @throws EE_Error
162
+	 * @return EE_Change_Log
163
+	 */
164
+	public function gateway_log($message, $related_obj_id, $related_obj_type)
165
+	{
166
+		if (! EE_Registry::instance()->is_model_name($related_obj_type)) {
167
+			throw new EE_Error(
168
+				sprintf(
169
+					esc_html__(
170
+						"'%s' is not a model name. A model name must be provided when making a gateway log. Eg, 'Payment', 'Payment_Method', etc",
171
+						"event_espresso"
172
+					),
173
+					$related_obj_type
174
+				)
175
+			);
176
+		}
177
+		/** @var EE_Change_Log $log */
178
+		$log = EE_Change_Log::new_instance(array(
179
+			'LOG_type'    => EEM_Change_Log::type_gateway,
180
+			'LOG_message' => $message,
181
+			'OBJ_ID'      => $related_obj_id,
182
+			'OBJ_type'    => $related_obj_type,
183
+		));
184
+		$log->save();
185
+		return $log;
186
+	}
187 187
 
188 188
 
189
-    /**
190
-     * Just gets the bare-bones wpdb results as an array in cases where efficiency is essential
191
-     *
192
-     * @param array $query_params @see EEM_Base::get_all
193
-     * @return array of arrays
194
-     * @throws EE_Error
195
-     */
196
-    public function get_all_efficiently($query_params)
197
-    {
198
-        return $this->_get_all_wpdb_results($query_params);
199
-    }
189
+	/**
190
+	 * Just gets the bare-bones wpdb results as an array in cases where efficiency is essential
191
+	 *
192
+	 * @param array $query_params @see EEM_Base::get_all
193
+	 * @return array of arrays
194
+	 * @throws EE_Error
195
+	 */
196
+	public function get_all_efficiently($query_params)
197
+	{
198
+		return $this->_get_all_wpdb_results($query_params);
199
+	}
200 200
 
201 201
 
202
-    /**
203
-     * Executes a database query to delete gateway logs. Does not affect model objects, so if you attempt to use
204
-     * models after this, they may be out-of-sync with the database
205
-     *
206
-     * @param DateTime $datetime
207
-     * @return false|int
208
-     * @throws EE_Error
209
-     */
210
-    public function delete_gateway_logs_older_than(DateTime $datetime)
211
-    {
212
-        global $wpdb;
213
-        return $wpdb->query(
214
-            $wpdb->prepare(
215
-                'DELETE FROM ' . $this->table() . ' WHERE LOG_type = %s AND LOG_time < %s',
216
-                EEM_Change_Log::type_gateway,
217
-                $datetime->format(EE_Datetime_Field::mysql_timestamp_format)
218
-            )
219
-        );
220
-    }
202
+	/**
203
+	 * Executes a database query to delete gateway logs. Does not affect model objects, so if you attempt to use
204
+	 * models after this, they may be out-of-sync with the database
205
+	 *
206
+	 * @param DateTime $datetime
207
+	 * @return false|int
208
+	 * @throws EE_Error
209
+	 */
210
+	public function delete_gateway_logs_older_than(DateTime $datetime)
211
+	{
212
+		global $wpdb;
213
+		return $wpdb->query(
214
+			$wpdb->prepare(
215
+				'DELETE FROM ' . $this->table() . ' WHERE LOG_type = %s AND LOG_time < %s',
216
+				EEM_Change_Log::type_gateway,
217
+				$datetime->format(EE_Datetime_Field::mysql_timestamp_format)
218
+			)
219
+		);
220
+	}
221 221
 
222 222
 
223
-    /**
224
-     * Returns the map of type to pretty label for identifiers used for `LOG_type`.  Client code can register their own
225
-     * map vai the given filter.
226
-     *
227
-     * @return array
228
-     */
229
-    public static function get_pretty_label_map_for_registered_types()
230
-    {
231
-        return apply_filters(
232
-            'FHEE__EEM_Change_Log__get_pretty_label_map_for_registered_types',
233
-            array(
234
-                self::type_create=>  esc_html__("Create", "event_espresso"),
235
-                self::type_update=>  esc_html__("Update", "event_espresso"),
236
-                self::type_delete => esc_html__("Delete", "event_espresso"),
237
-                self::type_debug=>  esc_html__("Debug", "event_espresso"),
238
-                self::type_error=>  esc_html__("Error", "event_espresso"),
239
-                self::type_gateway=> esc_html__("Gateway Interaction (IPN or Direct Payment)", 'event_espresso')
240
-            )
241
-        );
242
-    }
223
+	/**
224
+	 * Returns the map of type to pretty label for identifiers used for `LOG_type`.  Client code can register their own
225
+	 * map vai the given filter.
226
+	 *
227
+	 * @return array
228
+	 */
229
+	public static function get_pretty_label_map_for_registered_types()
230
+	{
231
+		return apply_filters(
232
+			'FHEE__EEM_Change_Log__get_pretty_label_map_for_registered_types',
233
+			array(
234
+				self::type_create=>  esc_html__("Create", "event_espresso"),
235
+				self::type_update=>  esc_html__("Update", "event_espresso"),
236
+				self::type_delete => esc_html__("Delete", "event_espresso"),
237
+				self::type_debug=>  esc_html__("Debug", "event_espresso"),
238
+				self::type_error=>  esc_html__("Error", "event_espresso"),
239
+				self::type_gateway=> esc_html__("Gateway Interaction (IPN or Direct Payment)", 'event_espresso')
240
+			)
241
+		);
242
+	}
243 243
 
244 244
 
245
-    /**
246
-     * Return the pretty (localized) label for the given log type identifier.
247
-     * @param string $type_identifier
248
-     * @return string
249
-     */
250
-    public static function get_pretty_label_for_type($type_identifier)
251
-    {
252
-        $type_identifier_map = self::get_pretty_label_map_for_registered_types();
253
-        //we fallback to the incoming type identifier if there is no localized label for it.
254
-        return isset($type_identifier_map[$type_identifier])
255
-            ? $type_identifier_map[$type_identifier]
256
-            : $type_identifier;
257
-    }
245
+	/**
246
+	 * Return the pretty (localized) label for the given log type identifier.
247
+	 * @param string $type_identifier
248
+	 * @return string
249
+	 */
250
+	public static function get_pretty_label_for_type($type_identifier)
251
+	{
252
+		$type_identifier_map = self::get_pretty_label_map_for_registered_types();
253
+		//we fallback to the incoming type identifier if there is no localized label for it.
254
+		return isset($type_identifier_map[$type_identifier])
255
+			? $type_identifier_map[$type_identifier]
256
+			: $type_identifier;
257
+	}
258 258
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Change_Log.class.php 2 patches
Indentation   +212 added lines, -212 removed lines patch added patch discarded remove patch
@@ -13,216 +13,216 @@
 block discarded – undo
13 13
 class EE_Change_Log extends EE_Base_Class
14 14
 {
15 15
 
16
-    /**
17
-     * @param array  $props_n_values          incoming values
18
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
19
-     *                                        used.)
20
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
21
-     *                                        date_format and the second value is the time format
22
-     * @return EE_Change_Log
23
-     * @throws EE_Error
24
-     */
25
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
26
-    {
27
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
28
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
29
-    }
30
-
31
-
32
-    /**
33
-     * @param array  $props_n_values  incoming values from the database
34
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
35
-     *                                the website will be used.
36
-     * @return EE_Change_Log
37
-     */
38
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
39
-    {
40
-        return new self($props_n_values, true, $timezone);
41
-    }
42
-
43
-    /**
44
-     * Gets message
45
-     *
46
-     * @return mixed
47
-     * @throws EE_Error
48
-     */
49
-    public function message()
50
-    {
51
-        return $this->get('LOG_message');
52
-    }
53
-
54
-    /**
55
-     * Sets message
56
-     *
57
-     * @param mixed $message
58
-     * @throws EE_Error
59
-     */
60
-    public function set_message($message)
61
-    {
62
-        $this->set('LOG_message', $message);
63
-    }
64
-
65
-    /**
66
-     * Gets time
67
-     *
68
-     * @return string
69
-     * @throws EE_Error
70
-     */
71
-    public function time()
72
-    {
73
-        return $this->get('LOG_time');
74
-    }
75
-
76
-    /**
77
-     * Sets time
78
-     *
79
-     * @param string $time
80
-     * @throws EE_Error
81
-     */
82
-    public function set_time($time)
83
-    {
84
-        $this->set('LOG_time', $time);
85
-    }
86
-
87
-    /**
88
-     * Gets log_type
89
-     *
90
-     * @return string
91
-     * @throws EE_Error
92
-     */
93
-    public function log_type()
94
-    {
95
-        return $this->get('LOG_type');
96
-    }
97
-
98
-
99
-    /**
100
-     * Return the localized log type label.
101
-     * @return string
102
-     * @throws EE_Error
103
-     */
104
-    public function log_type_label()
105
-    {
106
-        return EEM_Change_Log::get_pretty_label_for_type($this->log_type());
107
-    }
108
-
109
-    /**
110
-     * Sets log_type
111
-     *
112
-     * @param string $log_type
113
-     * @throws EE_Error
114
-     */
115
-    public function set_log_type($log_type)
116
-    {
117
-        $this->set('LOG_type', $log_type);
118
-    }
119
-
120
-    /**
121
-     * Gets type of the model object related to this log
122
-     *
123
-     * @return string
124
-     * @throws EE_Error
125
-     */
126
-    public function OBJ_type()
127
-    {
128
-        return $this->get('OBJ_type');
129
-    }
130
-
131
-    /**
132
-     * Sets type
133
-     *
134
-     * @param string $type
135
-     * @throws EE_Error
136
-     */
137
-    public function set_OBJ_type($type)
138
-    {
139
-        $this->set('OBJ_type', $type);
140
-    }
141
-
142
-    /**
143
-     * Gets OBJ_ID (the ID of the item related to this log)
144
-     *
145
-     * @return mixed
146
-     * @throws EE_Error
147
-     */
148
-    public function OBJ_ID()
149
-    {
150
-        return $this->get('OBJ_ID');
151
-    }
152
-
153
-    /**
154
-     * Sets OBJ_ID
155
-     *
156
-     * @param mixed $OBJ_ID
157
-     * @throws EE_Error
158
-     */
159
-    public function set_OBJ_ID($OBJ_ID)
160
-    {
161
-        $this->set('OBJ_ID', $OBJ_ID);
162
-    }
163
-
164
-    /**
165
-     * Gets wp_user
166
-     *
167
-     * @return int
168
-     * @throws EE_Error
169
-     */
170
-    public function wp_user()
171
-    {
172
-        return $this->get('LOG_wp_user');
173
-    }
174
-
175
-    /**
176
-     * Sets wp_user
177
-     *
178
-     * @param int $wp_user_id
179
-     * @throws EE_Error
180
-     */
181
-    public function set_wp_user($wp_user_id)
182
-    {
183
-        $this->set('LOG_wp_user', $wp_user_id);
184
-    }
185
-
186
-    /**
187
-     * Gets the model object attached to this log
188
-     *
189
-     * @return EE_Base_Class
190
-     * @throws EE_Error
191
-     */
192
-    public function object()
193
-    {
194
-        $model_name_of_related_obj = $this->OBJ_type();
195
-        $is_model_name             = EE_Registry::instance()->is_model_name($model_name_of_related_obj);
196
-        if (! $is_model_name) {
197
-            return null;
198
-        } else {
199
-            return $this->get_first_related($model_name_of_related_obj);
200
-        }
201
-    }
202
-
203
-    /**
204
-     * Shorthand for setting the OBJ_ID and OBJ_type. Slightly handier than using
205
-     * _add_relation_to because you don't have to specify what type of model you're
206
-     * associating it with
207
-     *
208
-     * @param EE_Base_Class $object
209
-     * @param boolean       $save
210
-     * @return bool if $save=true, NULL is $save=false
211
-     * @throws EE_Error
212
-     */
213
-    public function set_object($object, $save = true)
214
-    {
215
-        if ($object instanceof EE_Base_Class) {
216
-            $this->set_OBJ_type($object->get_model()->get_this_model_name());
217
-            $this->set_OBJ_ID($object->ID());
218
-        } else {
219
-            $this->set_OBJ_type(null);
220
-            $this->set_OBJ_ID(null);
221
-        }
222
-        if ($save) {
223
-            return $this->save();
224
-        } else {
225
-            return null;
226
-        }
227
-    }
16
+	/**
17
+	 * @param array  $props_n_values          incoming values
18
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
19
+	 *                                        used.)
20
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
21
+	 *                                        date_format and the second value is the time format
22
+	 * @return EE_Change_Log
23
+	 * @throws EE_Error
24
+	 */
25
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
26
+	{
27
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
28
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
29
+	}
30
+
31
+
32
+	/**
33
+	 * @param array  $props_n_values  incoming values from the database
34
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
35
+	 *                                the website will be used.
36
+	 * @return EE_Change_Log
37
+	 */
38
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
39
+	{
40
+		return new self($props_n_values, true, $timezone);
41
+	}
42
+
43
+	/**
44
+	 * Gets message
45
+	 *
46
+	 * @return mixed
47
+	 * @throws EE_Error
48
+	 */
49
+	public function message()
50
+	{
51
+		return $this->get('LOG_message');
52
+	}
53
+
54
+	/**
55
+	 * Sets message
56
+	 *
57
+	 * @param mixed $message
58
+	 * @throws EE_Error
59
+	 */
60
+	public function set_message($message)
61
+	{
62
+		$this->set('LOG_message', $message);
63
+	}
64
+
65
+	/**
66
+	 * Gets time
67
+	 *
68
+	 * @return string
69
+	 * @throws EE_Error
70
+	 */
71
+	public function time()
72
+	{
73
+		return $this->get('LOG_time');
74
+	}
75
+
76
+	/**
77
+	 * Sets time
78
+	 *
79
+	 * @param string $time
80
+	 * @throws EE_Error
81
+	 */
82
+	public function set_time($time)
83
+	{
84
+		$this->set('LOG_time', $time);
85
+	}
86
+
87
+	/**
88
+	 * Gets log_type
89
+	 *
90
+	 * @return string
91
+	 * @throws EE_Error
92
+	 */
93
+	public function log_type()
94
+	{
95
+		return $this->get('LOG_type');
96
+	}
97
+
98
+
99
+	/**
100
+	 * Return the localized log type label.
101
+	 * @return string
102
+	 * @throws EE_Error
103
+	 */
104
+	public function log_type_label()
105
+	{
106
+		return EEM_Change_Log::get_pretty_label_for_type($this->log_type());
107
+	}
108
+
109
+	/**
110
+	 * Sets log_type
111
+	 *
112
+	 * @param string $log_type
113
+	 * @throws EE_Error
114
+	 */
115
+	public function set_log_type($log_type)
116
+	{
117
+		$this->set('LOG_type', $log_type);
118
+	}
119
+
120
+	/**
121
+	 * Gets type of the model object related to this log
122
+	 *
123
+	 * @return string
124
+	 * @throws EE_Error
125
+	 */
126
+	public function OBJ_type()
127
+	{
128
+		return $this->get('OBJ_type');
129
+	}
130
+
131
+	/**
132
+	 * Sets type
133
+	 *
134
+	 * @param string $type
135
+	 * @throws EE_Error
136
+	 */
137
+	public function set_OBJ_type($type)
138
+	{
139
+		$this->set('OBJ_type', $type);
140
+	}
141
+
142
+	/**
143
+	 * Gets OBJ_ID (the ID of the item related to this log)
144
+	 *
145
+	 * @return mixed
146
+	 * @throws EE_Error
147
+	 */
148
+	public function OBJ_ID()
149
+	{
150
+		return $this->get('OBJ_ID');
151
+	}
152
+
153
+	/**
154
+	 * Sets OBJ_ID
155
+	 *
156
+	 * @param mixed $OBJ_ID
157
+	 * @throws EE_Error
158
+	 */
159
+	public function set_OBJ_ID($OBJ_ID)
160
+	{
161
+		$this->set('OBJ_ID', $OBJ_ID);
162
+	}
163
+
164
+	/**
165
+	 * Gets wp_user
166
+	 *
167
+	 * @return int
168
+	 * @throws EE_Error
169
+	 */
170
+	public function wp_user()
171
+	{
172
+		return $this->get('LOG_wp_user');
173
+	}
174
+
175
+	/**
176
+	 * Sets wp_user
177
+	 *
178
+	 * @param int $wp_user_id
179
+	 * @throws EE_Error
180
+	 */
181
+	public function set_wp_user($wp_user_id)
182
+	{
183
+		$this->set('LOG_wp_user', $wp_user_id);
184
+	}
185
+
186
+	/**
187
+	 * Gets the model object attached to this log
188
+	 *
189
+	 * @return EE_Base_Class
190
+	 * @throws EE_Error
191
+	 */
192
+	public function object()
193
+	{
194
+		$model_name_of_related_obj = $this->OBJ_type();
195
+		$is_model_name             = EE_Registry::instance()->is_model_name($model_name_of_related_obj);
196
+		if (! $is_model_name) {
197
+			return null;
198
+		} else {
199
+			return $this->get_first_related($model_name_of_related_obj);
200
+		}
201
+	}
202
+
203
+	/**
204
+	 * Shorthand for setting the OBJ_ID and OBJ_type. Slightly handier than using
205
+	 * _add_relation_to because you don't have to specify what type of model you're
206
+	 * associating it with
207
+	 *
208
+	 * @param EE_Base_Class $object
209
+	 * @param boolean       $save
210
+	 * @return bool if $save=true, NULL is $save=false
211
+	 * @throws EE_Error
212
+	 */
213
+	public function set_object($object, $save = true)
214
+	{
215
+		if ($object instanceof EE_Base_Class) {
216
+			$this->set_OBJ_type($object->get_model()->get_this_model_name());
217
+			$this->set_OBJ_ID($object->ID());
218
+		} else {
219
+			$this->set_OBJ_type(null);
220
+			$this->set_OBJ_ID(null);
221
+		}
222
+		if ($save) {
223
+			return $this->save();
224
+		} else {
225
+			return null;
226
+		}
227
+	}
228 228
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -193,7 +193,7 @@
 block discarded – undo
193 193
     {
194 194
         $model_name_of_related_obj = $this->OBJ_type();
195 195
         $is_model_name             = EE_Registry::instance()->is_model_name($model_name_of_related_obj);
196
-        if (! $is_model_name) {
196
+        if ( ! $is_model_name) {
197 197
             return null;
198 198
         } else {
199 199
             return $this->get_first_related($model_name_of_related_obj);
Please login to merge, or discard this patch.
core/EE_Registry.core.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -270,7 +270,7 @@
 block discarded – undo
270 270
 
271 271
 
272 272
     /**
273
-     * @param $module
273
+     * @param string $module
274 274
      * @throws EE_Error
275 275
      * @throws ReflectionException
276 276
      */
Please login to merge, or discard this patch.
Indentation   +1495 added lines, -1495 removed lines patch added patch discarded remove patch
@@ -20,1501 +20,1501 @@
 block discarded – undo
20 20
 class EE_Registry implements ResettableInterface
21 21
 {
22 22
 
23
-    /**
24
-     * @var EE_Registry $_instance
25
-     */
26
-    private static $_instance;
27
-
28
-    /**
29
-     * @var EE_Dependency_Map $_dependency_map
30
-     */
31
-    protected $_dependency_map;
32
-
33
-    /**
34
-     * @var array $_class_abbreviations
35
-     */
36
-    protected $_class_abbreviations = array();
37
-
38
-    /**
39
-     * @var CommandBusInterface $BUS
40
-     */
41
-    public $BUS;
42
-
43
-    /**
44
-     * @var EE_Cart $CART
45
-     */
46
-    public $CART;
47
-
48
-    /**
49
-     * @var EE_Config $CFG
50
-     */
51
-    public $CFG;
52
-
53
-    /**
54
-     * @var EE_Network_Config $NET_CFG
55
-     */
56
-    public $NET_CFG;
57
-
58
-    /**
59
-     * StdClass object for storing library classes in
60
-     *
61
-     * @var StdClass $LIB
62
-     */
63
-    public $LIB;
64
-
65
-    /**
66
-     * @var EE_Request_Handler $REQ
67
-     */
68
-    public $REQ;
69
-
70
-    /**
71
-     * @var EE_Session $SSN
72
-     */
73
-    public $SSN;
74
-
75
-    /**
76
-     * @since 4.5.0
77
-     * @var EE_Capabilities $CAP
78
-     */
79
-    public $CAP;
80
-
81
-    /**
82
-     * @since 4.9.0
83
-     * @var EE_Message_Resource_Manager $MRM
84
-     */
85
-    public $MRM;
86
-
87
-
88
-    /**
89
-     * @var Registry $AssetsRegistry
90
-     */
91
-    public $AssetsRegistry;
92
-
93
-    /**
94
-     * StdClass object for holding addons which have registered themselves to work with EE core
95
-     *
96
-     * @var EE_Addon[] $addons
97
-     */
98
-    public $addons;
99
-
100
-    /**
101
-     * keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
102
-     *
103
-     * @var EEM_Base[] $models
104
-     */
105
-    public $models = array();
106
-
107
-    /**
108
-     * @var EED_Module[] $modules
109
-     */
110
-    public $modules;
111
-
112
-    /**
113
-     * @var EES_Shortcode[] $shortcodes
114
-     */
115
-    public $shortcodes;
116
-
117
-    /**
118
-     * @var WP_Widget[] $widgets
119
-     */
120
-    public $widgets;
121
-
122
-    /**
123
-     * this is an array of all implemented model names (i.e. not the parent abstract models, or models
124
-     * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
125
-     * Keys are model "short names" (eg "Event") as used in model relations, and values are
126
-     * classnames (eg "EEM_Event")
127
-     *
128
-     * @var array $non_abstract_db_models
129
-     */
130
-    public $non_abstract_db_models = array();
131
-
132
-
133
-    /**
134
-     * internationalization for JS strings
135
-     *    usage:   EE_Registry::i18n_js_strings['string_key'] = esc_html__( 'string to translate.', 'event_espresso' );
136
-     *    in js file:  var translatedString = eei18n.string_key;
137
-     *
138
-     * @var array $i18n_js_strings
139
-     */
140
-    public static $i18n_js_strings = array();
141
-
142
-
143
-    /**
144
-     * $main_file - path to espresso.php
145
-     *
146
-     * @var array $main_file
147
-     */
148
-    public $main_file;
149
-
150
-    /**
151
-     * array of ReflectionClass objects where the key is the class name
152
-     *
153
-     * @var ReflectionClass[] $_reflectors
154
-     */
155
-    public $_reflectors;
156
-
157
-    /**
158
-     * boolean flag to indicate whether or not to load/save dependencies from/to the cache
159
-     *
160
-     * @var boolean $_cache_on
161
-     */
162
-    protected $_cache_on = true;
163
-
164
-
165
-
166
-    /**
167
-     * @singleton method used to instantiate class object
168
-     * @param  EE_Dependency_Map $dependency_map
169
-     * @return EE_Registry instance
170
-     */
171
-    public static function instance(EE_Dependency_Map $dependency_map = null)
172
-    {
173
-        // check if class object is instantiated
174
-        if (! self::$_instance instanceof EE_Registry) {
175
-            self::$_instance = new self($dependency_map);
176
-        }
177
-        return self::$_instance;
178
-    }
179
-
180
-
181
-
182
-    /**
183
-     * protected constructor to prevent direct creation
184
-     *
185
-     * @Constructor
186
-     * @param  EE_Dependency_Map $dependency_map
187
-     */
188
-    protected function __construct(EE_Dependency_Map $dependency_map)
189
-    {
190
-        $this->_dependency_map = $dependency_map;
191
-        $this->LIB = new stdClass();
192
-        $this->addons = new stdClass();
193
-        $this->modules = new stdClass();
194
-        $this->shortcodes = new stdClass();
195
-        $this->widgets = new stdClass();
196
-        add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
197
-    }
198
-
199
-
200
-
201
-    /**
202
-     * initialize
203
-     *
204
-     * @throws EE_Error
205
-     * @throws ReflectionException
206
-     */
207
-    public function initialize()
208
-    {
209
-        $this->_class_abbreviations = apply_filters(
210
-            'FHEE__EE_Registry____construct___class_abbreviations',
211
-            array(
212
-                'EE_Config'                                       => 'CFG',
213
-                'EE_Session'                                      => 'SSN',
214
-                'EE_Capabilities'                                 => 'CAP',
215
-                'EE_Cart'                                         => 'CART',
216
-                'EE_Network_Config'                               => 'NET_CFG',
217
-                'EE_Request_Handler'                              => 'REQ',
218
-                'EE_Message_Resource_Manager'                     => 'MRM',
219
-                'EventEspresso\core\services\commands\CommandBus' => 'BUS',
220
-                'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
221
-            )
222
-        );
223
-        $this->load_core('Base', array(), true);
224
-        // add our request and response objects to the cache
225
-        $request_loader = $this->_dependency_map->class_loader('EE_Request');
226
-        $this->_set_cached_class(
227
-            $request_loader(),
228
-            'EE_Request'
229
-        );
230
-        $response_loader = $this->_dependency_map->class_loader('EE_Response');
231
-        $this->_set_cached_class(
232
-            $response_loader(),
233
-            'EE_Response'
234
-        );
235
-        add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
236
-    }
237
-
238
-
239
-
240
-    /**
241
-     * @return void
242
-     */
243
-    public function init()
244
-    {
245
-        // Get current page protocol
246
-        $protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
247
-        // Output admin-ajax.php URL with same protocol as current page
248
-        self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
249
-        self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
250
-    }
251
-
252
-
253
-
254
-    /**
255
-     * localize_i18n_js_strings
256
-     *
257
-     * @return string
258
-     */
259
-    public static function localize_i18n_js_strings()
260
-    {
261
-        $i18n_js_strings = (array)self::$i18n_js_strings;
262
-        foreach ($i18n_js_strings as $key => $value) {
263
-            if (is_scalar($value)) {
264
-                $i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
265
-            }
266
-        }
267
-        return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
268
-    }
269
-
270
-
271
-
272
-    /**
273
-     * @param $module
274
-     * @throws EE_Error
275
-     * @throws ReflectionException
276
-     */
277
-    public function add_module($module)
278
-    {
279
-        if ($module instanceof EED_Module) {
280
-            $module_class = get_class($module);
281
-            $this->modules->{$module_class} = $module;
282
-        } else {
283
-            if (! class_exists('EE_Module_Request_Router')) {
284
-                $this->load_core('Module_Request_Router');
285
-            }
286
-            EE_Module_Request_Router::module_factory($module);
287
-        }
288
-    }
289
-
290
-
291
-
292
-    /**
293
-     * @param string $module_name
294
-     * @return mixed EED_Module | NULL
295
-     */
296
-    public function get_module($module_name = '')
297
-    {
298
-        return isset($this->modules->{$module_name})
299
-            ? $this->modules->{$module_name}
300
-            : null;
301
-    }
302
-
303
-
304
-
305
-    /**
306
-     * loads core classes - must be singletons
307
-     *
308
-     * @param string $class_name - simple class name ie: session
309
-     * @param mixed  $arguments
310
-     * @param bool   $load_only
311
-     * @return mixed
312
-     * @throws EE_Error
313
-     * @throws ReflectionException
314
-     */
315
-    public function load_core($class_name, $arguments = array(), $load_only = false)
316
-    {
317
-        $core_paths = apply_filters(
318
-            'FHEE__EE_Registry__load_core__core_paths',
319
-            array(
320
-                EE_CORE,
321
-                EE_ADMIN,
322
-                EE_CPTS,
323
-                EE_CORE . 'data_migration_scripts' . DS,
324
-                EE_CORE . 'capabilities' . DS,
325
-                EE_CORE . 'request_stack' . DS,
326
-                EE_CORE . 'middleware' . DS,
327
-            )
328
-        );
329
-        // retrieve instantiated class
330
-        return $this->_load(
331
-            $core_paths,
332
-            'EE_',
333
-            $class_name,
334
-            'core',
335
-            $arguments,
336
-            false,
337
-            true,
338
-            $load_only
339
-        );
340
-    }
341
-
342
-
343
-
344
-    /**
345
-     * loads service classes
346
-     *
347
-     * @param string $class_name - simple class name ie: session
348
-     * @param mixed  $arguments
349
-     * @param bool   $load_only
350
-     * @return mixed
351
-     * @throws EE_Error
352
-     * @throws ReflectionException
353
-     */
354
-    public function load_service($class_name, $arguments = array(), $load_only = false)
355
-    {
356
-        $service_paths = apply_filters(
357
-            'FHEE__EE_Registry__load_service__service_paths',
358
-            array(
359
-                EE_CORE . 'services' . DS,
360
-            )
361
-        );
362
-        // retrieve instantiated class
363
-        return $this->_load(
364
-            $service_paths,
365
-            'EE_',
366
-            $class_name,
367
-            'class',
368
-            $arguments,
369
-            false,
370
-            true,
371
-            $load_only
372
-        );
373
-    }
374
-
375
-
376
-
377
-    /**
378
-     * loads data_migration_scripts
379
-     *
380
-     * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
381
-     * @param mixed  $arguments
382
-     * @return EE_Data_Migration_Script_Base|mixed
383
-     * @throws EE_Error
384
-     * @throws ReflectionException
385
-     */
386
-    public function load_dms($class_name, $arguments = array())
387
-    {
388
-        // retrieve instantiated class
389
-        return $this->_load(
390
-            EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(),
391
-            'EE_DMS_',
392
-            $class_name,
393
-            'dms',
394
-            $arguments,
395
-            false,
396
-            false
397
-        );
398
-    }
399
-
400
-
401
-
402
-    /**
403
-     * loads object creating classes - must be singletons
404
-     *
405
-     * @param string $class_name - simple class name ie: attendee
406
-     * @param mixed  $arguments  - an array of arguments to pass to the class
407
-     * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to
408
-     *                           instantiate
409
-     * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then
410
-     *                           set this to FALSE (ie. when instantiating model objects from client in a loop)
411
-     * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate
412
-     *                           (default)
413
-     * @return EE_Base_Class | bool
414
-     * @throws EE_Error
415
-     * @throws ReflectionException
416
-     */
417
-    public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
418
-    {
419
-        $paths = apply_filters(
420
-            'FHEE__EE_Registry__load_class__paths', array(
421
-            EE_CORE,
422
-            EE_CLASSES,
423
-            EE_BUSINESS,
424
-        )
425
-        );
426
-        // retrieve instantiated class
427
-        return $this->_load(
428
-            $paths,
429
-            'EE_',
430
-            $class_name,
431
-            'class',
432
-            $arguments,
433
-            $from_db,
434
-            $cache,
435
-            $load_only
436
-        );
437
-    }
438
-
439
-
440
-
441
-    /**
442
-     * loads helper classes - must be singletons
443
-     *
444
-     * @param string $class_name - simple class name ie: price
445
-     * @param mixed  $arguments
446
-     * @param bool   $load_only
447
-     * @return EEH_Base | bool
448
-     * @throws EE_Error
449
-     * @throws ReflectionException
450
-     */
451
-    public function load_helper($class_name, $arguments = array(), $load_only = true)
452
-    {
453
-        // todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
454
-        $helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
455
-        // retrieve instantiated class
456
-        return $this->_load(
457
-            $helper_paths,
458
-            'EEH_',
459
-            $class_name,
460
-            'helper',
461
-            $arguments,
462
-            false,
463
-            true,
464
-            $load_only
465
-        );
466
-    }
467
-
468
-
469
-
470
-    /**
471
-     * loads core classes - must be singletons
472
-     *
473
-     * @param string $class_name - simple class name ie: session
474
-     * @param mixed  $arguments
475
-     * @param bool   $load_only
476
-     * @param bool   $cache      whether to cache the object or not.
477
-     * @return mixed
478
-     * @throws EE_Error
479
-     * @throws ReflectionException
480
-     */
481
-    public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
482
-    {
483
-        $paths = array(
484
-            EE_LIBRARIES,
485
-            EE_LIBRARIES . 'messages' . DS,
486
-            EE_LIBRARIES . 'shortcodes' . DS,
487
-            EE_LIBRARIES . 'qtips' . DS,
488
-            EE_LIBRARIES . 'payment_methods' . DS,
489
-        );
490
-        // retrieve instantiated class
491
-        return $this->_load(
492
-            $paths,
493
-            'EE_',
494
-            $class_name,
495
-            'lib',
496
-            $arguments,
497
-            false,
498
-            $cache,
499
-            $load_only
500
-        );
501
-    }
502
-
503
-
504
-
505
-    /**
506
-     * loads model classes - must be singletons
507
-     *
508
-     * @param string $class_name - simple class name ie: price
509
-     * @param mixed  $arguments
510
-     * @param bool   $load_only
511
-     * @return EEM_Base | bool
512
-     * @throws EE_Error
513
-     * @throws ReflectionException
514
-     */
515
-    public function load_model($class_name, $arguments = array(), $load_only = false)
516
-    {
517
-        $paths = apply_filters(
518
-            'FHEE__EE_Registry__load_model__paths', array(
519
-            EE_MODELS,
520
-            EE_CORE,
521
-        )
522
-        );
523
-        // retrieve instantiated class
524
-        return $this->_load(
525
-            $paths,
526
-            'EEM_',
527
-            $class_name,
528
-            'model',
529
-            $arguments,
530
-            false,
531
-            true,
532
-            $load_only
533
-        );
534
-    }
535
-
536
-
537
-
538
-    /**
539
-     * loads model classes - must be singletons
540
-     *
541
-     * @param string $class_name - simple class name ie: price
542
-     * @param mixed  $arguments
543
-     * @param bool   $load_only
544
-     * @return mixed | bool
545
-     * @throws EE_Error
546
-     * @throws ReflectionException
547
-     */
548
-    public function load_model_class($class_name, $arguments = array(), $load_only = true)
549
-    {
550
-        $paths = array(
551
-            EE_MODELS . 'fields' . DS,
552
-            EE_MODELS . 'helpers' . DS,
553
-            EE_MODELS . 'relations' . DS,
554
-            EE_MODELS . 'strategies' . DS,
555
-        );
556
-        // retrieve instantiated class
557
-        return $this->_load(
558
-            $paths,
559
-            'EE_',
560
-            $class_name,
561
-            '',
562
-            $arguments,
563
-            false,
564
-            true,
565
-            $load_only
566
-        );
567
-    }
568
-
569
-
570
-
571
-    /**
572
-     * Determines if $model_name is the name of an actual EE model.
573
-     *
574
-     * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
575
-     * @return boolean
576
-     */
577
-    public function is_model_name($model_name)
578
-    {
579
-        return isset($this->models[$model_name]);
580
-    }
581
-
582
-
583
-
584
-    /**
585
-     * generic class loader
586
-     *
587
-     * @param string $path_to_file - directory path to file location, not including filename
588
-     * @param string $file_name    - file name  ie:  my_file.php, including extension
589
-     * @param string $type         - file type - core? class? helper? model?
590
-     * @param mixed  $arguments
591
-     * @param bool   $load_only
592
-     * @return mixed
593
-     * @throws EE_Error
594
-     * @throws ReflectionException
595
-     */
596
-    public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
597
-    {
598
-        // retrieve instantiated class
599
-        return $this->_load(
600
-            $path_to_file,
601
-            '',
602
-            $file_name,
603
-            $type,
604
-            $arguments,
605
-            false,
606
-            true,
607
-            $load_only
608
-        );
609
-    }
610
-
611
-
612
-
613
-    /**
614
-     * @param string $path_to_file - directory path to file location, not including filename
615
-     * @param string $class_name   - full class name  ie:  My_Class
616
-     * @param string $type         - file type - core? class? helper? model?
617
-     * @param mixed  $arguments
618
-     * @param bool   $load_only
619
-     * @return bool|EE_Addon|object
620
-     * @throws EE_Error
621
-     * @throws ReflectionException
622
-     */
623
-    public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
624
-    {
625
-        // retrieve instantiated class
626
-        return $this->_load(
627
-            $path_to_file,
628
-            'addon',
629
-            $class_name,
630
-            $type,
631
-            $arguments,
632
-            false,
633
-            true,
634
-            $load_only
635
-        );
636
-    }
637
-
638
-
639
-
640
-    /**
641
-     * instantiates, caches, and automatically resolves dependencies
642
-     * for classes that use a Fully Qualified Class Name.
643
-     * if the class is not capable of being loaded using PSR-4 autoloading,
644
-     * then you need to use one of the existing load_*() methods
645
-     * which can resolve the classname and filepath from the passed arguments
646
-     *
647
-     * @param bool|string $class_name   Fully Qualified Class Name
648
-     * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
649
-     * @param bool        $cache        whether to cache the instantiated object for reuse
650
-     * @param bool        $from_db      some classes are instantiated from the db
651
-     *                                  and thus call a different method to instantiate
652
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
653
-     * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
654
-     * @return bool|null|mixed          null = failure to load or instantiate class object.
655
-     *                                  object = class loaded and instantiated successfully.
656
-     *                                  bool = fail or success when $load_only is true
657
-     * @throws EE_Error
658
-     * @throws ReflectionException
659
-     */
660
-    public function create(
661
-        $class_name = false,
662
-        $arguments = array(),
663
-        $cache = false,
664
-        $from_db = false,
665
-        $load_only = false,
666
-        $addon = false
667
-    ) {
668
-        $class_name = ltrim($class_name, '\\');
669
-        $class_name = $this->_dependency_map->get_alias($class_name);
670
-        $class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
671
-        // if a non-FQCN was passed, then verifyClassExists() might return an object
672
-        // or it could return null if the class just could not be found anywhere
673
-        if ($class_exists instanceof $class_name || $class_exists === null){
674
-            // either way, return the results
675
-            return $class_exists;
676
-        }
677
-        $class_name = $class_exists;
678
-        // if we're only loading the class and it already exists, then let's just return true immediately
679
-        if ($load_only) {
680
-            return true;
681
-        }
682
-        $addon = $addon
683
-            ? 'addon'
684
-            : '';
685
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
686
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
687
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
688
-        if ($this->_cache_on && $cache && ! $load_only) {
689
-            // return object if it's already cached
690
-            $cached_class = $this->_get_cached_class($class_name, $addon);
691
-            if ($cached_class !== null) {
692
-                return $cached_class;
693
-            }
694
-        }
695
-        // instantiate the requested object
696
-        $class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
697
-        // if caching is turned on OR this class is cached in a class property
698
-        if (($this->_cache_on && $cache) || isset($this->_class_abbreviations[ $class_name ])) {
699
-            // save it for later... kinda like gum  { : $
700
-            $this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
701
-        }
702
-        $this->_cache_on = true;
703
-        return $class_obj;
704
-    }
705
-
706
-
707
-
708
-    /**
709
-     * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
710
-     *
711
-     * @param string $class_name
712
-     * @param array  $arguments
713
-     * @param int    $attempt
714
-     * @return mixed
715
-     */
716
-    private function loadOrVerifyClassExists($class_name, array $arguments, $attempt = 1) {
717
-        if (is_object($class_name) || class_exists($class_name)) {
718
-            return $class_name;
719
-        }
720
-        switch ($attempt) {
721
-            case 1:
722
-                // if it's a FQCN then maybe the class is registered with a preceding \
723
-                $class_name = strpos($class_name, '\\') !== false
724
-                    ? '\\' . ltrim($class_name, '\\')
725
-                    : $class_name;
726
-                break;
727
-            case 2:
728
-                //
729
-                $loader = $this->_dependency_map->class_loader($class_name);
730
-                if ($loader && method_exists($this, $loader)) {
731
-                    return $this->{$loader}($class_name, $arguments);
732
-                }
733
-                break;
734
-            case 3:
735
-            default;
736
-                return null;
737
-        }
738
-        $attempt++;
739
-        return $this->loadOrVerifyClassExists($class_name, $arguments, $attempt);
740
-    }
741
-
742
-
743
-
744
-    /**
745
-     * instantiates, caches, and injects dependencies for classes
746
-     *
747
-     * @param array       $file_paths   an array of paths to folders to look in
748
-     * @param string      $class_prefix EE  or EEM or... ???
749
-     * @param bool|string $class_name   $class name
750
-     * @param string      $type         file type - core? class? helper? model?
751
-     * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
752
-     * @param bool        $from_db      some classes are instantiated from the db
753
-     *                                  and thus call a different method to instantiate
754
-     * @param bool        $cache        whether to cache the instantiated object for reuse
755
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
756
-     * @return bool|null|object null = failure to load or instantiate class object.
757
-     *                                  object = class loaded and instantiated successfully.
758
-     *                                  bool = fail or success when $load_only is true
759
-     * @throws EE_Error
760
-     * @throws ReflectionException
761
-     */
762
-    protected function _load(
763
-        $file_paths = array(),
764
-        $class_prefix = 'EE_',
765
-        $class_name = false,
766
-        $type = 'class',
767
-        $arguments = array(),
768
-        $from_db = false,
769
-        $cache = true,
770
-        $load_only = false
771
-    ) {
772
-        $class_name = ltrim($class_name, '\\');
773
-        // strip php file extension
774
-        $class_name = str_replace('.php', '', trim($class_name));
775
-        // does the class have a prefix ?
776
-        if (! empty($class_prefix) && $class_prefix !== 'addon') {
777
-            // make sure $class_prefix is uppercase
778
-            $class_prefix = strtoupper(trim($class_prefix));
779
-            // add class prefix ONCE!!!
780
-            $class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
781
-        }
782
-        $class_name = $this->_dependency_map->get_alias($class_name);
783
-        $class_exists = class_exists($class_name);
784
-        // if we're only loading the class and it already exists, then let's just return true immediately
785
-        if ($load_only && $class_exists) {
786
-            return true;
787
-        }
788
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
789
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
790
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
791
-        if ($this->_cache_on && $cache && ! $load_only) {
792
-            // return object if it's already cached
793
-            $cached_class = $this->_get_cached_class($class_name, $class_prefix);
794
-            if ($cached_class !== null) {
795
-                return $cached_class;
796
-            }
797
-        }
798
-        // if the class doesn't already exist.. then we need to try and find the file and load it
799
-        if (! $class_exists) {
800
-            // get full path to file
801
-            $path = $this->_resolve_path($class_name, $type, $file_paths);
802
-            // load the file
803
-            $loaded = $this->_require_file($path, $class_name, $type, $file_paths);
804
-            // if loading failed, or we are only loading a file but NOT instantiating an object
805
-            if (! $loaded || $load_only) {
806
-                // return boolean if only loading, or null if an object was expected
807
-                return $load_only
808
-                    ? $loaded
809
-                    : null;
810
-            }
811
-        }
812
-        // instantiate the requested object
813
-        $class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
814
-        if ($this->_cache_on && $cache) {
815
-            // save it for later... kinda like gum  { : $
816
-            $this->_set_cached_class($class_obj, $class_name, $class_prefix, $from_db);
817
-        }
818
-        $this->_cache_on = true;
819
-        return $class_obj;
820
-    }
821
-
822
-
823
-
824
-    /**
825
-     * attempts to find a cached version of the requested class
826
-     * by looking in the following places:
827
-     *        $this->{$class_abbreviation}            ie:    $this->CART
828
-     *        $this->{$class_name}                        ie:    $this->Some_Class
829
-     *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
830
-     *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
831
-     *
832
-     * @param string $class_name
833
-     * @param string $class_prefix
834
-     * @return mixed
835
-     */
836
-    protected function _get_cached_class($class_name, $class_prefix = '')
837
-    {
838
-        if ($class_name === 'EE_Registry') {
839
-            return $this;
840
-        }
841
-        // have to specify something, but not anything that will conflict
842
-        $class_abbreviation = isset($this->_class_abbreviations[$class_name])
843
-            ? $this->_class_abbreviations[$class_name]
844
-            : 'FANCY_BATMAN_PANTS';
845
-        $class_name = str_replace('\\', '_', $class_name);
846
-        // check if class has already been loaded, and return it if it has been
847
-        if (isset($this->{$class_abbreviation})) {
848
-            return $this->{$class_abbreviation};
849
-        }
850
-        if (isset ($this->{$class_name})) {
851
-            return $this->{$class_name};
852
-        }
853
-        if (isset ($this->LIB->{$class_name})) {
854
-            return $this->LIB->{$class_name};
855
-        }
856
-        if ($class_prefix === 'addon' && isset ($this->addons->{$class_name})) {
857
-            return $this->addons->{$class_name};
858
-        }
859
-        return null;
860
-    }
861
-
862
-
863
-
864
-    /**
865
-     * removes a cached version of the requested class
866
-     *
867
-     * @param string  $class_name
868
-     * @param boolean $addon
869
-     * @return boolean
870
-     */
871
-    public function clear_cached_class($class_name, $addon = false)
872
-    {
873
-        // have to specify something, but not anything that will conflict
874
-        $class_abbreviation = isset($this->_class_abbreviations[$class_name])
875
-            ? $this->_class_abbreviations[$class_name]
876
-            : 'FANCY_BATMAN_PANTS';
877
-        $class_name = str_replace('\\', '_', $class_name);
878
-        // check if class has already been loaded, and return it if it has been
879
-        if (isset($this->{$class_abbreviation})) {
880
-            $this->{$class_abbreviation} = null;
881
-            return true;
882
-        }
883
-        if (isset($this->{$class_name})) {
884
-            $this->{$class_name} = null;
885
-            return true;
886
-        }
887
-        if (isset($this->LIB->{$class_name})) {
888
-            unset($this->LIB->{$class_name});
889
-            return true;
890
-        }
891
-        if ($addon && isset($this->addons->{$class_name})) {
892
-            unset($this->addons->{$class_name});
893
-            return true;
894
-        }
895
-        return false;
896
-    }
897
-
898
-
899
-
900
-    /**
901
-     * attempts to find a full valid filepath for the requested class.
902
-     * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
903
-     * then returns that path if the target file has been found and is readable
904
-     *
905
-     * @param string $class_name
906
-     * @param string $type
907
-     * @param array  $file_paths
908
-     * @return string | bool
909
-     */
910
-    protected function _resolve_path($class_name, $type = '', $file_paths = array())
911
-    {
912
-        // make sure $file_paths is an array
913
-        $file_paths = is_array($file_paths)
914
-            ? $file_paths
915
-            : array($file_paths);
916
-        // cycle thru paths
917
-        foreach ($file_paths as $key => $file_path) {
918
-            // convert all separators to proper DS, if no filepath, then use EE_CLASSES
919
-            $file_path = $file_path
920
-                ? str_replace(array('/', '\\'), DS, $file_path)
921
-                : EE_CLASSES;
922
-            // prep file type
923
-            $type = ! empty($type)
924
-                ? trim($type, '.') . '.'
925
-                : '';
926
-            // build full file path
927
-            $file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
928
-            //does the file exist and can be read ?
929
-            if (is_readable($file_paths[$key])) {
930
-                return $file_paths[$key];
931
-            }
932
-        }
933
-        return false;
934
-    }
935
-
936
-
937
-
938
-    /**
939
-     * basically just performs a require_once()
940
-     * but with some error handling
941
-     *
942
-     * @param  string $path
943
-     * @param  string $class_name
944
-     * @param  string $type
945
-     * @param  array  $file_paths
946
-     * @return bool
947
-     * @throws EE_Error
948
-     * @throws ReflectionException
949
-     */
950
-    protected function _require_file($path, $class_name, $type = '', $file_paths = array())
951
-    {
952
-        // don't give up! you gotta...
953
-        try {
954
-            //does the file exist and can it be read ?
955
-            if (! $path) {
956
-                // so sorry, can't find the file
957
-                throw new EE_Error (
958
-                    sprintf(
959
-                        esc_html__(
960
-                            'The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s',
961
-                            'event_espresso'
962
-                        ),
963
-                        trim($type, '.'),
964
-                        $class_name,
965
-                        '<br />' . implode(',<br />', $file_paths)
966
-                    )
967
-                );
968
-            }
969
-            // get the file
970
-            require_once($path);
971
-            // if the class isn't already declared somewhere
972
-            if (class_exists($class_name, false) === false) {
973
-                // so sorry, not a class
974
-                throw new EE_Error(
975
-                    sprintf(
976
-                        esc_html__('The %s file %s does not appear to contain the %s Class.', 'event_espresso'),
977
-                        $type,
978
-                        $path,
979
-                        $class_name
980
-                    )
981
-                );
982
-            }
983
-        } catch (EE_Error $e) {
984
-            $e->get_error();
985
-            return false;
986
-        }
987
-        return true;
988
-    }
989
-
990
-
991
-
992
-    /**
993
-     * _create_object
994
-     * Attempts to instantiate the requested class via any of the
995
-     * commonly used instantiation methods employed throughout EE.
996
-     * The priority for instantiation is as follows:
997
-     *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
998
-     *        - model objects via their 'new_instance_from_db' method
999
-     *        - model objects via their 'new_instance' method
1000
-     *        - "singleton" classes" via their 'instance' method
1001
-     *    - standard instantiable classes via their __constructor
1002
-     * Prior to instantiation, if the classname exists in the dependency_map,
1003
-     * then the constructor for the requested class will be examined to determine
1004
-     * if any dependencies exist, and if they can be injected.
1005
-     * If so, then those classes will be added to the array of arguments passed to the constructor
1006
-     *
1007
-     * @param string $class_name
1008
-     * @param array  $arguments
1009
-     * @param string $type
1010
-     * @param bool   $from_db
1011
-     * @return null|object
1012
-     * @throws EE_Error
1013
-     * @throws ReflectionException
1014
-     */
1015
-    protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
1016
-    {
1017
-        $class_obj = null;
1018
-        $instantiation_mode = '0) none';
1019
-        // don't give up! you gotta...
1020
-        try {
1021
-            // create reflection
1022
-            $reflector = $this->get_ReflectionClass($class_name);
1023
-            // make sure arguments are an array
1024
-            $arguments = is_array($arguments)
1025
-                ? $arguments
1026
-                : array($arguments);
1027
-            // and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
1028
-            // else wrap it in an additional array so that it doesn't get split into multiple parameters
1029
-            $arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
1030
-                ? $arguments
1031
-                : array($arguments);
1032
-            // attempt to inject dependencies ?
1033
-            if ($this->_dependency_map->has($class_name)) {
1034
-                $arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
1035
-            }
1036
-            // instantiate the class if possible
1037
-            if ($reflector->isAbstract()) {
1038
-                // nothing to instantiate, loading file was enough
1039
-                // does not throw an exception so $instantiation_mode is unused
1040
-                // $instantiation_mode = "1) no constructor abstract class";
1041
-                $class_obj = true;
1042
-            } else if (empty($arguments) && $reflector->getConstructor() === null && $reflector->isInstantiable()) {
1043
-                // no constructor = static methods only... nothing to instantiate, loading file was enough
1044
-                $instantiation_mode = '2) no constructor but instantiable';
1045
-                $class_obj = $reflector->newInstance();
1046
-            } else if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
1047
-                $instantiation_mode = '3) new_instance_from_db()';
1048
-                $class_obj = call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
1049
-            } else if (method_exists($class_name, 'new_instance')) {
1050
-                $instantiation_mode = '4) new_instance()';
1051
-                $class_obj = call_user_func_array(array($class_name, 'new_instance'), $arguments);
1052
-            } else if (method_exists($class_name, 'instance')) {
1053
-                $instantiation_mode = '5) instance()';
1054
-                $class_obj = call_user_func_array(array($class_name, 'instance'), $arguments);
1055
-            } else if ($reflector->isInstantiable()) {
1056
-                $instantiation_mode = '6) constructor';
1057
-                $class_obj = $reflector->newInstanceArgs($arguments);
1058
-            } else {
1059
-                // heh ? something's not right !
1060
-                throw new EE_Error(
1061
-                    sprintf(
1062
-                        esc_html__('The %s file %s could not be instantiated.', 'event_espresso'),
1063
-                        $type,
1064
-                        $class_name
1065
-                    )
1066
-                );
1067
-            }
1068
-        } catch (Exception $e) {
1069
-            if (! $e instanceof EE_Error) {
1070
-                $e = new EE_Error(
1071
-                    sprintf(
1072
-                        esc_html__(
1073
-                            'The following error occurred while attempting to instantiate "%1$s": %2$s %3$s %2$s instantiation mode : %4$s',
1074
-                            'event_espresso'
1075
-                        ),
1076
-                        $class_name,
1077
-                        '<br />',
1078
-                        $e->getMessage(),
1079
-                        $instantiation_mode
1080
-                    )
1081
-                );
1082
-            }
1083
-            $e->get_error();
1084
-        }
1085
-        return $class_obj;
1086
-    }
1087
-
1088
-
1089
-
1090
-    /**
1091
-     * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
1092
-     * @param array $array
1093
-     * @return bool
1094
-     */
1095
-    protected function _array_is_numerically_and_sequentially_indexed(array $array)
1096
-    {
1097
-        return ! empty($array)
1098
-            ? array_keys($array) === range(0, count($array) - 1)
1099
-            : true;
1100
-    }
1101
-
1102
-
1103
-
1104
-    /**
1105
-     * getReflectionClass
1106
-     * checks if a ReflectionClass object has already been generated for a class
1107
-     * and returns that instead of creating a new one
1108
-     *
1109
-     * @param string $class_name
1110
-     * @return ReflectionClass
1111
-     * @throws ReflectionException
1112
-     */
1113
-    public function get_ReflectionClass($class_name)
1114
-    {
1115
-        if (
1116
-            ! isset($this->_reflectors[$class_name])
1117
-            || ! $this->_reflectors[$class_name] instanceof ReflectionClass
1118
-        ) {
1119
-            $this->_reflectors[$class_name] = new ReflectionClass($class_name);
1120
-        }
1121
-        return $this->_reflectors[$class_name];
1122
-    }
1123
-
1124
-
1125
-
1126
-    /**
1127
-     * _resolve_dependencies
1128
-     * examines the constructor for the requested class to determine
1129
-     * if any dependencies exist, and if they can be injected.
1130
-     * If so, then those classes will be added to the array of arguments passed to the constructor
1131
-     * PLZ NOTE: this is achieved by type hinting the constructor params
1132
-     * For example:
1133
-     *        if attempting to load a class "Foo" with the following constructor:
1134
-     *        __construct( Bar $bar_class, Fighter $grohl_class )
1135
-     *        then $bar_class and $grohl_class will be added to the $arguments array,
1136
-     *        but only IF they are NOT already present in the incoming arguments array,
1137
-     *        and the correct classes can be loaded
1138
-     *
1139
-     * @param ReflectionClass $reflector
1140
-     * @param string          $class_name
1141
-     * @param array           $arguments
1142
-     * @return array
1143
-     * @throws EE_Error
1144
-     * @throws ReflectionException
1145
-     */
1146
-    protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, $arguments = array())
1147
-    {
1148
-        // let's examine the constructor
1149
-        $constructor = $reflector->getConstructor();
1150
-        // whu? huh? nothing?
1151
-        if (! $constructor) {
1152
-            return $arguments;
1153
-        }
1154
-        // get constructor parameters
1155
-        $params = $constructor->getParameters();
1156
-        // and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
1157
-        $argument_keys = array_keys($arguments);
1158
-        // now loop thru all of the constructors expected parameters
1159
-        foreach ($params as $index => $param) {
1160
-            // is this a dependency for a specific class ?
1161
-            $param_class = $param->getClass()
1162
-                ? $param->getClass()->name
1163
-                : null;
1164
-            // BUT WAIT !!! This class may be an alias for something else (or getting replaced at runtime)
1165
-            $param_class = $this->_dependency_map->has_alias($param_class, $class_name)
1166
-                ? $this->_dependency_map->get_alias($param_class, $class_name)
1167
-                : $param_class;
1168
-            if (
1169
-                // param is not even a class
1170
-                empty($param_class)
1171
-                // and something already exists in the incoming arguments for this param
1172
-                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1173
-            ) {
1174
-                // so let's skip this argument and move on to the next
1175
-                continue;
1176
-            }
1177
-            if (
1178
-                // parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1179
-                ! empty($param_class)
1180
-                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1181
-                && $arguments[$argument_keys[$index]] instanceof $param_class
1182
-            ) {
1183
-                // skip this argument and move on to the next
1184
-                continue;
1185
-            }
1186
-            if (
1187
-                // parameter is type hinted as a class, and should be injected
1188
-                ! empty($param_class)
1189
-                && $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1190
-            ) {
1191
-                $arguments = $this->_resolve_dependency($class_name, $param_class, $arguments, $index);
1192
-            } else {
1193
-                try {
1194
-                    $arguments[$index] = $param->getDefaultValue();
1195
-                } catch (ReflectionException $e) {
1196
-                    throw new ReflectionException(
1197
-                        sprintf(
1198
-                            esc_html__('%1$s for parameter "$%2$s"', 'event_espresso'),
1199
-                            $e->getMessage(),
1200
-                            $param->getName()
1201
-                        )
1202
-                    );
1203
-                }
1204
-            }
1205
-        }
1206
-        return $arguments;
1207
-    }
1208
-
1209
-
1210
-
1211
-    /**
1212
-     * @param string $class_name
1213
-     * @param string $param_class
1214
-     * @param array  $arguments
1215
-     * @param mixed  $index
1216
-     * @return array
1217
-     * @throws EE_Error
1218
-     * @throws ReflectionException
1219
-     */
1220
-    protected function _resolve_dependency($class_name, $param_class, $arguments, $index)
1221
-    {
1222
-        $dependency = null;
1223
-        // should dependency be loaded from cache ?
1224
-        $cache_on = $this->_dependency_map->loading_strategy_for_class_dependency($class_name, $param_class)
1225
-                    !== EE_Dependency_Map::load_new_object;
1226
-        // we might have a dependency...
1227
-        // let's MAYBE try and find it in our cache if that's what's been requested
1228
-        $cached_class = $cache_on
1229
-            ? $this->_get_cached_class($param_class)
1230
-            : null;
1231
-        // and grab it if it exists
1232
-        if ($cached_class instanceof $param_class) {
1233
-            $dependency = $cached_class;
1234
-        } else if ($param_class !== $class_name) {
1235
-            // obtain the loader method from the dependency map
1236
-            $loader = $this->_dependency_map->class_loader($param_class);
1237
-            // is loader a custom closure ?
1238
-            if ($loader instanceof Closure) {
1239
-                $dependency = $loader();
1240
-            } else {
1241
-                // set the cache on property for the recursive loading call
1242
-                $this->_cache_on = $cache_on;
1243
-                // if not, then let's try and load it via the registry
1244
-                if ($loader && method_exists($this, $loader)) {
1245
-                    $dependency = $this->{$loader}($param_class);
1246
-                } else {
1247
-                    $dependency = $this->create($param_class, array(), $cache_on);
1248
-                }
1249
-            }
1250
-        }
1251
-        // did we successfully find the correct dependency ?
1252
-        if ($dependency instanceof $param_class) {
1253
-            // then let's inject it into the incoming array of arguments at the correct location
1254
-            if (isset($argument_keys[$index])) {
1255
-                $arguments[$argument_keys[$index]] = $dependency;
1256
-            } else {
1257
-                $arguments[$index] = $dependency;
1258
-            }
1259
-        }
1260
-        return $arguments;
1261
-    }
1262
-
1263
-
1264
-
1265
-    /**
1266
-     * _set_cached_class
1267
-     * attempts to cache the instantiated class locally
1268
-     * in one of the following places, in the following order:
1269
-     *        $this->{class_abbreviation}   ie:    $this->CART
1270
-     *        $this->{$class_name}          ie:    $this->Some_Class
1271
-     *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1272
-     *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1273
-     *
1274
-     * @param object $class_obj
1275
-     * @param string $class_name
1276
-     * @param string $class_prefix
1277
-     * @param bool   $from_db
1278
-     * @return void
1279
-     */
1280
-    protected function _set_cached_class($class_obj, $class_name, $class_prefix = '', $from_db = false)
1281
-    {
1282
-        if ($class_name === 'EE_Registry' || empty($class_obj)) {
1283
-            return;
1284
-        }
1285
-        // return newly instantiated class
1286
-        if (isset($this->_class_abbreviations[$class_name])) {
1287
-            $class_abbreviation = $this->_class_abbreviations[$class_name];
1288
-            $this->{$class_abbreviation} = $class_obj;
1289
-            return;
1290
-        }
1291
-        $class_name = str_replace('\\', '_', $class_name);
1292
-        if (property_exists($this, $class_name)) {
1293
-            $this->{$class_name} = $class_obj;
1294
-            return;
1295
-        }
1296
-        if ($class_prefix === 'addon') {
1297
-            $this->addons->{$class_name} = $class_obj;
1298
-            return;
1299
-        }
1300
-        if (! $from_db) {
1301
-            $this->LIB->{$class_name} = $class_obj;
1302
-        }
1303
-    }
1304
-
1305
-
1306
-
1307
-    /**
1308
-     * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1309
-     *
1310
-     * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1311
-     *                          in the EE_Dependency_Map::$_class_loaders array,
1312
-     *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1313
-     * @param array  $arguments
1314
-     * @return object
1315
-     */
1316
-    public static function factory($classname, $arguments = array())
1317
-    {
1318
-        $loader = self::instance()->_dependency_map->class_loader($classname);
1319
-        if ($loader instanceof Closure) {
1320
-            return $loader($arguments);
1321
-        }
1322
-        if (method_exists(self::instance(), $loader)) {
1323
-            return self::instance()->{$loader}($classname, $arguments);
1324
-        }
1325
-        return null;
1326
-    }
1327
-
1328
-
1329
-
1330
-    /**
1331
-     * Gets the addon by its name/slug (not classname. For that, just
1332
-     * use the classname as the property name on EE_Config::instance()->addons)
1333
-     *
1334
-     * @param string $name
1335
-     * @return EE_Addon
1336
-     */
1337
-    public function get_addon_by_name($name)
1338
-    {
1339
-        foreach ($this->addons as $addon) {
1340
-            if ($addon->name() === $name) {
1341
-                return $addon;
1342
-            }
1343
-        }
1344
-        return null;
1345
-    }
1346
-
1347
-
1348
-
1349
-    /**
1350
-     * Gets an array of all the registered addons, where the keys are their names. (ie, what each returns for their
1351
-     * name() function) They're already available on EE_Config::instance()->addons as properties, where each property's
1352
-     * name is the addon's classname. So if you just want to get the addon by classname, use
1353
-     * EE_Config::instance()->addons->{classname}
1354
-     *
1355
-     * @return EE_Addon[] where the KEYS are the addon's name()
1356
-     */
1357
-    public function get_addons_by_name()
1358
-    {
1359
-        $addons = array();
1360
-        foreach ($this->addons as $addon) {
1361
-            $addons[$addon->name()] = $addon;
1362
-        }
1363
-        return $addons;
1364
-    }
1365
-
1366
-
1367
-
1368
-    /**
1369
-     * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1370
-     * a stale copy of it around
1371
-     *
1372
-     * @param string $model_name
1373
-     * @return \EEM_Base
1374
-     * @throws \EE_Error
1375
-     */
1376
-    public function reset_model($model_name)
1377
-    {
1378
-        $model_class_name = strpos($model_name, 'EEM_') !== 0
1379
-            ? "EEM_{$model_name}"
1380
-            : $model_name;
1381
-        if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1382
-            return null;
1383
-        }
1384
-        //get that model reset it and make sure we nuke the old reference to it
1385
-        if ($this->LIB->{$model_class_name} instanceof $model_class_name
1386
-            && is_callable(
1387
-                array($model_class_name, 'reset')
1388
-            )) {
1389
-            $this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1390
-        } else {
1391
-            throw new EE_Error(sprintf(esc_html__('Model %s does not have a method "reset"', 'event_espresso'), $model_name));
1392
-        }
1393
-        return $this->LIB->{$model_class_name};
1394
-    }
1395
-
1396
-
1397
-
1398
-    /**
1399
-     * Resets the registry.
1400
-     * The criteria for what gets reset is based on what can be shared between sites on the same request when
1401
-     * switch_to_blog is used in a multisite install.  Here is a list of things that are NOT reset.
1402
-     * - $_dependency_map
1403
-     * - $_class_abbreviations
1404
-     * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1405
-     * - $REQ:  Still on the same request so no need to change.
1406
-     * - $CAP: There is no site specific state in the EE_Capability class.
1407
-     * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only
1408
-     * one Session can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1409
-     * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1410
-     *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1411
-     *             switch or on the restore.
1412
-     * - $modules
1413
-     * - $shortcodes
1414
-     * - $widgets
1415
-     *
1416
-     * @param boolean $hard             whether to reset data in the database too, or just refresh
1417
-     *                                  the Registry to its state at the beginning of the request
1418
-     * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1419
-     *                                  or just reset without re-instantiating (handy to set to FALSE if you're not
1420
-     *                                  sure if you CAN currently reinstantiate the singletons at the moment)
1421
-     * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so
1422
-     *                                  client
1423
-     *                                  code instead can just change the model context to a different blog id if
1424
-     *                                  necessary
1425
-     * @return EE_Registry
1426
-     * @throws EE_Error
1427
-     * @throws ReflectionException
1428
-     */
1429
-    public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1430
-    {
1431
-        $instance = self::instance();
1432
-        $instance->_cache_on = true;
1433
-        // reset some "special" classes
1434
-        EEH_Activation::reset();
1435
-        $instance->CFG = EE_Config::reset($hard, $reinstantiate);
1436
-        $instance->CART = null;
1437
-        $instance->MRM = null;
1438
-        $instance->AssetsRegistry = $instance->create('EventEspresso\core\services\assets\Registry');
1439
-        //messages reset
1440
-        EED_Messages::reset();
1441
-        //handle of objects cached on LIB
1442
-        foreach (array('LIB', 'modules') as $cache) {
1443
-            foreach ($instance->{$cache} as $class_name => $class) {
1444
-                if (self::_reset_and_unset_object($class, $reset_models)) {
1445
-                    unset($instance->{$cache}->{$class_name});
1446
-                }
1447
-            }
1448
-        }
1449
-        return $instance;
1450
-    }
1451
-
1452
-
1453
-
1454
-    /**
1455
-     * if passed object implements ResettableInterface, then call it's reset() method
1456
-     * if passed object implements InterminableInterface, then return false,
1457
-     * to indicate that it should NOT be cleared from the Registry cache
1458
-     *
1459
-     * @param      $object
1460
-     * @param bool $reset_models
1461
-     * @return bool returns true if cached object should be unset
1462
-     */
1463
-    private static function _reset_and_unset_object($object, $reset_models)
1464
-    {
1465
-        if (! is_object($object)) {
1466
-            // don't unset anything that's not an object
1467
-            return false;
1468
-        }
1469
-        if ($object instanceof EED_Module) {
1470
-            $object::reset();
1471
-            // don't unset modules
1472
-            return false;
1473
-        }
1474
-        if ($object instanceof ResettableInterface) {
1475
-            if ($object instanceof EEM_Base) {
1476
-                if ($reset_models) {
1477
-                    $object->reset();
1478
-                    return true;
1479
-                }
1480
-                return false;
1481
-            }
1482
-            $object->reset();
1483
-            return true;
1484
-        }
1485
-        if (! $object instanceof InterminableInterface) {
1486
-            return true;
1487
-        }
1488
-        return false;
1489
-    }
1490
-
1491
-
1492
-
1493
-    /**
1494
-     * Gets all the custom post type models defined
1495
-     *
1496
-     * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1497
-     */
1498
-    public function cpt_models()
1499
-    {
1500
-        $cpt_models = array();
1501
-        foreach ($this->non_abstract_db_models as $short_name => $classname) {
1502
-            if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1503
-                $cpt_models[$short_name] = $classname;
1504
-            }
1505
-        }
1506
-        return $cpt_models;
1507
-    }
1508
-
1509
-
1510
-
1511
-    /**
1512
-     * @return \EE_Config
1513
-     */
1514
-    public static function CFG()
1515
-    {
1516
-        return self::instance()->CFG;
1517
-    }
23
+	/**
24
+	 * @var EE_Registry $_instance
25
+	 */
26
+	private static $_instance;
27
+
28
+	/**
29
+	 * @var EE_Dependency_Map $_dependency_map
30
+	 */
31
+	protected $_dependency_map;
32
+
33
+	/**
34
+	 * @var array $_class_abbreviations
35
+	 */
36
+	protected $_class_abbreviations = array();
37
+
38
+	/**
39
+	 * @var CommandBusInterface $BUS
40
+	 */
41
+	public $BUS;
42
+
43
+	/**
44
+	 * @var EE_Cart $CART
45
+	 */
46
+	public $CART;
47
+
48
+	/**
49
+	 * @var EE_Config $CFG
50
+	 */
51
+	public $CFG;
52
+
53
+	/**
54
+	 * @var EE_Network_Config $NET_CFG
55
+	 */
56
+	public $NET_CFG;
57
+
58
+	/**
59
+	 * StdClass object for storing library classes in
60
+	 *
61
+	 * @var StdClass $LIB
62
+	 */
63
+	public $LIB;
64
+
65
+	/**
66
+	 * @var EE_Request_Handler $REQ
67
+	 */
68
+	public $REQ;
69
+
70
+	/**
71
+	 * @var EE_Session $SSN
72
+	 */
73
+	public $SSN;
74
+
75
+	/**
76
+	 * @since 4.5.0
77
+	 * @var EE_Capabilities $CAP
78
+	 */
79
+	public $CAP;
80
+
81
+	/**
82
+	 * @since 4.9.0
83
+	 * @var EE_Message_Resource_Manager $MRM
84
+	 */
85
+	public $MRM;
86
+
87
+
88
+	/**
89
+	 * @var Registry $AssetsRegistry
90
+	 */
91
+	public $AssetsRegistry;
92
+
93
+	/**
94
+	 * StdClass object for holding addons which have registered themselves to work with EE core
95
+	 *
96
+	 * @var EE_Addon[] $addons
97
+	 */
98
+	public $addons;
99
+
100
+	/**
101
+	 * keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
102
+	 *
103
+	 * @var EEM_Base[] $models
104
+	 */
105
+	public $models = array();
106
+
107
+	/**
108
+	 * @var EED_Module[] $modules
109
+	 */
110
+	public $modules;
111
+
112
+	/**
113
+	 * @var EES_Shortcode[] $shortcodes
114
+	 */
115
+	public $shortcodes;
116
+
117
+	/**
118
+	 * @var WP_Widget[] $widgets
119
+	 */
120
+	public $widgets;
121
+
122
+	/**
123
+	 * this is an array of all implemented model names (i.e. not the parent abstract models, or models
124
+	 * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
125
+	 * Keys are model "short names" (eg "Event") as used in model relations, and values are
126
+	 * classnames (eg "EEM_Event")
127
+	 *
128
+	 * @var array $non_abstract_db_models
129
+	 */
130
+	public $non_abstract_db_models = array();
131
+
132
+
133
+	/**
134
+	 * internationalization for JS strings
135
+	 *    usage:   EE_Registry::i18n_js_strings['string_key'] = esc_html__( 'string to translate.', 'event_espresso' );
136
+	 *    in js file:  var translatedString = eei18n.string_key;
137
+	 *
138
+	 * @var array $i18n_js_strings
139
+	 */
140
+	public static $i18n_js_strings = array();
141
+
142
+
143
+	/**
144
+	 * $main_file - path to espresso.php
145
+	 *
146
+	 * @var array $main_file
147
+	 */
148
+	public $main_file;
149
+
150
+	/**
151
+	 * array of ReflectionClass objects where the key is the class name
152
+	 *
153
+	 * @var ReflectionClass[] $_reflectors
154
+	 */
155
+	public $_reflectors;
156
+
157
+	/**
158
+	 * boolean flag to indicate whether or not to load/save dependencies from/to the cache
159
+	 *
160
+	 * @var boolean $_cache_on
161
+	 */
162
+	protected $_cache_on = true;
163
+
164
+
165
+
166
+	/**
167
+	 * @singleton method used to instantiate class object
168
+	 * @param  EE_Dependency_Map $dependency_map
169
+	 * @return EE_Registry instance
170
+	 */
171
+	public static function instance(EE_Dependency_Map $dependency_map = null)
172
+	{
173
+		// check if class object is instantiated
174
+		if (! self::$_instance instanceof EE_Registry) {
175
+			self::$_instance = new self($dependency_map);
176
+		}
177
+		return self::$_instance;
178
+	}
179
+
180
+
181
+
182
+	/**
183
+	 * protected constructor to prevent direct creation
184
+	 *
185
+	 * @Constructor
186
+	 * @param  EE_Dependency_Map $dependency_map
187
+	 */
188
+	protected function __construct(EE_Dependency_Map $dependency_map)
189
+	{
190
+		$this->_dependency_map = $dependency_map;
191
+		$this->LIB = new stdClass();
192
+		$this->addons = new stdClass();
193
+		$this->modules = new stdClass();
194
+		$this->shortcodes = new stdClass();
195
+		$this->widgets = new stdClass();
196
+		add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
197
+	}
198
+
199
+
200
+
201
+	/**
202
+	 * initialize
203
+	 *
204
+	 * @throws EE_Error
205
+	 * @throws ReflectionException
206
+	 */
207
+	public function initialize()
208
+	{
209
+		$this->_class_abbreviations = apply_filters(
210
+			'FHEE__EE_Registry____construct___class_abbreviations',
211
+			array(
212
+				'EE_Config'                                       => 'CFG',
213
+				'EE_Session'                                      => 'SSN',
214
+				'EE_Capabilities'                                 => 'CAP',
215
+				'EE_Cart'                                         => 'CART',
216
+				'EE_Network_Config'                               => 'NET_CFG',
217
+				'EE_Request_Handler'                              => 'REQ',
218
+				'EE_Message_Resource_Manager'                     => 'MRM',
219
+				'EventEspresso\core\services\commands\CommandBus' => 'BUS',
220
+				'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
221
+			)
222
+		);
223
+		$this->load_core('Base', array(), true);
224
+		// add our request and response objects to the cache
225
+		$request_loader = $this->_dependency_map->class_loader('EE_Request');
226
+		$this->_set_cached_class(
227
+			$request_loader(),
228
+			'EE_Request'
229
+		);
230
+		$response_loader = $this->_dependency_map->class_loader('EE_Response');
231
+		$this->_set_cached_class(
232
+			$response_loader(),
233
+			'EE_Response'
234
+		);
235
+		add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
236
+	}
237
+
238
+
239
+
240
+	/**
241
+	 * @return void
242
+	 */
243
+	public function init()
244
+	{
245
+		// Get current page protocol
246
+		$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
247
+		// Output admin-ajax.php URL with same protocol as current page
248
+		self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
249
+		self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
250
+	}
251
+
252
+
253
+
254
+	/**
255
+	 * localize_i18n_js_strings
256
+	 *
257
+	 * @return string
258
+	 */
259
+	public static function localize_i18n_js_strings()
260
+	{
261
+		$i18n_js_strings = (array)self::$i18n_js_strings;
262
+		foreach ($i18n_js_strings as $key => $value) {
263
+			if (is_scalar($value)) {
264
+				$i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
265
+			}
266
+		}
267
+		return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
268
+	}
269
+
270
+
271
+
272
+	/**
273
+	 * @param $module
274
+	 * @throws EE_Error
275
+	 * @throws ReflectionException
276
+	 */
277
+	public function add_module($module)
278
+	{
279
+		if ($module instanceof EED_Module) {
280
+			$module_class = get_class($module);
281
+			$this->modules->{$module_class} = $module;
282
+		} else {
283
+			if (! class_exists('EE_Module_Request_Router')) {
284
+				$this->load_core('Module_Request_Router');
285
+			}
286
+			EE_Module_Request_Router::module_factory($module);
287
+		}
288
+	}
289
+
290
+
291
+
292
+	/**
293
+	 * @param string $module_name
294
+	 * @return mixed EED_Module | NULL
295
+	 */
296
+	public function get_module($module_name = '')
297
+	{
298
+		return isset($this->modules->{$module_name})
299
+			? $this->modules->{$module_name}
300
+			: null;
301
+	}
302
+
303
+
304
+
305
+	/**
306
+	 * loads core classes - must be singletons
307
+	 *
308
+	 * @param string $class_name - simple class name ie: session
309
+	 * @param mixed  $arguments
310
+	 * @param bool   $load_only
311
+	 * @return mixed
312
+	 * @throws EE_Error
313
+	 * @throws ReflectionException
314
+	 */
315
+	public function load_core($class_name, $arguments = array(), $load_only = false)
316
+	{
317
+		$core_paths = apply_filters(
318
+			'FHEE__EE_Registry__load_core__core_paths',
319
+			array(
320
+				EE_CORE,
321
+				EE_ADMIN,
322
+				EE_CPTS,
323
+				EE_CORE . 'data_migration_scripts' . DS,
324
+				EE_CORE . 'capabilities' . DS,
325
+				EE_CORE . 'request_stack' . DS,
326
+				EE_CORE . 'middleware' . DS,
327
+			)
328
+		);
329
+		// retrieve instantiated class
330
+		return $this->_load(
331
+			$core_paths,
332
+			'EE_',
333
+			$class_name,
334
+			'core',
335
+			$arguments,
336
+			false,
337
+			true,
338
+			$load_only
339
+		);
340
+	}
341
+
342
+
343
+
344
+	/**
345
+	 * loads service classes
346
+	 *
347
+	 * @param string $class_name - simple class name ie: session
348
+	 * @param mixed  $arguments
349
+	 * @param bool   $load_only
350
+	 * @return mixed
351
+	 * @throws EE_Error
352
+	 * @throws ReflectionException
353
+	 */
354
+	public function load_service($class_name, $arguments = array(), $load_only = false)
355
+	{
356
+		$service_paths = apply_filters(
357
+			'FHEE__EE_Registry__load_service__service_paths',
358
+			array(
359
+				EE_CORE . 'services' . DS,
360
+			)
361
+		);
362
+		// retrieve instantiated class
363
+		return $this->_load(
364
+			$service_paths,
365
+			'EE_',
366
+			$class_name,
367
+			'class',
368
+			$arguments,
369
+			false,
370
+			true,
371
+			$load_only
372
+		);
373
+	}
374
+
375
+
376
+
377
+	/**
378
+	 * loads data_migration_scripts
379
+	 *
380
+	 * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
381
+	 * @param mixed  $arguments
382
+	 * @return EE_Data_Migration_Script_Base|mixed
383
+	 * @throws EE_Error
384
+	 * @throws ReflectionException
385
+	 */
386
+	public function load_dms($class_name, $arguments = array())
387
+	{
388
+		// retrieve instantiated class
389
+		return $this->_load(
390
+			EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(),
391
+			'EE_DMS_',
392
+			$class_name,
393
+			'dms',
394
+			$arguments,
395
+			false,
396
+			false
397
+		);
398
+	}
399
+
400
+
401
+
402
+	/**
403
+	 * loads object creating classes - must be singletons
404
+	 *
405
+	 * @param string $class_name - simple class name ie: attendee
406
+	 * @param mixed  $arguments  - an array of arguments to pass to the class
407
+	 * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to
408
+	 *                           instantiate
409
+	 * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then
410
+	 *                           set this to FALSE (ie. when instantiating model objects from client in a loop)
411
+	 * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate
412
+	 *                           (default)
413
+	 * @return EE_Base_Class | bool
414
+	 * @throws EE_Error
415
+	 * @throws ReflectionException
416
+	 */
417
+	public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
418
+	{
419
+		$paths = apply_filters(
420
+			'FHEE__EE_Registry__load_class__paths', array(
421
+			EE_CORE,
422
+			EE_CLASSES,
423
+			EE_BUSINESS,
424
+		)
425
+		);
426
+		// retrieve instantiated class
427
+		return $this->_load(
428
+			$paths,
429
+			'EE_',
430
+			$class_name,
431
+			'class',
432
+			$arguments,
433
+			$from_db,
434
+			$cache,
435
+			$load_only
436
+		);
437
+	}
438
+
439
+
440
+
441
+	/**
442
+	 * loads helper classes - must be singletons
443
+	 *
444
+	 * @param string $class_name - simple class name ie: price
445
+	 * @param mixed  $arguments
446
+	 * @param bool   $load_only
447
+	 * @return EEH_Base | bool
448
+	 * @throws EE_Error
449
+	 * @throws ReflectionException
450
+	 */
451
+	public function load_helper($class_name, $arguments = array(), $load_only = true)
452
+	{
453
+		// todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
454
+		$helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
455
+		// retrieve instantiated class
456
+		return $this->_load(
457
+			$helper_paths,
458
+			'EEH_',
459
+			$class_name,
460
+			'helper',
461
+			$arguments,
462
+			false,
463
+			true,
464
+			$load_only
465
+		);
466
+	}
467
+
468
+
469
+
470
+	/**
471
+	 * loads core classes - must be singletons
472
+	 *
473
+	 * @param string $class_name - simple class name ie: session
474
+	 * @param mixed  $arguments
475
+	 * @param bool   $load_only
476
+	 * @param bool   $cache      whether to cache the object or not.
477
+	 * @return mixed
478
+	 * @throws EE_Error
479
+	 * @throws ReflectionException
480
+	 */
481
+	public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
482
+	{
483
+		$paths = array(
484
+			EE_LIBRARIES,
485
+			EE_LIBRARIES . 'messages' . DS,
486
+			EE_LIBRARIES . 'shortcodes' . DS,
487
+			EE_LIBRARIES . 'qtips' . DS,
488
+			EE_LIBRARIES . 'payment_methods' . DS,
489
+		);
490
+		// retrieve instantiated class
491
+		return $this->_load(
492
+			$paths,
493
+			'EE_',
494
+			$class_name,
495
+			'lib',
496
+			$arguments,
497
+			false,
498
+			$cache,
499
+			$load_only
500
+		);
501
+	}
502
+
503
+
504
+
505
+	/**
506
+	 * loads model classes - must be singletons
507
+	 *
508
+	 * @param string $class_name - simple class name ie: price
509
+	 * @param mixed  $arguments
510
+	 * @param bool   $load_only
511
+	 * @return EEM_Base | bool
512
+	 * @throws EE_Error
513
+	 * @throws ReflectionException
514
+	 */
515
+	public function load_model($class_name, $arguments = array(), $load_only = false)
516
+	{
517
+		$paths = apply_filters(
518
+			'FHEE__EE_Registry__load_model__paths', array(
519
+			EE_MODELS,
520
+			EE_CORE,
521
+		)
522
+		);
523
+		// retrieve instantiated class
524
+		return $this->_load(
525
+			$paths,
526
+			'EEM_',
527
+			$class_name,
528
+			'model',
529
+			$arguments,
530
+			false,
531
+			true,
532
+			$load_only
533
+		);
534
+	}
535
+
536
+
537
+
538
+	/**
539
+	 * loads model classes - must be singletons
540
+	 *
541
+	 * @param string $class_name - simple class name ie: price
542
+	 * @param mixed  $arguments
543
+	 * @param bool   $load_only
544
+	 * @return mixed | bool
545
+	 * @throws EE_Error
546
+	 * @throws ReflectionException
547
+	 */
548
+	public function load_model_class($class_name, $arguments = array(), $load_only = true)
549
+	{
550
+		$paths = array(
551
+			EE_MODELS . 'fields' . DS,
552
+			EE_MODELS . 'helpers' . DS,
553
+			EE_MODELS . 'relations' . DS,
554
+			EE_MODELS . 'strategies' . DS,
555
+		);
556
+		// retrieve instantiated class
557
+		return $this->_load(
558
+			$paths,
559
+			'EE_',
560
+			$class_name,
561
+			'',
562
+			$arguments,
563
+			false,
564
+			true,
565
+			$load_only
566
+		);
567
+	}
568
+
569
+
570
+
571
+	/**
572
+	 * Determines if $model_name is the name of an actual EE model.
573
+	 *
574
+	 * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
575
+	 * @return boolean
576
+	 */
577
+	public function is_model_name($model_name)
578
+	{
579
+		return isset($this->models[$model_name]);
580
+	}
581
+
582
+
583
+
584
+	/**
585
+	 * generic class loader
586
+	 *
587
+	 * @param string $path_to_file - directory path to file location, not including filename
588
+	 * @param string $file_name    - file name  ie:  my_file.php, including extension
589
+	 * @param string $type         - file type - core? class? helper? model?
590
+	 * @param mixed  $arguments
591
+	 * @param bool   $load_only
592
+	 * @return mixed
593
+	 * @throws EE_Error
594
+	 * @throws ReflectionException
595
+	 */
596
+	public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
597
+	{
598
+		// retrieve instantiated class
599
+		return $this->_load(
600
+			$path_to_file,
601
+			'',
602
+			$file_name,
603
+			$type,
604
+			$arguments,
605
+			false,
606
+			true,
607
+			$load_only
608
+		);
609
+	}
610
+
611
+
612
+
613
+	/**
614
+	 * @param string $path_to_file - directory path to file location, not including filename
615
+	 * @param string $class_name   - full class name  ie:  My_Class
616
+	 * @param string $type         - file type - core? class? helper? model?
617
+	 * @param mixed  $arguments
618
+	 * @param bool   $load_only
619
+	 * @return bool|EE_Addon|object
620
+	 * @throws EE_Error
621
+	 * @throws ReflectionException
622
+	 */
623
+	public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
624
+	{
625
+		// retrieve instantiated class
626
+		return $this->_load(
627
+			$path_to_file,
628
+			'addon',
629
+			$class_name,
630
+			$type,
631
+			$arguments,
632
+			false,
633
+			true,
634
+			$load_only
635
+		);
636
+	}
637
+
638
+
639
+
640
+	/**
641
+	 * instantiates, caches, and automatically resolves dependencies
642
+	 * for classes that use a Fully Qualified Class Name.
643
+	 * if the class is not capable of being loaded using PSR-4 autoloading,
644
+	 * then you need to use one of the existing load_*() methods
645
+	 * which can resolve the classname and filepath from the passed arguments
646
+	 *
647
+	 * @param bool|string $class_name   Fully Qualified Class Name
648
+	 * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
649
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
650
+	 * @param bool        $from_db      some classes are instantiated from the db
651
+	 *                                  and thus call a different method to instantiate
652
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
653
+	 * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
654
+	 * @return bool|null|mixed          null = failure to load or instantiate class object.
655
+	 *                                  object = class loaded and instantiated successfully.
656
+	 *                                  bool = fail or success when $load_only is true
657
+	 * @throws EE_Error
658
+	 * @throws ReflectionException
659
+	 */
660
+	public function create(
661
+		$class_name = false,
662
+		$arguments = array(),
663
+		$cache = false,
664
+		$from_db = false,
665
+		$load_only = false,
666
+		$addon = false
667
+	) {
668
+		$class_name = ltrim($class_name, '\\');
669
+		$class_name = $this->_dependency_map->get_alias($class_name);
670
+		$class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
671
+		// if a non-FQCN was passed, then verifyClassExists() might return an object
672
+		// or it could return null if the class just could not be found anywhere
673
+		if ($class_exists instanceof $class_name || $class_exists === null){
674
+			// either way, return the results
675
+			return $class_exists;
676
+		}
677
+		$class_name = $class_exists;
678
+		// if we're only loading the class and it already exists, then let's just return true immediately
679
+		if ($load_only) {
680
+			return true;
681
+		}
682
+		$addon = $addon
683
+			? 'addon'
684
+			: '';
685
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
686
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
687
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
688
+		if ($this->_cache_on && $cache && ! $load_only) {
689
+			// return object if it's already cached
690
+			$cached_class = $this->_get_cached_class($class_name, $addon);
691
+			if ($cached_class !== null) {
692
+				return $cached_class;
693
+			}
694
+		}
695
+		// instantiate the requested object
696
+		$class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
697
+		// if caching is turned on OR this class is cached in a class property
698
+		if (($this->_cache_on && $cache) || isset($this->_class_abbreviations[ $class_name ])) {
699
+			// save it for later... kinda like gum  { : $
700
+			$this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
701
+		}
702
+		$this->_cache_on = true;
703
+		return $class_obj;
704
+	}
705
+
706
+
707
+
708
+	/**
709
+	 * Recursively checks that a class exists and potentially attempts to load classes with non-FQCNs
710
+	 *
711
+	 * @param string $class_name
712
+	 * @param array  $arguments
713
+	 * @param int    $attempt
714
+	 * @return mixed
715
+	 */
716
+	private function loadOrVerifyClassExists($class_name, array $arguments, $attempt = 1) {
717
+		if (is_object($class_name) || class_exists($class_name)) {
718
+			return $class_name;
719
+		}
720
+		switch ($attempt) {
721
+			case 1:
722
+				// if it's a FQCN then maybe the class is registered with a preceding \
723
+				$class_name = strpos($class_name, '\\') !== false
724
+					? '\\' . ltrim($class_name, '\\')
725
+					: $class_name;
726
+				break;
727
+			case 2:
728
+				//
729
+				$loader = $this->_dependency_map->class_loader($class_name);
730
+				if ($loader && method_exists($this, $loader)) {
731
+					return $this->{$loader}($class_name, $arguments);
732
+				}
733
+				break;
734
+			case 3:
735
+			default;
736
+				return null;
737
+		}
738
+		$attempt++;
739
+		return $this->loadOrVerifyClassExists($class_name, $arguments, $attempt);
740
+	}
741
+
742
+
743
+
744
+	/**
745
+	 * instantiates, caches, and injects dependencies for classes
746
+	 *
747
+	 * @param array       $file_paths   an array of paths to folders to look in
748
+	 * @param string      $class_prefix EE  or EEM or... ???
749
+	 * @param bool|string $class_name   $class name
750
+	 * @param string      $type         file type - core? class? helper? model?
751
+	 * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
752
+	 * @param bool        $from_db      some classes are instantiated from the db
753
+	 *                                  and thus call a different method to instantiate
754
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
755
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
756
+	 * @return bool|null|object null = failure to load or instantiate class object.
757
+	 *                                  object = class loaded and instantiated successfully.
758
+	 *                                  bool = fail or success when $load_only is true
759
+	 * @throws EE_Error
760
+	 * @throws ReflectionException
761
+	 */
762
+	protected function _load(
763
+		$file_paths = array(),
764
+		$class_prefix = 'EE_',
765
+		$class_name = false,
766
+		$type = 'class',
767
+		$arguments = array(),
768
+		$from_db = false,
769
+		$cache = true,
770
+		$load_only = false
771
+	) {
772
+		$class_name = ltrim($class_name, '\\');
773
+		// strip php file extension
774
+		$class_name = str_replace('.php', '', trim($class_name));
775
+		// does the class have a prefix ?
776
+		if (! empty($class_prefix) && $class_prefix !== 'addon') {
777
+			// make sure $class_prefix is uppercase
778
+			$class_prefix = strtoupper(trim($class_prefix));
779
+			// add class prefix ONCE!!!
780
+			$class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
781
+		}
782
+		$class_name = $this->_dependency_map->get_alias($class_name);
783
+		$class_exists = class_exists($class_name);
784
+		// if we're only loading the class and it already exists, then let's just return true immediately
785
+		if ($load_only && $class_exists) {
786
+			return true;
787
+		}
788
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
789
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
790
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
791
+		if ($this->_cache_on && $cache && ! $load_only) {
792
+			// return object if it's already cached
793
+			$cached_class = $this->_get_cached_class($class_name, $class_prefix);
794
+			if ($cached_class !== null) {
795
+				return $cached_class;
796
+			}
797
+		}
798
+		// if the class doesn't already exist.. then we need to try and find the file and load it
799
+		if (! $class_exists) {
800
+			// get full path to file
801
+			$path = $this->_resolve_path($class_name, $type, $file_paths);
802
+			// load the file
803
+			$loaded = $this->_require_file($path, $class_name, $type, $file_paths);
804
+			// if loading failed, or we are only loading a file but NOT instantiating an object
805
+			if (! $loaded || $load_only) {
806
+				// return boolean if only loading, or null if an object was expected
807
+				return $load_only
808
+					? $loaded
809
+					: null;
810
+			}
811
+		}
812
+		// instantiate the requested object
813
+		$class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
814
+		if ($this->_cache_on && $cache) {
815
+			// save it for later... kinda like gum  { : $
816
+			$this->_set_cached_class($class_obj, $class_name, $class_prefix, $from_db);
817
+		}
818
+		$this->_cache_on = true;
819
+		return $class_obj;
820
+	}
821
+
822
+
823
+
824
+	/**
825
+	 * attempts to find a cached version of the requested class
826
+	 * by looking in the following places:
827
+	 *        $this->{$class_abbreviation}            ie:    $this->CART
828
+	 *        $this->{$class_name}                        ie:    $this->Some_Class
829
+	 *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
830
+	 *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
831
+	 *
832
+	 * @param string $class_name
833
+	 * @param string $class_prefix
834
+	 * @return mixed
835
+	 */
836
+	protected function _get_cached_class($class_name, $class_prefix = '')
837
+	{
838
+		if ($class_name === 'EE_Registry') {
839
+			return $this;
840
+		}
841
+		// have to specify something, but not anything that will conflict
842
+		$class_abbreviation = isset($this->_class_abbreviations[$class_name])
843
+			? $this->_class_abbreviations[$class_name]
844
+			: 'FANCY_BATMAN_PANTS';
845
+		$class_name = str_replace('\\', '_', $class_name);
846
+		// check if class has already been loaded, and return it if it has been
847
+		if (isset($this->{$class_abbreviation})) {
848
+			return $this->{$class_abbreviation};
849
+		}
850
+		if (isset ($this->{$class_name})) {
851
+			return $this->{$class_name};
852
+		}
853
+		if (isset ($this->LIB->{$class_name})) {
854
+			return $this->LIB->{$class_name};
855
+		}
856
+		if ($class_prefix === 'addon' && isset ($this->addons->{$class_name})) {
857
+			return $this->addons->{$class_name};
858
+		}
859
+		return null;
860
+	}
861
+
862
+
863
+
864
+	/**
865
+	 * removes a cached version of the requested class
866
+	 *
867
+	 * @param string  $class_name
868
+	 * @param boolean $addon
869
+	 * @return boolean
870
+	 */
871
+	public function clear_cached_class($class_name, $addon = false)
872
+	{
873
+		// have to specify something, but not anything that will conflict
874
+		$class_abbreviation = isset($this->_class_abbreviations[$class_name])
875
+			? $this->_class_abbreviations[$class_name]
876
+			: 'FANCY_BATMAN_PANTS';
877
+		$class_name = str_replace('\\', '_', $class_name);
878
+		// check if class has already been loaded, and return it if it has been
879
+		if (isset($this->{$class_abbreviation})) {
880
+			$this->{$class_abbreviation} = null;
881
+			return true;
882
+		}
883
+		if (isset($this->{$class_name})) {
884
+			$this->{$class_name} = null;
885
+			return true;
886
+		}
887
+		if (isset($this->LIB->{$class_name})) {
888
+			unset($this->LIB->{$class_name});
889
+			return true;
890
+		}
891
+		if ($addon && isset($this->addons->{$class_name})) {
892
+			unset($this->addons->{$class_name});
893
+			return true;
894
+		}
895
+		return false;
896
+	}
897
+
898
+
899
+
900
+	/**
901
+	 * attempts to find a full valid filepath for the requested class.
902
+	 * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
903
+	 * then returns that path if the target file has been found and is readable
904
+	 *
905
+	 * @param string $class_name
906
+	 * @param string $type
907
+	 * @param array  $file_paths
908
+	 * @return string | bool
909
+	 */
910
+	protected function _resolve_path($class_name, $type = '', $file_paths = array())
911
+	{
912
+		// make sure $file_paths is an array
913
+		$file_paths = is_array($file_paths)
914
+			? $file_paths
915
+			: array($file_paths);
916
+		// cycle thru paths
917
+		foreach ($file_paths as $key => $file_path) {
918
+			// convert all separators to proper DS, if no filepath, then use EE_CLASSES
919
+			$file_path = $file_path
920
+				? str_replace(array('/', '\\'), DS, $file_path)
921
+				: EE_CLASSES;
922
+			// prep file type
923
+			$type = ! empty($type)
924
+				? trim($type, '.') . '.'
925
+				: '';
926
+			// build full file path
927
+			$file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
928
+			//does the file exist and can be read ?
929
+			if (is_readable($file_paths[$key])) {
930
+				return $file_paths[$key];
931
+			}
932
+		}
933
+		return false;
934
+	}
935
+
936
+
937
+
938
+	/**
939
+	 * basically just performs a require_once()
940
+	 * but with some error handling
941
+	 *
942
+	 * @param  string $path
943
+	 * @param  string $class_name
944
+	 * @param  string $type
945
+	 * @param  array  $file_paths
946
+	 * @return bool
947
+	 * @throws EE_Error
948
+	 * @throws ReflectionException
949
+	 */
950
+	protected function _require_file($path, $class_name, $type = '', $file_paths = array())
951
+	{
952
+		// don't give up! you gotta...
953
+		try {
954
+			//does the file exist and can it be read ?
955
+			if (! $path) {
956
+				// so sorry, can't find the file
957
+				throw new EE_Error (
958
+					sprintf(
959
+						esc_html__(
960
+							'The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s',
961
+							'event_espresso'
962
+						),
963
+						trim($type, '.'),
964
+						$class_name,
965
+						'<br />' . implode(',<br />', $file_paths)
966
+					)
967
+				);
968
+			}
969
+			// get the file
970
+			require_once($path);
971
+			// if the class isn't already declared somewhere
972
+			if (class_exists($class_name, false) === false) {
973
+				// so sorry, not a class
974
+				throw new EE_Error(
975
+					sprintf(
976
+						esc_html__('The %s file %s does not appear to contain the %s Class.', 'event_espresso'),
977
+						$type,
978
+						$path,
979
+						$class_name
980
+					)
981
+				);
982
+			}
983
+		} catch (EE_Error $e) {
984
+			$e->get_error();
985
+			return false;
986
+		}
987
+		return true;
988
+	}
989
+
990
+
991
+
992
+	/**
993
+	 * _create_object
994
+	 * Attempts to instantiate the requested class via any of the
995
+	 * commonly used instantiation methods employed throughout EE.
996
+	 * The priority for instantiation is as follows:
997
+	 *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
998
+	 *        - model objects via their 'new_instance_from_db' method
999
+	 *        - model objects via their 'new_instance' method
1000
+	 *        - "singleton" classes" via their 'instance' method
1001
+	 *    - standard instantiable classes via their __constructor
1002
+	 * Prior to instantiation, if the classname exists in the dependency_map,
1003
+	 * then the constructor for the requested class will be examined to determine
1004
+	 * if any dependencies exist, and if they can be injected.
1005
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
1006
+	 *
1007
+	 * @param string $class_name
1008
+	 * @param array  $arguments
1009
+	 * @param string $type
1010
+	 * @param bool   $from_db
1011
+	 * @return null|object
1012
+	 * @throws EE_Error
1013
+	 * @throws ReflectionException
1014
+	 */
1015
+	protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
1016
+	{
1017
+		$class_obj = null;
1018
+		$instantiation_mode = '0) none';
1019
+		// don't give up! you gotta...
1020
+		try {
1021
+			// create reflection
1022
+			$reflector = $this->get_ReflectionClass($class_name);
1023
+			// make sure arguments are an array
1024
+			$arguments = is_array($arguments)
1025
+				? $arguments
1026
+				: array($arguments);
1027
+			// and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
1028
+			// else wrap it in an additional array so that it doesn't get split into multiple parameters
1029
+			$arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
1030
+				? $arguments
1031
+				: array($arguments);
1032
+			// attempt to inject dependencies ?
1033
+			if ($this->_dependency_map->has($class_name)) {
1034
+				$arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
1035
+			}
1036
+			// instantiate the class if possible
1037
+			if ($reflector->isAbstract()) {
1038
+				// nothing to instantiate, loading file was enough
1039
+				// does not throw an exception so $instantiation_mode is unused
1040
+				// $instantiation_mode = "1) no constructor abstract class";
1041
+				$class_obj = true;
1042
+			} else if (empty($arguments) && $reflector->getConstructor() === null && $reflector->isInstantiable()) {
1043
+				// no constructor = static methods only... nothing to instantiate, loading file was enough
1044
+				$instantiation_mode = '2) no constructor but instantiable';
1045
+				$class_obj = $reflector->newInstance();
1046
+			} else if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
1047
+				$instantiation_mode = '3) new_instance_from_db()';
1048
+				$class_obj = call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
1049
+			} else if (method_exists($class_name, 'new_instance')) {
1050
+				$instantiation_mode = '4) new_instance()';
1051
+				$class_obj = call_user_func_array(array($class_name, 'new_instance'), $arguments);
1052
+			} else if (method_exists($class_name, 'instance')) {
1053
+				$instantiation_mode = '5) instance()';
1054
+				$class_obj = call_user_func_array(array($class_name, 'instance'), $arguments);
1055
+			} else if ($reflector->isInstantiable()) {
1056
+				$instantiation_mode = '6) constructor';
1057
+				$class_obj = $reflector->newInstanceArgs($arguments);
1058
+			} else {
1059
+				// heh ? something's not right !
1060
+				throw new EE_Error(
1061
+					sprintf(
1062
+						esc_html__('The %s file %s could not be instantiated.', 'event_espresso'),
1063
+						$type,
1064
+						$class_name
1065
+					)
1066
+				);
1067
+			}
1068
+		} catch (Exception $e) {
1069
+			if (! $e instanceof EE_Error) {
1070
+				$e = new EE_Error(
1071
+					sprintf(
1072
+						esc_html__(
1073
+							'The following error occurred while attempting to instantiate "%1$s": %2$s %3$s %2$s instantiation mode : %4$s',
1074
+							'event_espresso'
1075
+						),
1076
+						$class_name,
1077
+						'<br />',
1078
+						$e->getMessage(),
1079
+						$instantiation_mode
1080
+					)
1081
+				);
1082
+			}
1083
+			$e->get_error();
1084
+		}
1085
+		return $class_obj;
1086
+	}
1087
+
1088
+
1089
+
1090
+	/**
1091
+	 * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
1092
+	 * @param array $array
1093
+	 * @return bool
1094
+	 */
1095
+	protected function _array_is_numerically_and_sequentially_indexed(array $array)
1096
+	{
1097
+		return ! empty($array)
1098
+			? array_keys($array) === range(0, count($array) - 1)
1099
+			: true;
1100
+	}
1101
+
1102
+
1103
+
1104
+	/**
1105
+	 * getReflectionClass
1106
+	 * checks if a ReflectionClass object has already been generated for a class
1107
+	 * and returns that instead of creating a new one
1108
+	 *
1109
+	 * @param string $class_name
1110
+	 * @return ReflectionClass
1111
+	 * @throws ReflectionException
1112
+	 */
1113
+	public function get_ReflectionClass($class_name)
1114
+	{
1115
+		if (
1116
+			! isset($this->_reflectors[$class_name])
1117
+			|| ! $this->_reflectors[$class_name] instanceof ReflectionClass
1118
+		) {
1119
+			$this->_reflectors[$class_name] = new ReflectionClass($class_name);
1120
+		}
1121
+		return $this->_reflectors[$class_name];
1122
+	}
1123
+
1124
+
1125
+
1126
+	/**
1127
+	 * _resolve_dependencies
1128
+	 * examines the constructor for the requested class to determine
1129
+	 * if any dependencies exist, and if they can be injected.
1130
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
1131
+	 * PLZ NOTE: this is achieved by type hinting the constructor params
1132
+	 * For example:
1133
+	 *        if attempting to load a class "Foo" with the following constructor:
1134
+	 *        __construct( Bar $bar_class, Fighter $grohl_class )
1135
+	 *        then $bar_class and $grohl_class will be added to the $arguments array,
1136
+	 *        but only IF they are NOT already present in the incoming arguments array,
1137
+	 *        and the correct classes can be loaded
1138
+	 *
1139
+	 * @param ReflectionClass $reflector
1140
+	 * @param string          $class_name
1141
+	 * @param array           $arguments
1142
+	 * @return array
1143
+	 * @throws EE_Error
1144
+	 * @throws ReflectionException
1145
+	 */
1146
+	protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, $arguments = array())
1147
+	{
1148
+		// let's examine the constructor
1149
+		$constructor = $reflector->getConstructor();
1150
+		// whu? huh? nothing?
1151
+		if (! $constructor) {
1152
+			return $arguments;
1153
+		}
1154
+		// get constructor parameters
1155
+		$params = $constructor->getParameters();
1156
+		// and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
1157
+		$argument_keys = array_keys($arguments);
1158
+		// now loop thru all of the constructors expected parameters
1159
+		foreach ($params as $index => $param) {
1160
+			// is this a dependency for a specific class ?
1161
+			$param_class = $param->getClass()
1162
+				? $param->getClass()->name
1163
+				: null;
1164
+			// BUT WAIT !!! This class may be an alias for something else (or getting replaced at runtime)
1165
+			$param_class = $this->_dependency_map->has_alias($param_class, $class_name)
1166
+				? $this->_dependency_map->get_alias($param_class, $class_name)
1167
+				: $param_class;
1168
+			if (
1169
+				// param is not even a class
1170
+				empty($param_class)
1171
+				// and something already exists in the incoming arguments for this param
1172
+				&& isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1173
+			) {
1174
+				// so let's skip this argument and move on to the next
1175
+				continue;
1176
+			}
1177
+			if (
1178
+				// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
1179
+				! empty($param_class)
1180
+				&& isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1181
+				&& $arguments[$argument_keys[$index]] instanceof $param_class
1182
+			) {
1183
+				// skip this argument and move on to the next
1184
+				continue;
1185
+			}
1186
+			if (
1187
+				// parameter is type hinted as a class, and should be injected
1188
+				! empty($param_class)
1189
+				&& $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1190
+			) {
1191
+				$arguments = $this->_resolve_dependency($class_name, $param_class, $arguments, $index);
1192
+			} else {
1193
+				try {
1194
+					$arguments[$index] = $param->getDefaultValue();
1195
+				} catch (ReflectionException $e) {
1196
+					throw new ReflectionException(
1197
+						sprintf(
1198
+							esc_html__('%1$s for parameter "$%2$s"', 'event_espresso'),
1199
+							$e->getMessage(),
1200
+							$param->getName()
1201
+						)
1202
+					);
1203
+				}
1204
+			}
1205
+		}
1206
+		return $arguments;
1207
+	}
1208
+
1209
+
1210
+
1211
+	/**
1212
+	 * @param string $class_name
1213
+	 * @param string $param_class
1214
+	 * @param array  $arguments
1215
+	 * @param mixed  $index
1216
+	 * @return array
1217
+	 * @throws EE_Error
1218
+	 * @throws ReflectionException
1219
+	 */
1220
+	protected function _resolve_dependency($class_name, $param_class, $arguments, $index)
1221
+	{
1222
+		$dependency = null;
1223
+		// should dependency be loaded from cache ?
1224
+		$cache_on = $this->_dependency_map->loading_strategy_for_class_dependency($class_name, $param_class)
1225
+					!== EE_Dependency_Map::load_new_object;
1226
+		// we might have a dependency...
1227
+		// let's MAYBE try and find it in our cache if that's what's been requested
1228
+		$cached_class = $cache_on
1229
+			? $this->_get_cached_class($param_class)
1230
+			: null;
1231
+		// and grab it if it exists
1232
+		if ($cached_class instanceof $param_class) {
1233
+			$dependency = $cached_class;
1234
+		} else if ($param_class !== $class_name) {
1235
+			// obtain the loader method from the dependency map
1236
+			$loader = $this->_dependency_map->class_loader($param_class);
1237
+			// is loader a custom closure ?
1238
+			if ($loader instanceof Closure) {
1239
+				$dependency = $loader();
1240
+			} else {
1241
+				// set the cache on property for the recursive loading call
1242
+				$this->_cache_on = $cache_on;
1243
+				// if not, then let's try and load it via the registry
1244
+				if ($loader && method_exists($this, $loader)) {
1245
+					$dependency = $this->{$loader}($param_class);
1246
+				} else {
1247
+					$dependency = $this->create($param_class, array(), $cache_on);
1248
+				}
1249
+			}
1250
+		}
1251
+		// did we successfully find the correct dependency ?
1252
+		if ($dependency instanceof $param_class) {
1253
+			// then let's inject it into the incoming array of arguments at the correct location
1254
+			if (isset($argument_keys[$index])) {
1255
+				$arguments[$argument_keys[$index]] = $dependency;
1256
+			} else {
1257
+				$arguments[$index] = $dependency;
1258
+			}
1259
+		}
1260
+		return $arguments;
1261
+	}
1262
+
1263
+
1264
+
1265
+	/**
1266
+	 * _set_cached_class
1267
+	 * attempts to cache the instantiated class locally
1268
+	 * in one of the following places, in the following order:
1269
+	 *        $this->{class_abbreviation}   ie:    $this->CART
1270
+	 *        $this->{$class_name}          ie:    $this->Some_Class
1271
+	 *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1272
+	 *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1273
+	 *
1274
+	 * @param object $class_obj
1275
+	 * @param string $class_name
1276
+	 * @param string $class_prefix
1277
+	 * @param bool   $from_db
1278
+	 * @return void
1279
+	 */
1280
+	protected function _set_cached_class($class_obj, $class_name, $class_prefix = '', $from_db = false)
1281
+	{
1282
+		if ($class_name === 'EE_Registry' || empty($class_obj)) {
1283
+			return;
1284
+		}
1285
+		// return newly instantiated class
1286
+		if (isset($this->_class_abbreviations[$class_name])) {
1287
+			$class_abbreviation = $this->_class_abbreviations[$class_name];
1288
+			$this->{$class_abbreviation} = $class_obj;
1289
+			return;
1290
+		}
1291
+		$class_name = str_replace('\\', '_', $class_name);
1292
+		if (property_exists($this, $class_name)) {
1293
+			$this->{$class_name} = $class_obj;
1294
+			return;
1295
+		}
1296
+		if ($class_prefix === 'addon') {
1297
+			$this->addons->{$class_name} = $class_obj;
1298
+			return;
1299
+		}
1300
+		if (! $from_db) {
1301
+			$this->LIB->{$class_name} = $class_obj;
1302
+		}
1303
+	}
1304
+
1305
+
1306
+
1307
+	/**
1308
+	 * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1309
+	 *
1310
+	 * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1311
+	 *                          in the EE_Dependency_Map::$_class_loaders array,
1312
+	 *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1313
+	 * @param array  $arguments
1314
+	 * @return object
1315
+	 */
1316
+	public static function factory($classname, $arguments = array())
1317
+	{
1318
+		$loader = self::instance()->_dependency_map->class_loader($classname);
1319
+		if ($loader instanceof Closure) {
1320
+			return $loader($arguments);
1321
+		}
1322
+		if (method_exists(self::instance(), $loader)) {
1323
+			return self::instance()->{$loader}($classname, $arguments);
1324
+		}
1325
+		return null;
1326
+	}
1327
+
1328
+
1329
+
1330
+	/**
1331
+	 * Gets the addon by its name/slug (not classname. For that, just
1332
+	 * use the classname as the property name on EE_Config::instance()->addons)
1333
+	 *
1334
+	 * @param string $name
1335
+	 * @return EE_Addon
1336
+	 */
1337
+	public function get_addon_by_name($name)
1338
+	{
1339
+		foreach ($this->addons as $addon) {
1340
+			if ($addon->name() === $name) {
1341
+				return $addon;
1342
+			}
1343
+		}
1344
+		return null;
1345
+	}
1346
+
1347
+
1348
+
1349
+	/**
1350
+	 * Gets an array of all the registered addons, where the keys are their names. (ie, what each returns for their
1351
+	 * name() function) They're already available on EE_Config::instance()->addons as properties, where each property's
1352
+	 * name is the addon's classname. So if you just want to get the addon by classname, use
1353
+	 * EE_Config::instance()->addons->{classname}
1354
+	 *
1355
+	 * @return EE_Addon[] where the KEYS are the addon's name()
1356
+	 */
1357
+	public function get_addons_by_name()
1358
+	{
1359
+		$addons = array();
1360
+		foreach ($this->addons as $addon) {
1361
+			$addons[$addon->name()] = $addon;
1362
+		}
1363
+		return $addons;
1364
+	}
1365
+
1366
+
1367
+
1368
+	/**
1369
+	 * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1370
+	 * a stale copy of it around
1371
+	 *
1372
+	 * @param string $model_name
1373
+	 * @return \EEM_Base
1374
+	 * @throws \EE_Error
1375
+	 */
1376
+	public function reset_model($model_name)
1377
+	{
1378
+		$model_class_name = strpos($model_name, 'EEM_') !== 0
1379
+			? "EEM_{$model_name}"
1380
+			: $model_name;
1381
+		if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1382
+			return null;
1383
+		}
1384
+		//get that model reset it and make sure we nuke the old reference to it
1385
+		if ($this->LIB->{$model_class_name} instanceof $model_class_name
1386
+			&& is_callable(
1387
+				array($model_class_name, 'reset')
1388
+			)) {
1389
+			$this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1390
+		} else {
1391
+			throw new EE_Error(sprintf(esc_html__('Model %s does not have a method "reset"', 'event_espresso'), $model_name));
1392
+		}
1393
+		return $this->LIB->{$model_class_name};
1394
+	}
1395
+
1396
+
1397
+
1398
+	/**
1399
+	 * Resets the registry.
1400
+	 * The criteria for what gets reset is based on what can be shared between sites on the same request when
1401
+	 * switch_to_blog is used in a multisite install.  Here is a list of things that are NOT reset.
1402
+	 * - $_dependency_map
1403
+	 * - $_class_abbreviations
1404
+	 * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1405
+	 * - $REQ:  Still on the same request so no need to change.
1406
+	 * - $CAP: There is no site specific state in the EE_Capability class.
1407
+	 * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only
1408
+	 * one Session can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1409
+	 * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1410
+	 *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1411
+	 *             switch or on the restore.
1412
+	 * - $modules
1413
+	 * - $shortcodes
1414
+	 * - $widgets
1415
+	 *
1416
+	 * @param boolean $hard             whether to reset data in the database too, or just refresh
1417
+	 *                                  the Registry to its state at the beginning of the request
1418
+	 * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1419
+	 *                                  or just reset without re-instantiating (handy to set to FALSE if you're not
1420
+	 *                                  sure if you CAN currently reinstantiate the singletons at the moment)
1421
+	 * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so
1422
+	 *                                  client
1423
+	 *                                  code instead can just change the model context to a different blog id if
1424
+	 *                                  necessary
1425
+	 * @return EE_Registry
1426
+	 * @throws EE_Error
1427
+	 * @throws ReflectionException
1428
+	 */
1429
+	public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1430
+	{
1431
+		$instance = self::instance();
1432
+		$instance->_cache_on = true;
1433
+		// reset some "special" classes
1434
+		EEH_Activation::reset();
1435
+		$instance->CFG = EE_Config::reset($hard, $reinstantiate);
1436
+		$instance->CART = null;
1437
+		$instance->MRM = null;
1438
+		$instance->AssetsRegistry = $instance->create('EventEspresso\core\services\assets\Registry');
1439
+		//messages reset
1440
+		EED_Messages::reset();
1441
+		//handle of objects cached on LIB
1442
+		foreach (array('LIB', 'modules') as $cache) {
1443
+			foreach ($instance->{$cache} as $class_name => $class) {
1444
+				if (self::_reset_and_unset_object($class, $reset_models)) {
1445
+					unset($instance->{$cache}->{$class_name});
1446
+				}
1447
+			}
1448
+		}
1449
+		return $instance;
1450
+	}
1451
+
1452
+
1453
+
1454
+	/**
1455
+	 * if passed object implements ResettableInterface, then call it's reset() method
1456
+	 * if passed object implements InterminableInterface, then return false,
1457
+	 * to indicate that it should NOT be cleared from the Registry cache
1458
+	 *
1459
+	 * @param      $object
1460
+	 * @param bool $reset_models
1461
+	 * @return bool returns true if cached object should be unset
1462
+	 */
1463
+	private static function _reset_and_unset_object($object, $reset_models)
1464
+	{
1465
+		if (! is_object($object)) {
1466
+			// don't unset anything that's not an object
1467
+			return false;
1468
+		}
1469
+		if ($object instanceof EED_Module) {
1470
+			$object::reset();
1471
+			// don't unset modules
1472
+			return false;
1473
+		}
1474
+		if ($object instanceof ResettableInterface) {
1475
+			if ($object instanceof EEM_Base) {
1476
+				if ($reset_models) {
1477
+					$object->reset();
1478
+					return true;
1479
+				}
1480
+				return false;
1481
+			}
1482
+			$object->reset();
1483
+			return true;
1484
+		}
1485
+		if (! $object instanceof InterminableInterface) {
1486
+			return true;
1487
+		}
1488
+		return false;
1489
+	}
1490
+
1491
+
1492
+
1493
+	/**
1494
+	 * Gets all the custom post type models defined
1495
+	 *
1496
+	 * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1497
+	 */
1498
+	public function cpt_models()
1499
+	{
1500
+		$cpt_models = array();
1501
+		foreach ($this->non_abstract_db_models as $short_name => $classname) {
1502
+			if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1503
+				$cpt_models[$short_name] = $classname;
1504
+			}
1505
+		}
1506
+		return $cpt_models;
1507
+	}
1508
+
1509
+
1510
+
1511
+	/**
1512
+	 * @return \EE_Config
1513
+	 */
1514
+	public static function CFG()
1515
+	{
1516
+		return self::instance()->CFG;
1517
+	}
1518 1518
 
1519 1519
 
1520 1520
 }
Please login to merge, or discard this patch.
Spacing   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -171,7 +171,7 @@  discard block
 block discarded – undo
171 171
     public static function instance(EE_Dependency_Map $dependency_map = null)
172 172
     {
173 173
         // check if class object is instantiated
174
-        if (! self::$_instance instanceof EE_Registry) {
174
+        if ( ! self::$_instance instanceof EE_Registry) {
175 175
             self::$_instance = new self($dependency_map);
176 176
         }
177 177
         return self::$_instance;
@@ -258,13 +258,13 @@  discard block
 block discarded – undo
258 258
      */
259 259
     public static function localize_i18n_js_strings()
260 260
     {
261
-        $i18n_js_strings = (array)self::$i18n_js_strings;
261
+        $i18n_js_strings = (array) self::$i18n_js_strings;
262 262
         foreach ($i18n_js_strings as $key => $value) {
263 263
             if (is_scalar($value)) {
264
-                $i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
264
+                $i18n_js_strings[$key] = html_entity_decode((string) $value, ENT_QUOTES, 'UTF-8');
265 265
             }
266 266
         }
267
-        return '/* <![CDATA[ */ var eei18n = ' . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
267
+        return '/* <![CDATA[ */ var eei18n = '.wp_json_encode($i18n_js_strings).'; /* ]]> */';
268 268
     }
269 269
 
270 270
 
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
             $module_class = get_class($module);
281 281
             $this->modules->{$module_class} = $module;
282 282
         } else {
283
-            if (! class_exists('EE_Module_Request_Router')) {
283
+            if ( ! class_exists('EE_Module_Request_Router')) {
284 284
                 $this->load_core('Module_Request_Router');
285 285
             }
286 286
             EE_Module_Request_Router::module_factory($module);
@@ -320,10 +320,10 @@  discard block
 block discarded – undo
320 320
                 EE_CORE,
321 321
                 EE_ADMIN,
322 322
                 EE_CPTS,
323
-                EE_CORE . 'data_migration_scripts' . DS,
324
-                EE_CORE . 'capabilities' . DS,
325
-                EE_CORE . 'request_stack' . DS,
326
-                EE_CORE . 'middleware' . DS,
323
+                EE_CORE.'data_migration_scripts'.DS,
324
+                EE_CORE.'capabilities'.DS,
325
+                EE_CORE.'request_stack'.DS,
326
+                EE_CORE.'middleware'.DS,
327 327
             )
328 328
         );
329 329
         // retrieve instantiated class
@@ -356,7 +356,7 @@  discard block
 block discarded – undo
356 356
         $service_paths = apply_filters(
357 357
             'FHEE__EE_Registry__load_service__service_paths',
358 358
             array(
359
-                EE_CORE . 'services' . DS,
359
+                EE_CORE.'services'.DS,
360 360
             )
361 361
         );
362 362
         // retrieve instantiated class
@@ -482,10 +482,10 @@  discard block
 block discarded – undo
482 482
     {
483 483
         $paths = array(
484 484
             EE_LIBRARIES,
485
-            EE_LIBRARIES . 'messages' . DS,
486
-            EE_LIBRARIES . 'shortcodes' . DS,
487
-            EE_LIBRARIES . 'qtips' . DS,
488
-            EE_LIBRARIES . 'payment_methods' . DS,
485
+            EE_LIBRARIES.'messages'.DS,
486
+            EE_LIBRARIES.'shortcodes'.DS,
487
+            EE_LIBRARIES.'qtips'.DS,
488
+            EE_LIBRARIES.'payment_methods'.DS,
489 489
         );
490 490
         // retrieve instantiated class
491 491
         return $this->_load(
@@ -548,10 +548,10 @@  discard block
 block discarded – undo
548 548
     public function load_model_class($class_name, $arguments = array(), $load_only = true)
549 549
     {
550 550
         $paths = array(
551
-            EE_MODELS . 'fields' . DS,
552
-            EE_MODELS . 'helpers' . DS,
553
-            EE_MODELS . 'relations' . DS,
554
-            EE_MODELS . 'strategies' . DS,
551
+            EE_MODELS.'fields'.DS,
552
+            EE_MODELS.'helpers'.DS,
553
+            EE_MODELS.'relations'.DS,
554
+            EE_MODELS.'strategies'.DS,
555 555
         );
556 556
         // retrieve instantiated class
557 557
         return $this->_load(
@@ -670,7 +670,7 @@  discard block
 block discarded – undo
670 670
         $class_exists = $this->loadOrVerifyClassExists($class_name, $arguments);
671 671
         // if a non-FQCN was passed, then verifyClassExists() might return an object
672 672
         // or it could return null if the class just could not be found anywhere
673
-        if ($class_exists instanceof $class_name || $class_exists === null){
673
+        if ($class_exists instanceof $class_name || $class_exists === null) {
674 674
             // either way, return the results
675 675
             return $class_exists;
676 676
         }
@@ -695,7 +695,7 @@  discard block
 block discarded – undo
695 695
         // instantiate the requested object
696 696
         $class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
697 697
         // if caching is turned on OR this class is cached in a class property
698
-        if (($this->_cache_on && $cache) || isset($this->_class_abbreviations[ $class_name ])) {
698
+        if (($this->_cache_on && $cache) || isset($this->_class_abbreviations[$class_name])) {
699 699
             // save it for later... kinda like gum  { : $
700 700
             $this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
701 701
         }
@@ -721,7 +721,7 @@  discard block
 block discarded – undo
721 721
             case 1:
722 722
                 // if it's a FQCN then maybe the class is registered with a preceding \
723 723
                 $class_name = strpos($class_name, '\\') !== false
724
-                    ? '\\' . ltrim($class_name, '\\')
724
+                    ? '\\'.ltrim($class_name, '\\')
725 725
                     : $class_name;
726 726
                 break;
727 727
             case 2:
@@ -773,11 +773,11 @@  discard block
 block discarded – undo
773 773
         // strip php file extension
774 774
         $class_name = str_replace('.php', '', trim($class_name));
775 775
         // does the class have a prefix ?
776
-        if (! empty($class_prefix) && $class_prefix !== 'addon') {
776
+        if ( ! empty($class_prefix) && $class_prefix !== 'addon') {
777 777
             // make sure $class_prefix is uppercase
778 778
             $class_prefix = strtoupper(trim($class_prefix));
779 779
             // add class prefix ONCE!!!
780
-            $class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
780
+            $class_name = $class_prefix.str_replace($class_prefix, '', $class_name);
781 781
         }
782 782
         $class_name = $this->_dependency_map->get_alias($class_name);
783 783
         $class_exists = class_exists($class_name);
@@ -796,13 +796,13 @@  discard block
 block discarded – undo
796 796
             }
797 797
         }
798 798
         // if the class doesn't already exist.. then we need to try and find the file and load it
799
-        if (! $class_exists) {
799
+        if ( ! $class_exists) {
800 800
             // get full path to file
801 801
             $path = $this->_resolve_path($class_name, $type, $file_paths);
802 802
             // load the file
803 803
             $loaded = $this->_require_file($path, $class_name, $type, $file_paths);
804 804
             // if loading failed, or we are only loading a file but NOT instantiating an object
805
-            if (! $loaded || $load_only) {
805
+            if ( ! $loaded || $load_only) {
806 806
                 // return boolean if only loading, or null if an object was expected
807 807
                 return $load_only
808 808
                     ? $loaded
@@ -921,10 +921,10 @@  discard block
 block discarded – undo
921 921
                 : EE_CLASSES;
922 922
             // prep file type
923 923
             $type = ! empty($type)
924
-                ? trim($type, '.') . '.'
924
+                ? trim($type, '.').'.'
925 925
                 : '';
926 926
             // build full file path
927
-            $file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
927
+            $file_paths[$key] = rtrim($file_path, DS).DS.$class_name.'.'.$type.'php';
928 928
             //does the file exist and can be read ?
929 929
             if (is_readable($file_paths[$key])) {
930 930
                 return $file_paths[$key];
@@ -952,9 +952,9 @@  discard block
 block discarded – undo
952 952
         // don't give up! you gotta...
953 953
         try {
954 954
             //does the file exist and can it be read ?
955
-            if (! $path) {
955
+            if ( ! $path) {
956 956
                 // so sorry, can't find the file
957
-                throw new EE_Error (
957
+                throw new EE_Error(
958 958
                     sprintf(
959 959
                         esc_html__(
960 960
                             'The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s',
@@ -962,7 +962,7 @@  discard block
 block discarded – undo
962 962
                         ),
963 963
                         trim($type, '.'),
964 964
                         $class_name,
965
-                        '<br />' . implode(',<br />', $file_paths)
965
+                        '<br />'.implode(',<br />', $file_paths)
966 966
                     )
967 967
                 );
968 968
             }
@@ -1066,7 +1066,7 @@  discard block
 block discarded – undo
1066 1066
                 );
1067 1067
             }
1068 1068
         } catch (Exception $e) {
1069
-            if (! $e instanceof EE_Error) {
1069
+            if ( ! $e instanceof EE_Error) {
1070 1070
                 $e = new EE_Error(
1071 1071
                     sprintf(
1072 1072
                         esc_html__(
@@ -1148,7 +1148,7 @@  discard block
 block discarded – undo
1148 1148
         // let's examine the constructor
1149 1149
         $constructor = $reflector->getConstructor();
1150 1150
         // whu? huh? nothing?
1151
-        if (! $constructor) {
1151
+        if ( ! $constructor) {
1152 1152
             return $arguments;
1153 1153
         }
1154 1154
         // get constructor parameters
@@ -1297,7 +1297,7 @@  discard block
 block discarded – undo
1297 1297
             $this->addons->{$class_name} = $class_obj;
1298 1298
             return;
1299 1299
         }
1300
-        if (! $from_db) {
1300
+        if ( ! $from_db) {
1301 1301
             $this->LIB->{$class_name} = $class_obj;
1302 1302
         }
1303 1303
     }
@@ -1378,7 +1378,7 @@  discard block
 block discarded – undo
1378 1378
         $model_class_name = strpos($model_name, 'EEM_') !== 0
1379 1379
             ? "EEM_{$model_name}"
1380 1380
             : $model_name;
1381
-        if (! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1381
+        if ( ! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1382 1382
             return null;
1383 1383
         }
1384 1384
         //get that model reset it and make sure we nuke the old reference to it
@@ -1462,7 +1462,7 @@  discard block
 block discarded – undo
1462 1462
      */
1463 1463
     private static function _reset_and_unset_object($object, $reset_models)
1464 1464
     {
1465
-        if (! is_object($object)) {
1465
+        if ( ! is_object($object)) {
1466 1466
             // don't unset anything that's not an object
1467 1467
             return false;
1468 1468
         }
@@ -1482,7 +1482,7 @@  discard block
 block discarded – undo
1482 1482
             $object->reset();
1483 1483
             return true;
1484 1484
         }
1485
-        if (! $object instanceof InterminableInterface) {
1485
+        if ( ! $object instanceof InterminableInterface) {
1486 1486
             return true;
1487 1487
         }
1488 1488
         return false;
Please login to merge, or discard this patch.
admin_pages/maintenance/Maintenance_Admin_Page.core.php 2 patches
Spacing   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -261,13 +261,13 @@  discard block
 block discarded – undo
261 261
                 && $most_recent_migration->is_broken()
262 262
             )
263 263
         ) {
264
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_was_borked_page.template.php';
264
+            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_migration_was_borked_page.template.php';
265 265
             $this->_template_args['support_url'] = 'http://eventespresso.com/support/forums/';
266 266
             $this->_template_args['next_url'] = EEH_URL::add_query_args_and_nonce(array('action'  => 'confirm_migration_crash_report_sent',
267 267
                                                                                         'success' => '0',
268 268
             ), EE_MAINTENANCE_ADMIN_URL);
269 269
         } elseif ($addons_should_be_upgraded_first) {
270
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_upgrade_addons_before_migrating.template.php';
270
+            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_upgrade_addons_before_migrating.template.php';
271 271
         } else {
272 272
             if ($most_recent_migration
273 273
                 && $most_recent_migration instanceof EE_Data_Migration_Script_Base
@@ -297,7 +297,7 @@  discard block
 block discarded – undo
297 297
                 $this->_template_args['current_db_state'] = null;
298 298
                 $this->_template_args['next_db_state'] = null;
299 299
             }
300
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_page.template.php';
300
+            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_migration_page.template.php';
301 301
             $this->_template_args = array_merge(
302 302
                 $this->_template_args,
303 303
                 array(
@@ -336,13 +336,13 @@  discard block
 block discarded – undo
336 336
                 'status_completed'                 => EE_Data_Migration_Manager::status_completed,
337 337
             ));
338 338
         }
339
-        $this->_template_args['most_recent_migration'] = $most_recent_migration;//the actual most recently ran migration
339
+        $this->_template_args['most_recent_migration'] = $most_recent_migration; //the actual most recently ran migration
340 340
         //now render the migration options part, and put it in a variable
341 341
         $migration_options_template_file = apply_filters(
342 342
             'FHEE__ee_migration_page__migration_options_template',
343
-            EE_MAINTENANCE_TEMPLATE_PATH . 'migration_options_from_ee4.template.php'
343
+            EE_MAINTENANCE_TEMPLATE_PATH.'migration_options_from_ee4.template.php'
344 344
         );
345
-        $migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args,true);
345
+        $migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args, true);
346 346
         $this->_template_args['migration_options_html'] = $migration_options_html;
347 347
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
348 348
             $this->_template_args, true);
@@ -401,7 +401,7 @@  discard block
 block discarded – undo
401 401
      */
402 402
     public function _data_reset_and_delete()
403 403
     {
404
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_data_reset_and_delete.template.php';
404
+        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_data_reset_and_delete.template.php';
405 405
         $this->_template_args['reset_reservations_button'] = $this->get_action_link_or_button(
406 406
             'reset_reservations',
407 407
             'reset_reservations',
@@ -438,7 +438,7 @@  discard block
 block discarded – undo
438 438
 
439 439
     protected function _reset_reservations()
440 440
     {
441
-        if(\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
441
+        if (\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
442 442
             EE_Error::add_success(
443 443
                 __(
444 444
                     'Ticket and datetime reserved counts have been successfully reset.',
@@ -486,7 +486,7 @@  discard block
 block discarded – undo
486 486
      */
487 487
     public function _system_status()
488 488
     {
489
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_system_stati_page.template.php';
489
+        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_system_stati_page.template.php';
490 490
         $this->_template_args['system_stati'] = EEM_System_Status::instance()->get_system_stati();
491 491
         $this->_template_args['download_system_status_url'] = EE_Admin_Page::add_query_args_and_nonce(
492 492
             array(
@@ -505,11 +505,11 @@  discard block
 block discarded – undo
505 505
     public function _download_system_status()
506 506
     {
507 507
         $status_info = EEM_System_Status::instance()->get_system_stati();
508
-        header( 'Content-Disposition: attachment' );
509
-        header( "Content-Disposition: attachment; filename=system_status_" . sanitize_key( site_url() ) . ".html" );
508
+        header('Content-Disposition: attachment');
509
+        header("Content-Disposition: attachment; filename=system_status_".sanitize_key(site_url()).".html");
510 510
         echo "<style>table{border:1px solid darkgrey;}td{vertical-align:top}</style>";
511
-        echo "<h1>System Information for " . site_url() . "</h1>";
512
-        echo EEH_Template::layout_array_as_table( $status_info );
511
+        echo "<h1>System Information for ".site_url()."</h1>";
512
+        echo EEH_Template::layout_array_as_table($status_info);
513 513
         die;
514 514
     }
515 515
 
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
         try {
524 524
             $success = wp_mail(EE_SUPPORT_EMAIL,
525 525
                 'Migration Crash Report',
526
-                $body . "/r/n<br>" . print_r(EEM_System_Status::instance()->get_system_stati(), true),
526
+                $body."/r/n<br>".print_r(EEM_System_Status::instance()->get_system_stati(), true),
527 527
                 array(
528 528
                     "from:$from_name<$from>",
529 529
                     //					'content-type:text/html charset=UTF-8'
@@ -558,7 +558,7 @@  discard block
 block discarded – undo
558 558
             EE_MAINTENANCE_ADMIN_URL);
559 559
         $this->_template_args['reattempt_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reattempt_migration'),
560 560
             EE_MAINTENANCE_ADMIN_URL);
561
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_confirm_migration_crash_report_sent.template.php';
561
+        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_confirm_migration_crash_report_sent.template.php';
562 562
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
563 563
             $this->_template_args, true);
564 564
         $this->display_admin_page_with_sidebar();
@@ -659,9 +659,9 @@  discard block
 block discarded – undo
659 659
         wp_enqueue_script('ee_admin_js');
660 660
 //		wp_enqueue_media();
661 661
 //		wp_enqueue_script('media-upload');
662
-        wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL . '/ee-maintenance.js', array('jquery'),
662
+        wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL.'/ee-maintenance.js', array('jquery'),
663 663
             EVENT_ESPRESSO_VERSION, true);
664
-        wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL . 'ee-maintenance.css', array(),
664
+        wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL.'ee-maintenance.css', array(),
665 665
             EVENT_ESPRESSO_VERSION);
666 666
         wp_enqueue_style('espresso_maintenance');
667 667
     }
@@ -698,8 +698,8 @@  discard block
 block discarded – undo
698 698
 
699 699
     protected function _get_datetime_offset_fix_form()
700 700
     {
701
-        if (! $this->datetime_fix_offset_form instanceof EE_Form_Section_Proper) {
702
-            $this->datetime_fix_offset_form =  new EE_Form_Section_Proper(
701
+        if ( ! $this->datetime_fix_offset_form instanceof EE_Form_Section_Proper) {
702
+            $this->datetime_fix_offset_form = new EE_Form_Section_Proper(
703 703
                 array(
704 704
                     'name' => 'datetime_offset_fix_option',
705 705
                     'layout_strategy' => new EE_Admin_Two_Column_Layout(),
Please login to merge, or discard this patch.
Indentation   +744 added lines, -744 removed lines patch added patch discarded remove patch
@@ -28,761 +28,761 @@
 block discarded – undo
28 28
 {
29 29
 
30 30
 
31
-    /**
32
-     * @var EE_Datetime_Offset_Fix_Form
33
-     */
34
-    protected $datetime_fix_offset_form;
35
-
36
-
37
-
38
-    protected function _init_page_props()
39
-    {
40
-        $this->page_slug = EE_MAINTENANCE_PG_SLUG;
41
-        $this->page_label = EE_MAINTENANCE_LABEL;
42
-        $this->_admin_base_url = EE_MAINTENANCE_ADMIN_URL;
43
-        $this->_admin_base_path = EE_MAINTENANCE_ADMIN;
44
-    }
45
-
46
-
47
-
48
-    protected function _ajax_hooks()
49
-    {
50
-        add_action('wp_ajax_migration_step', array($this, 'migration_step'));
51
-        add_action('wp_ajax_add_error_to_migrations_ran', array($this, 'add_error_to_migrations_ran'));
52
-    }
53
-
54
-
55
-
56
-    protected function _define_page_props()
57
-    {
58
-        $this->_admin_page_title = EE_MAINTENANCE_LABEL;
59
-        $this->_labels = array(
60
-            'buttons' => array(
61
-                'reset_reservations' => esc_html__('Reset Ticket and Datetime Reserved Counts', 'event_espresso'),
62
-                'reset_capabilities' => esc_html__('Reset Event Espresso Capabilities', 'event_espresso'),
63
-            ),
64
-        );
65
-    }
66
-
67
-
68
-
69
-    protected function _set_page_routes()
70
-    {
71
-        $this->_page_routes = array(
72
-            'default'                             => array(
73
-                'func'       => '_maintenance',
74
-                'capability' => 'manage_options',
75
-            ),
76
-            'change_maintenance_level'            => array(
77
-                'func'       => '_change_maintenance_level',
78
-                'capability' => 'manage_options',
79
-                'noheader'   => true,
80
-            ),
81
-            'system_status'                       => array(
82
-                'func'       => '_system_status',
83
-                'capability' => 'manage_options',
84
-            ),
85
-            'download_system_status' => array(
86
-                'func'       => '_download_system_status',
87
-                'capability' => 'manage_options',
88
-                'noheader'   => true,
89
-            ),
90
-            'send_migration_crash_report'         => array(
91
-                'func'       => '_send_migration_crash_report',
92
-                'capability' => 'manage_options',
93
-                'noheader'   => true,
94
-            ),
95
-            'confirm_migration_crash_report_sent' => array(
96
-                'func'       => '_confirm_migration_crash_report_sent',
97
-                'capability' => 'manage_options',
98
-            ),
99
-            'data_reset'                          => array(
100
-                'func'       => '_data_reset_and_delete',
101
-                'capability' => 'manage_options',
102
-            ),
103
-            'reset_db'                            => array(
104
-                'func'       => '_reset_db',
105
-                'capability' => 'manage_options',
106
-                'noheader'   => true,
107
-                'args'       => array('nuke_old_ee4_data' => true),
108
-            ),
109
-            'start_with_fresh_ee4_db'             => array(
110
-                'func'       => '_reset_db',
111
-                'capability' => 'manage_options',
112
-                'noheader'   => true,
113
-                'args'       => array('nuke_old_ee4_data' => false),
114
-            ),
115
-            'delete_db'                           => array(
116
-                'func'       => '_delete_db',
117
-                'capability' => 'manage_options',
118
-                'noheader'   => true,
119
-            ),
120
-            'rerun_migration_from_ee3'            => array(
121
-                'func'       => '_rerun_migration_from_ee3',
122
-                'capability' => 'manage_options',
123
-                'noheader'   => true,
124
-            ),
125
-            'reset_reservations'                  => array(
126
-                'func'       => '_reset_reservations',
127
-                'capability' => 'manage_options',
128
-                'noheader'   => true,
129
-            ),
130
-            'reset_capabilities'                  => array(
131
-                'func'       => '_reset_capabilities',
132
-                'capability' => 'manage_options',
133
-                'noheader'   => true,
134
-            ),
135
-            'reattempt_migration'                 => array(
136
-                'func'       => '_reattempt_migration',
137
-                'capability' => 'manage_options',
138
-                'noheader'   => true,
139
-            ),
140
-            'datetime_tools' => array(
141
-                'func' => '_datetime_tools',
142
-                'capability' => 'manage_options'
143
-            ),
144
-            'run_datetime_offset_fix' => array(
145
-                'func' => '_apply_datetime_offset',
146
-                'noheader' => true,
147
-                'headers_sent_route' => 'datetime_tools',
148
-                'capability' => 'manage_options'
149
-            )
150
-        );
151
-    }
152
-
153
-
154
-
155
-    protected function _set_page_config()
156
-    {
157
-        $this->_page_config = array(
158
-            'default'       => array(
159
-                'nav'           => array(
160
-                    'label' => esc_html__('Maintenance', 'event_espresso'),
161
-                    'order' => 10,
162
-                ),
163
-                'require_nonce' => false,
164
-            ),
165
-            'data_reset'    => array(
166
-                'nav'           => array(
167
-                    'label' => esc_html__('Reset/Delete Data', 'event_espresso'),
168
-                    'order' => 20,
169
-                ),
170
-                'require_nonce' => false,
171
-            ),
172
-            'datetime_tools' => array(
173
-                'nav' => array(
174
-                    'label' => esc_html__('Datetime Utilities', 'event_espresso'),
175
-                    'order' => 25
176
-                ),
177
-                'require_nonce' => false,
178
-            ),
179
-            'system_status' => array(
180
-                'nav'           => array(
181
-                    'label' => esc_html__("System Information", "event_espresso"),
182
-                    'order' => 30,
183
-                ),
184
-                'require_nonce' => false,
185
-            ),
186
-        );
187
-    }
188
-
189
-
190
-
191
-    /**
192
-     * default maintenance page. If we're in maintenance mode level 2, then we need to show
193
-     * the migration scripts and all that UI.
194
-     */
195
-    public function _maintenance()
196
-    {
197
-        //it all depends if we're in maintenance model level 1 (frontend-only) or
198
-        //level 2 (everything except maintenance page)
199
-        try {
200
-            //get the current maintenance level and check if
201
-            //we are removed
202
-            $mm = EE_Maintenance_Mode::instance()->level();
203
-            $placed_in_mm = EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
204
-            if ($mm == EE_Maintenance_Mode::level_2_complete_maintenance && ! $placed_in_mm) {
205
-                //we just took the site out of maintenance mode, so notify the user.
206
-                //unfortunately this message appears to be echoed on the NEXT page load...
207
-                //oh well, we should really be checking for this on addon deactivation anyways
208
-                EE_Error::add_attention(__('Site taken out of maintenance mode because no data migration scripts are required',
209
-                    'event_espresso'));
210
-                $this->_process_notices(array('page' => 'espresso_maintenance_settings'), false);
211
-            }
212
-            //in case an exception is thrown while trying to handle migrations
213
-            switch (EE_Maintenance_Mode::instance()->level()) {
214
-                case EE_Maintenance_Mode::level_0_not_in_maintenance:
215
-                case EE_Maintenance_Mode::level_1_frontend_only_maintenance:
216
-                    $show_maintenance_switch = true;
217
-                    $show_backup_db_text = false;
218
-                    $show_migration_progress = false;
219
-                    $script_names = array();
220
-                    $addons_should_be_upgraded_first = false;
221
-                    break;
222
-                case EE_Maintenance_Mode::level_2_complete_maintenance:
223
-                    $show_maintenance_switch = false;
224
-                    $show_migration_progress = true;
225
-                    if (isset($this->_req_data['continue_migration'])) {
226
-                        $show_backup_db_text = false;
227
-                    } else {
228
-                        $show_backup_db_text = true;
229
-                    }
230
-                    $scripts_needing_to_run = EE_Data_Migration_Manager::instance()
231
-                                                                       ->check_for_applicable_data_migration_scripts();
232
-                    $addons_should_be_upgraded_first = EE_Data_Migration_Manager::instance()->addons_need_updating();
233
-                    $script_names = array();
234
-                    $current_script = null;
235
-                    foreach ($scripts_needing_to_run as $script) {
236
-                        if ($script instanceof EE_Data_Migration_Script_Base) {
237
-                            if ( ! $current_script) {
238
-                                $current_script = $script;
239
-                                $current_script->migration_page_hooks();
240
-                            }
241
-                            $script_names[] = $script->pretty_name();
242
-                        }
243
-                    }
244
-                    break;
245
-            }
246
-            $most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
247
-            $exception_thrown = false;
248
-        } catch (EE_Error $e) {
249
-            EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
250
-            //now, just so we can display the page correctly, make a error migration script stage object
251
-            //and also put the error on it. It only persists for the duration of this request
252
-            $most_recent_migration = new EE_DMS_Unknown_1_0_0();
253
-            $most_recent_migration->add_error($e->getMessage());
254
-            $exception_thrown = true;
255
-        }
256
-        $current_db_state = EE_Data_Migration_Manager::instance()->ensure_current_database_state_is_set();
257
-        $current_db_state = str_replace('.decaf', '', $current_db_state);
258
-        if ($exception_thrown
259
-            || ($most_recent_migration
260
-                && $most_recent_migration instanceof EE_Data_Migration_Script_Base
261
-                && $most_recent_migration->is_broken()
262
-            )
263
-        ) {
264
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_was_borked_page.template.php';
265
-            $this->_template_args['support_url'] = 'http://eventespresso.com/support/forums/';
266
-            $this->_template_args['next_url'] = EEH_URL::add_query_args_and_nonce(array('action'  => 'confirm_migration_crash_report_sent',
267
-                                                                                        'success' => '0',
268
-            ), EE_MAINTENANCE_ADMIN_URL);
269
-        } elseif ($addons_should_be_upgraded_first) {
270
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_upgrade_addons_before_migrating.template.php';
271
-        } else {
272
-            if ($most_recent_migration
273
-                && $most_recent_migration instanceof EE_Data_Migration_Script_Base
274
-                && $most_recent_migration->can_continue()
275
-            ) {
276
-                $show_backup_db_text = false;
277
-                $show_continue_current_migration_script = true;
278
-                $show_most_recent_migration = true;
279
-            } elseif (isset($this->_req_data['continue_migration'])) {
280
-                $show_most_recent_migration = true;
281
-                $show_continue_current_migration_script = false;
282
-            } else {
283
-                $show_most_recent_migration = false;
284
-                $show_continue_current_migration_script = false;
285
-            }
286
-            if (isset($current_script)) {
287
-                $migrates_to = $current_script->migrates_to_version();
288
-                $plugin_slug = $migrates_to['slug'];
289
-                $new_version = $migrates_to['version'];
290
-                $this->_template_args = array_merge($this->_template_args, array(
291
-                    'current_db_state' => sprintf(__("EE%s (%s)", "event_espresso"),
292
-                        isset($current_db_state[$plugin_slug]) ? $current_db_state[$plugin_slug] : 3, $plugin_slug),
293
-                    'next_db_state'    => isset($current_script) ? sprintf(__("EE%s (%s)", 'event_espresso'),
294
-                        $new_version, $plugin_slug) : null,
295
-                ));
296
-            } else {
297
-                $this->_template_args['current_db_state'] = null;
298
-                $this->_template_args['next_db_state'] = null;
299
-            }
300
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_page.template.php';
301
-            $this->_template_args = array_merge(
302
-                $this->_template_args,
303
-                array(
304
-                    'show_most_recent_migration'             => $show_most_recent_migration,
305
-                    //flag for showing the most recent migration's status and/or errors
306
-                    'show_migration_progress'                => $show_migration_progress,
307
-                    //flag for showing the option to run migrations and see their progress
308
-                    'show_backup_db_text'                    => $show_backup_db_text,
309
-                    //flag for showing text telling the user to backup their DB
310
-                    'show_maintenance_switch'                => $show_maintenance_switch,
311
-                    //flag for showing the option to change maintenance mode between levels 0 and 1
312
-                    'script_names'                           => $script_names,
313
-                    //array of names of scripts that have run
314
-                    'show_continue_current_migration_script' => $show_continue_current_migration_script,
315
-                    //flag to change wording to indicating that we're only CONTINUING a migration script (somehow it got interrupted0
316
-                    'reset_db_page_link'                     => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
317
-                        EE_MAINTENANCE_ADMIN_URL),
318
-                    'data_reset_page'                        => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
319
-                        EE_MAINTENANCE_ADMIN_URL),
320
-                    'update_migration_script_page_link'      => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'change_maintenance_level'),
321
-                        EE_MAINTENANCE_ADMIN_URL),
322
-                    'ultimate_db_state'                      => sprintf(__("EE%s", 'event_espresso'),
323
-                        espresso_version()),
324
-                )
325
-            );
326
-            //make sure we have the form fields helper available. It usually is, but sometimes it isn't
327
-            //localize script stuff
328
-            wp_localize_script('ee-maintenance', 'ee_maintenance', array(
329
-                'migrating'                        => esc_html__("Updating Database...", "event_espresso"),
330
-                'next'                             => esc_html__("Next", "event_espresso"),
331
-                'fatal_error'                      => esc_html__("A Fatal Error Has Occurred", "event_espresso"),
332
-                'click_next_when_ready'            => esc_html__("The current Database Update has ended. Click 'next' when ready to proceed",
333
-                    "event_espresso"),
334
-                'status_no_more_migration_scripts' => EE_Data_Migration_Manager::status_no_more_migration_scripts,
335
-                'status_fatal_error'               => EE_Data_Migration_Manager::status_fatal_error,
336
-                'status_completed'                 => EE_Data_Migration_Manager::status_completed,
337
-            ));
338
-        }
339
-        $this->_template_args['most_recent_migration'] = $most_recent_migration;//the actual most recently ran migration
340
-        //now render the migration options part, and put it in a variable
341
-        $migration_options_template_file = apply_filters(
342
-            'FHEE__ee_migration_page__migration_options_template',
343
-            EE_MAINTENANCE_TEMPLATE_PATH . 'migration_options_from_ee4.template.php'
344
-        );
345
-        $migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args,true);
346
-        $this->_template_args['migration_options_html'] = $migration_options_html;
347
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
348
-            $this->_template_args, true);
349
-        $this->display_admin_page_with_sidebar();
350
-    }
351
-
352
-
353
-
354
-    /**
355
-     * returns JSON and executes another step of the currently-executing data migration (called via ajax)
356
-     */
357
-    public function migration_step()
358
-    {
359
-        $this->_template_args['data'] = EE_Data_Migration_Manager::instance()->response_to_migration_ajax_request();
360
-        $this->_return_json();
361
-    }
362
-
363
-
364
-
365
-    /**
366
-     * Can be used by js when it notices a response with HTML in it in order
367
-     * to log the malformed response
368
-     */
369
-    public function add_error_to_migrations_ran()
370
-    {
371
-        EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($this->_req_data['message']);
372
-        $this->_template_args['data'] = array('ok' => true);
373
-        $this->_return_json();
374
-    }
375
-
376
-
377
-
378
-    /**
379
-     * changes the maintenance level, provided there are still no migration scripts that should run
380
-     */
381
-    public function _change_maintenance_level()
382
-    {
383
-        $new_level = absint($this->_req_data['maintenance_mode_level']);
384
-        if ( ! EE_Data_Migration_Manager::instance()->check_for_applicable_data_migration_scripts()) {
385
-            EE_Maintenance_Mode::instance()->set_maintenance_level($new_level);
386
-            $success = true;
387
-        } else {
388
-            EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
389
-            $success = false;
390
-        }
391
-        $this->_redirect_after_action($success, 'Maintenance Mode', esc_html__("Updated", "event_espresso"));
392
-    }
393
-
394
-
395
-
396
-    /**
397
-     * a tab with options for resetting and/or deleting EE data
398
-     *
399
-     * @throws \EE_Error
400
-     * @throws \DomainException
401
-     */
402
-    public function _data_reset_and_delete()
403
-    {
404
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_data_reset_and_delete.template.php';
405
-        $this->_template_args['reset_reservations_button'] = $this->get_action_link_or_button(
406
-            'reset_reservations',
407
-            'reset_reservations',
408
-            array(),
409
-            'button button-primary',
410
-            '',
411
-            false
412
-        );
413
-        $this->_template_args['reset_capabilities_button'] = $this->get_action_link_or_button(
414
-            'reset_capabilities',
415
-            'reset_capabilities',
416
-            array(),
417
-            'button button-primary',
418
-            '',
419
-            false
420
-        );
421
-        $this->_template_args['delete_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
422
-            array('action' => 'delete_db'),
423
-            EE_MAINTENANCE_ADMIN_URL
424
-        );
425
-        $this->_template_args['reset_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
426
-            array('action' => 'reset_db'),
427
-            EE_MAINTENANCE_ADMIN_URL
428
-        );
429
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
430
-            $this->_template_path,
431
-            $this->_template_args,
432
-            true
433
-        );
434
-        $this->display_admin_page_with_sidebar();
435
-    }
436
-
437
-
438
-
439
-    protected function _reset_reservations()
440
-    {
441
-        if(\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
442
-            EE_Error::add_success(
443
-                __(
444
-                    'Ticket and datetime reserved counts have been successfully reset.',
445
-                    'event_espresso'
446
-                )
447
-            );
448
-        } else {
449
-            EE_Error::add_success(
450
-                __(
451
-                    'Ticket and datetime reserved counts were correct and did not need resetting.',
452
-                    'event_espresso'
453
-                )
454
-            );
455
-        }
456
-        $this->_redirect_after_action(true, '', '', array('action' => 'data_reset'), true);
457
-    }
458
-
459
-
460
-
461
-    protected function _reset_capabilities()
462
-    {
463
-        EE_Registry::instance()->CAP->init_caps(true);
464
-        EE_Error::add_success(__('Default Event Espresso capabilities have been restored for all current roles.',
465
-            'event_espresso'));
466
-        $this->_redirect_after_action(false, '', '', array('action' => 'data_reset'), true);
467
-    }
468
-
469
-
470
-
471
-    /**
472
-     * resets the DMSs so we can attempt to continue migrating after a fatal error
473
-     * (only a good idea when someone has somehow tried ot fix whatever caused
474
-     * the fatal error in teh first place)
475
-     */
476
-    protected function _reattempt_migration()
477
-    {
478
-        EE_Data_Migration_Manager::instance()->reattempt();
479
-        $this->_redirect_after_action(false, '', '', array('action' => 'default'), true);
480
-    }
481
-
482
-
483
-
484
-    /**
485
-     * shows the big ol' System Information page
486
-     */
487
-    public function _system_status()
488
-    {
489
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_system_stati_page.template.php';
490
-        $this->_template_args['system_stati'] = EEM_System_Status::instance()->get_system_stati();
491
-        $this->_template_args['download_system_status_url'] = EE_Admin_Page::add_query_args_and_nonce(
492
-            array(
493
-                'action' => 'download_system_status',
494
-            ),
495
-            EE_MAINTENANCE_ADMIN_URL
496
-        );
497
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
498
-            $this->_template_args, true);
499
-        $this->display_admin_page_with_sidebar();
500
-    }
501
-
502
-    /**
503
-     * Downloads an HTML file of the system status that can be easily stored or emailed
504
-     */
505
-    public function _download_system_status()
506
-    {
507
-        $status_info = EEM_System_Status::instance()->get_system_stati();
508
-        header( 'Content-Disposition: attachment' );
509
-        header( "Content-Disposition: attachment; filename=system_status_" . sanitize_key( site_url() ) . ".html" );
510
-        echo "<style>table{border:1px solid darkgrey;}td{vertical-align:top}</style>";
511
-        echo "<h1>System Information for " . site_url() . "</h1>";
512
-        echo EEH_Template::layout_array_as_table( $status_info );
513
-        die;
514
-    }
515
-
516
-
517
-
518
-    public function _send_migration_crash_report()
519
-    {
520
-        $from = $this->_req_data['from'];
521
-        $from_name = $this->_req_data['from_name'];
522
-        $body = $this->_req_data['body'];
523
-        try {
524
-            $success = wp_mail(EE_SUPPORT_EMAIL,
525
-                'Migration Crash Report',
526
-                $body . "/r/n<br>" . print_r(EEM_System_Status::instance()->get_system_stati(), true),
527
-                array(
528
-                    "from:$from_name<$from>",
529
-                    //					'content-type:text/html charset=UTF-8'
530
-                ));
531
-        } catch (Exception $e) {
532
-            $success = false;
533
-        }
534
-        $this->_redirect_after_action($success, esc_html__("Migration Crash Report", "event_espresso"),
535
-            esc_html__("sent", "event_espresso"),
536
-            array('success' => $success, 'action' => 'confirm_migration_crash_report_sent'));
537
-    }
538
-
539
-
540
-
541
-    public function _confirm_migration_crash_report_sent()
542
-    {
543
-        try {
544
-            $most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
545
-        } catch (EE_Error $e) {
546
-            EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
547
-            //now, just so we can display the page correctly, make a error migration script stage object
548
-            //and also put the error on it. It only persists for the duration of this request
549
-            $most_recent_migration = new EE_DMS_Unknown_1_0_0();
550
-            $most_recent_migration->add_error($e->getMessage());
551
-        }
552
-        $success = $this->_req_data['success'] == '1' ? true : false;
553
-        $this->_template_args['success'] = $success;
554
-        $this->_template_args['most_recent_migration'] = $most_recent_migration;
555
-        $this->_template_args['reset_db_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
556
-            EE_MAINTENANCE_ADMIN_URL);
557
-        $this->_template_args['reset_db_page_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
558
-            EE_MAINTENANCE_ADMIN_URL);
559
-        $this->_template_args['reattempt_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reattempt_migration'),
560
-            EE_MAINTENANCE_ADMIN_URL);
561
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_confirm_migration_crash_report_sent.template.php';
562
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
563
-            $this->_template_args, true);
564
-        $this->display_admin_page_with_sidebar();
565
-    }
566
-
567
-
568
-
569
-    /**
570
-     * Resets the entire EE4 database.
571
-     * Currently basically only sets up ee4 database for a fresh install- doesn't
572
-     * actually clean out the old wp options, or cpts (although does erase old ee table data)
573
-     *
574
-     * @param boolean $nuke_old_ee4_data controls whether or not we
575
-     *                                   destroy the old ee4 data, or just try initializing ee4 default data
576
-     * @throws \EE_Error
577
-     */
578
-    public function _reset_db($nuke_old_ee4_data = true)
579
-    {
580
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
581
-        if ($nuke_old_ee4_data) {
582
-            EEH_Activation::delete_all_espresso_cpt_data();
583
-            EEH_Activation::delete_all_espresso_tables_and_data(false);
584
-            EEH_Activation::remove_cron_tasks();
585
-        }
586
-        //make sure when we reset the registry's config that it
587
-        //switches to using the new singleton
588
-        EE_Registry::instance()->CFG = EE_Registry::instance()->CFG->reset(true);
589
-        /** @var EventEspresso\core\services\activation\InitializeCore $initialize_core */
590
-        $initialize_core = EE_Registry::instance()->create(
591
-            'EventEspresso\core\services\activation\InitializeCore',
592
-            array(true)
593
-        );
594
-        $initialize_core->initialize();
595
-        $initialize_core->redirectToAboutPage();
596
-    }
597
-
598
-
599
-
600
-    /**
601
-     * Deletes ALL EE tables, Records, and Options from the database.
602
-     */
603
-    public function _delete_db()
604
-    {
605
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
606
-        EEH_Activation::delete_all_espresso_cpt_data();
607
-        EEH_Activation::delete_all_espresso_tables_and_data();
608
-        EEH_Activation::remove_cron_tasks();
609
-        EEH_Activation::deactivate_event_espresso();
610
-        wp_safe_redirect(admin_url('plugins.php'));
611
-        exit;
612
-    }
613
-
614
-
615
-
616
-    /**
617
-     * sets up EE4 to rerun the migrations from ee3 to ee4
618
-     */
619
-    public function _rerun_migration_from_ee3()
620
-    {
621
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
622
-        EEH_Activation::delete_all_espresso_cpt_data();
623
-        EEH_Activation::delete_all_espresso_tables_and_data(false);
624
-        //set the db state to something that will require migrations
625
-        update_option(EE_Data_Migration_Manager::current_database_state, '3.1.36.0');
626
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_2_complete_maintenance);
627
-        $this->_redirect_after_action(true, esc_html__("Database", 'event_espresso'), esc_html__("reset", 'event_espresso'));
628
-    }
629
-
630
-
631
-
632
-    //none of the below group are currently used for Gateway Settings
633
-    protected function _add_screen_options()
634
-    {
635
-    }
636
-
637
-
638
-
639
-    protected function _add_feature_pointers()
640
-    {
641
-    }
642
-
643
-
644
-
645
-    public function admin_init()
646
-    {
647
-    }
648
-
649
-
650
-
651
-    public function admin_notices()
652
-    {
653
-    }
654
-
31
+	/**
32
+	 * @var EE_Datetime_Offset_Fix_Form
33
+	 */
34
+	protected $datetime_fix_offset_form;
35
+
36
+
37
+
38
+	protected function _init_page_props()
39
+	{
40
+		$this->page_slug = EE_MAINTENANCE_PG_SLUG;
41
+		$this->page_label = EE_MAINTENANCE_LABEL;
42
+		$this->_admin_base_url = EE_MAINTENANCE_ADMIN_URL;
43
+		$this->_admin_base_path = EE_MAINTENANCE_ADMIN;
44
+	}
45
+
46
+
47
+
48
+	protected function _ajax_hooks()
49
+	{
50
+		add_action('wp_ajax_migration_step', array($this, 'migration_step'));
51
+		add_action('wp_ajax_add_error_to_migrations_ran', array($this, 'add_error_to_migrations_ran'));
52
+	}
53
+
54
+
55
+
56
+	protected function _define_page_props()
57
+	{
58
+		$this->_admin_page_title = EE_MAINTENANCE_LABEL;
59
+		$this->_labels = array(
60
+			'buttons' => array(
61
+				'reset_reservations' => esc_html__('Reset Ticket and Datetime Reserved Counts', 'event_espresso'),
62
+				'reset_capabilities' => esc_html__('Reset Event Espresso Capabilities', 'event_espresso'),
63
+			),
64
+		);
65
+	}
66
+
67
+
68
+
69
+	protected function _set_page_routes()
70
+	{
71
+		$this->_page_routes = array(
72
+			'default'                             => array(
73
+				'func'       => '_maintenance',
74
+				'capability' => 'manage_options',
75
+			),
76
+			'change_maintenance_level'            => array(
77
+				'func'       => '_change_maintenance_level',
78
+				'capability' => 'manage_options',
79
+				'noheader'   => true,
80
+			),
81
+			'system_status'                       => array(
82
+				'func'       => '_system_status',
83
+				'capability' => 'manage_options',
84
+			),
85
+			'download_system_status' => array(
86
+				'func'       => '_download_system_status',
87
+				'capability' => 'manage_options',
88
+				'noheader'   => true,
89
+			),
90
+			'send_migration_crash_report'         => array(
91
+				'func'       => '_send_migration_crash_report',
92
+				'capability' => 'manage_options',
93
+				'noheader'   => true,
94
+			),
95
+			'confirm_migration_crash_report_sent' => array(
96
+				'func'       => '_confirm_migration_crash_report_sent',
97
+				'capability' => 'manage_options',
98
+			),
99
+			'data_reset'                          => array(
100
+				'func'       => '_data_reset_and_delete',
101
+				'capability' => 'manage_options',
102
+			),
103
+			'reset_db'                            => array(
104
+				'func'       => '_reset_db',
105
+				'capability' => 'manage_options',
106
+				'noheader'   => true,
107
+				'args'       => array('nuke_old_ee4_data' => true),
108
+			),
109
+			'start_with_fresh_ee4_db'             => array(
110
+				'func'       => '_reset_db',
111
+				'capability' => 'manage_options',
112
+				'noheader'   => true,
113
+				'args'       => array('nuke_old_ee4_data' => false),
114
+			),
115
+			'delete_db'                           => array(
116
+				'func'       => '_delete_db',
117
+				'capability' => 'manage_options',
118
+				'noheader'   => true,
119
+			),
120
+			'rerun_migration_from_ee3'            => array(
121
+				'func'       => '_rerun_migration_from_ee3',
122
+				'capability' => 'manage_options',
123
+				'noheader'   => true,
124
+			),
125
+			'reset_reservations'                  => array(
126
+				'func'       => '_reset_reservations',
127
+				'capability' => 'manage_options',
128
+				'noheader'   => true,
129
+			),
130
+			'reset_capabilities'                  => array(
131
+				'func'       => '_reset_capabilities',
132
+				'capability' => 'manage_options',
133
+				'noheader'   => true,
134
+			),
135
+			'reattempt_migration'                 => array(
136
+				'func'       => '_reattempt_migration',
137
+				'capability' => 'manage_options',
138
+				'noheader'   => true,
139
+			),
140
+			'datetime_tools' => array(
141
+				'func' => '_datetime_tools',
142
+				'capability' => 'manage_options'
143
+			),
144
+			'run_datetime_offset_fix' => array(
145
+				'func' => '_apply_datetime_offset',
146
+				'noheader' => true,
147
+				'headers_sent_route' => 'datetime_tools',
148
+				'capability' => 'manage_options'
149
+			)
150
+		);
151
+	}
152
+
153
+
154
+
155
+	protected function _set_page_config()
156
+	{
157
+		$this->_page_config = array(
158
+			'default'       => array(
159
+				'nav'           => array(
160
+					'label' => esc_html__('Maintenance', 'event_espresso'),
161
+					'order' => 10,
162
+				),
163
+				'require_nonce' => false,
164
+			),
165
+			'data_reset'    => array(
166
+				'nav'           => array(
167
+					'label' => esc_html__('Reset/Delete Data', 'event_espresso'),
168
+					'order' => 20,
169
+				),
170
+				'require_nonce' => false,
171
+			),
172
+			'datetime_tools' => array(
173
+				'nav' => array(
174
+					'label' => esc_html__('Datetime Utilities', 'event_espresso'),
175
+					'order' => 25
176
+				),
177
+				'require_nonce' => false,
178
+			),
179
+			'system_status' => array(
180
+				'nav'           => array(
181
+					'label' => esc_html__("System Information", "event_espresso"),
182
+					'order' => 30,
183
+				),
184
+				'require_nonce' => false,
185
+			),
186
+		);
187
+	}
188
+
189
+
190
+
191
+	/**
192
+	 * default maintenance page. If we're in maintenance mode level 2, then we need to show
193
+	 * the migration scripts and all that UI.
194
+	 */
195
+	public function _maintenance()
196
+	{
197
+		//it all depends if we're in maintenance model level 1 (frontend-only) or
198
+		//level 2 (everything except maintenance page)
199
+		try {
200
+			//get the current maintenance level and check if
201
+			//we are removed
202
+			$mm = EE_Maintenance_Mode::instance()->level();
203
+			$placed_in_mm = EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
204
+			if ($mm == EE_Maintenance_Mode::level_2_complete_maintenance && ! $placed_in_mm) {
205
+				//we just took the site out of maintenance mode, so notify the user.
206
+				//unfortunately this message appears to be echoed on the NEXT page load...
207
+				//oh well, we should really be checking for this on addon deactivation anyways
208
+				EE_Error::add_attention(__('Site taken out of maintenance mode because no data migration scripts are required',
209
+					'event_espresso'));
210
+				$this->_process_notices(array('page' => 'espresso_maintenance_settings'), false);
211
+			}
212
+			//in case an exception is thrown while trying to handle migrations
213
+			switch (EE_Maintenance_Mode::instance()->level()) {
214
+				case EE_Maintenance_Mode::level_0_not_in_maintenance:
215
+				case EE_Maintenance_Mode::level_1_frontend_only_maintenance:
216
+					$show_maintenance_switch = true;
217
+					$show_backup_db_text = false;
218
+					$show_migration_progress = false;
219
+					$script_names = array();
220
+					$addons_should_be_upgraded_first = false;
221
+					break;
222
+				case EE_Maintenance_Mode::level_2_complete_maintenance:
223
+					$show_maintenance_switch = false;
224
+					$show_migration_progress = true;
225
+					if (isset($this->_req_data['continue_migration'])) {
226
+						$show_backup_db_text = false;
227
+					} else {
228
+						$show_backup_db_text = true;
229
+					}
230
+					$scripts_needing_to_run = EE_Data_Migration_Manager::instance()
231
+																	   ->check_for_applicable_data_migration_scripts();
232
+					$addons_should_be_upgraded_first = EE_Data_Migration_Manager::instance()->addons_need_updating();
233
+					$script_names = array();
234
+					$current_script = null;
235
+					foreach ($scripts_needing_to_run as $script) {
236
+						if ($script instanceof EE_Data_Migration_Script_Base) {
237
+							if ( ! $current_script) {
238
+								$current_script = $script;
239
+								$current_script->migration_page_hooks();
240
+							}
241
+							$script_names[] = $script->pretty_name();
242
+						}
243
+					}
244
+					break;
245
+			}
246
+			$most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
247
+			$exception_thrown = false;
248
+		} catch (EE_Error $e) {
249
+			EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
250
+			//now, just so we can display the page correctly, make a error migration script stage object
251
+			//and also put the error on it. It only persists for the duration of this request
252
+			$most_recent_migration = new EE_DMS_Unknown_1_0_0();
253
+			$most_recent_migration->add_error($e->getMessage());
254
+			$exception_thrown = true;
255
+		}
256
+		$current_db_state = EE_Data_Migration_Manager::instance()->ensure_current_database_state_is_set();
257
+		$current_db_state = str_replace('.decaf', '', $current_db_state);
258
+		if ($exception_thrown
259
+			|| ($most_recent_migration
260
+				&& $most_recent_migration instanceof EE_Data_Migration_Script_Base
261
+				&& $most_recent_migration->is_broken()
262
+			)
263
+		) {
264
+			$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_was_borked_page.template.php';
265
+			$this->_template_args['support_url'] = 'http://eventespresso.com/support/forums/';
266
+			$this->_template_args['next_url'] = EEH_URL::add_query_args_and_nonce(array('action'  => 'confirm_migration_crash_report_sent',
267
+																						'success' => '0',
268
+			), EE_MAINTENANCE_ADMIN_URL);
269
+		} elseif ($addons_should_be_upgraded_first) {
270
+			$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_upgrade_addons_before_migrating.template.php';
271
+		} else {
272
+			if ($most_recent_migration
273
+				&& $most_recent_migration instanceof EE_Data_Migration_Script_Base
274
+				&& $most_recent_migration->can_continue()
275
+			) {
276
+				$show_backup_db_text = false;
277
+				$show_continue_current_migration_script = true;
278
+				$show_most_recent_migration = true;
279
+			} elseif (isset($this->_req_data['continue_migration'])) {
280
+				$show_most_recent_migration = true;
281
+				$show_continue_current_migration_script = false;
282
+			} else {
283
+				$show_most_recent_migration = false;
284
+				$show_continue_current_migration_script = false;
285
+			}
286
+			if (isset($current_script)) {
287
+				$migrates_to = $current_script->migrates_to_version();
288
+				$plugin_slug = $migrates_to['slug'];
289
+				$new_version = $migrates_to['version'];
290
+				$this->_template_args = array_merge($this->_template_args, array(
291
+					'current_db_state' => sprintf(__("EE%s (%s)", "event_espresso"),
292
+						isset($current_db_state[$plugin_slug]) ? $current_db_state[$plugin_slug] : 3, $plugin_slug),
293
+					'next_db_state'    => isset($current_script) ? sprintf(__("EE%s (%s)", 'event_espresso'),
294
+						$new_version, $plugin_slug) : null,
295
+				));
296
+			} else {
297
+				$this->_template_args['current_db_state'] = null;
298
+				$this->_template_args['next_db_state'] = null;
299
+			}
300
+			$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_page.template.php';
301
+			$this->_template_args = array_merge(
302
+				$this->_template_args,
303
+				array(
304
+					'show_most_recent_migration'             => $show_most_recent_migration,
305
+					//flag for showing the most recent migration's status and/or errors
306
+					'show_migration_progress'                => $show_migration_progress,
307
+					//flag for showing the option to run migrations and see their progress
308
+					'show_backup_db_text'                    => $show_backup_db_text,
309
+					//flag for showing text telling the user to backup their DB
310
+					'show_maintenance_switch'                => $show_maintenance_switch,
311
+					//flag for showing the option to change maintenance mode between levels 0 and 1
312
+					'script_names'                           => $script_names,
313
+					//array of names of scripts that have run
314
+					'show_continue_current_migration_script' => $show_continue_current_migration_script,
315
+					//flag to change wording to indicating that we're only CONTINUING a migration script (somehow it got interrupted0
316
+					'reset_db_page_link'                     => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
317
+						EE_MAINTENANCE_ADMIN_URL),
318
+					'data_reset_page'                        => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
319
+						EE_MAINTENANCE_ADMIN_URL),
320
+					'update_migration_script_page_link'      => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'change_maintenance_level'),
321
+						EE_MAINTENANCE_ADMIN_URL),
322
+					'ultimate_db_state'                      => sprintf(__("EE%s", 'event_espresso'),
323
+						espresso_version()),
324
+				)
325
+			);
326
+			//make sure we have the form fields helper available. It usually is, but sometimes it isn't
327
+			//localize script stuff
328
+			wp_localize_script('ee-maintenance', 'ee_maintenance', array(
329
+				'migrating'                        => esc_html__("Updating Database...", "event_espresso"),
330
+				'next'                             => esc_html__("Next", "event_espresso"),
331
+				'fatal_error'                      => esc_html__("A Fatal Error Has Occurred", "event_espresso"),
332
+				'click_next_when_ready'            => esc_html__("The current Database Update has ended. Click 'next' when ready to proceed",
333
+					"event_espresso"),
334
+				'status_no_more_migration_scripts' => EE_Data_Migration_Manager::status_no_more_migration_scripts,
335
+				'status_fatal_error'               => EE_Data_Migration_Manager::status_fatal_error,
336
+				'status_completed'                 => EE_Data_Migration_Manager::status_completed,
337
+			));
338
+		}
339
+		$this->_template_args['most_recent_migration'] = $most_recent_migration;//the actual most recently ran migration
340
+		//now render the migration options part, and put it in a variable
341
+		$migration_options_template_file = apply_filters(
342
+			'FHEE__ee_migration_page__migration_options_template',
343
+			EE_MAINTENANCE_TEMPLATE_PATH . 'migration_options_from_ee4.template.php'
344
+		);
345
+		$migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args,true);
346
+		$this->_template_args['migration_options_html'] = $migration_options_html;
347
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
348
+			$this->_template_args, true);
349
+		$this->display_admin_page_with_sidebar();
350
+	}
351
+
352
+
353
+
354
+	/**
355
+	 * returns JSON and executes another step of the currently-executing data migration (called via ajax)
356
+	 */
357
+	public function migration_step()
358
+	{
359
+		$this->_template_args['data'] = EE_Data_Migration_Manager::instance()->response_to_migration_ajax_request();
360
+		$this->_return_json();
361
+	}
362
+
363
+
364
+
365
+	/**
366
+	 * Can be used by js when it notices a response with HTML in it in order
367
+	 * to log the malformed response
368
+	 */
369
+	public function add_error_to_migrations_ran()
370
+	{
371
+		EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($this->_req_data['message']);
372
+		$this->_template_args['data'] = array('ok' => true);
373
+		$this->_return_json();
374
+	}
375
+
376
+
377
+
378
+	/**
379
+	 * changes the maintenance level, provided there are still no migration scripts that should run
380
+	 */
381
+	public function _change_maintenance_level()
382
+	{
383
+		$new_level = absint($this->_req_data['maintenance_mode_level']);
384
+		if ( ! EE_Data_Migration_Manager::instance()->check_for_applicable_data_migration_scripts()) {
385
+			EE_Maintenance_Mode::instance()->set_maintenance_level($new_level);
386
+			$success = true;
387
+		} else {
388
+			EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
389
+			$success = false;
390
+		}
391
+		$this->_redirect_after_action($success, 'Maintenance Mode', esc_html__("Updated", "event_espresso"));
392
+	}
393
+
394
+
395
+
396
+	/**
397
+	 * a tab with options for resetting and/or deleting EE data
398
+	 *
399
+	 * @throws \EE_Error
400
+	 * @throws \DomainException
401
+	 */
402
+	public function _data_reset_and_delete()
403
+	{
404
+		$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_data_reset_and_delete.template.php';
405
+		$this->_template_args['reset_reservations_button'] = $this->get_action_link_or_button(
406
+			'reset_reservations',
407
+			'reset_reservations',
408
+			array(),
409
+			'button button-primary',
410
+			'',
411
+			false
412
+		);
413
+		$this->_template_args['reset_capabilities_button'] = $this->get_action_link_or_button(
414
+			'reset_capabilities',
415
+			'reset_capabilities',
416
+			array(),
417
+			'button button-primary',
418
+			'',
419
+			false
420
+		);
421
+		$this->_template_args['delete_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
422
+			array('action' => 'delete_db'),
423
+			EE_MAINTENANCE_ADMIN_URL
424
+		);
425
+		$this->_template_args['reset_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
426
+			array('action' => 'reset_db'),
427
+			EE_MAINTENANCE_ADMIN_URL
428
+		);
429
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
430
+			$this->_template_path,
431
+			$this->_template_args,
432
+			true
433
+		);
434
+		$this->display_admin_page_with_sidebar();
435
+	}
436
+
437
+
438
+
439
+	protected function _reset_reservations()
440
+	{
441
+		if(\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
442
+			EE_Error::add_success(
443
+				__(
444
+					'Ticket and datetime reserved counts have been successfully reset.',
445
+					'event_espresso'
446
+				)
447
+			);
448
+		} else {
449
+			EE_Error::add_success(
450
+				__(
451
+					'Ticket and datetime reserved counts were correct and did not need resetting.',
452
+					'event_espresso'
453
+				)
454
+			);
455
+		}
456
+		$this->_redirect_after_action(true, '', '', array('action' => 'data_reset'), true);
457
+	}
458
+
459
+
460
+
461
+	protected function _reset_capabilities()
462
+	{
463
+		EE_Registry::instance()->CAP->init_caps(true);
464
+		EE_Error::add_success(__('Default Event Espresso capabilities have been restored for all current roles.',
465
+			'event_espresso'));
466
+		$this->_redirect_after_action(false, '', '', array('action' => 'data_reset'), true);
467
+	}
468
+
469
+
470
+
471
+	/**
472
+	 * resets the DMSs so we can attempt to continue migrating after a fatal error
473
+	 * (only a good idea when someone has somehow tried ot fix whatever caused
474
+	 * the fatal error in teh first place)
475
+	 */
476
+	protected function _reattempt_migration()
477
+	{
478
+		EE_Data_Migration_Manager::instance()->reattempt();
479
+		$this->_redirect_after_action(false, '', '', array('action' => 'default'), true);
480
+	}
481
+
482
+
483
+
484
+	/**
485
+	 * shows the big ol' System Information page
486
+	 */
487
+	public function _system_status()
488
+	{
489
+		$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_system_stati_page.template.php';
490
+		$this->_template_args['system_stati'] = EEM_System_Status::instance()->get_system_stati();
491
+		$this->_template_args['download_system_status_url'] = EE_Admin_Page::add_query_args_and_nonce(
492
+			array(
493
+				'action' => 'download_system_status',
494
+			),
495
+			EE_MAINTENANCE_ADMIN_URL
496
+		);
497
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
498
+			$this->_template_args, true);
499
+		$this->display_admin_page_with_sidebar();
500
+	}
501
+
502
+	/**
503
+	 * Downloads an HTML file of the system status that can be easily stored or emailed
504
+	 */
505
+	public function _download_system_status()
506
+	{
507
+		$status_info = EEM_System_Status::instance()->get_system_stati();
508
+		header( 'Content-Disposition: attachment' );
509
+		header( "Content-Disposition: attachment; filename=system_status_" . sanitize_key( site_url() ) . ".html" );
510
+		echo "<style>table{border:1px solid darkgrey;}td{vertical-align:top}</style>";
511
+		echo "<h1>System Information for " . site_url() . "</h1>";
512
+		echo EEH_Template::layout_array_as_table( $status_info );
513
+		die;
514
+	}
515
+
516
+
517
+
518
+	public function _send_migration_crash_report()
519
+	{
520
+		$from = $this->_req_data['from'];
521
+		$from_name = $this->_req_data['from_name'];
522
+		$body = $this->_req_data['body'];
523
+		try {
524
+			$success = wp_mail(EE_SUPPORT_EMAIL,
525
+				'Migration Crash Report',
526
+				$body . "/r/n<br>" . print_r(EEM_System_Status::instance()->get_system_stati(), true),
527
+				array(
528
+					"from:$from_name<$from>",
529
+					//					'content-type:text/html charset=UTF-8'
530
+				));
531
+		} catch (Exception $e) {
532
+			$success = false;
533
+		}
534
+		$this->_redirect_after_action($success, esc_html__("Migration Crash Report", "event_espresso"),
535
+			esc_html__("sent", "event_espresso"),
536
+			array('success' => $success, 'action' => 'confirm_migration_crash_report_sent'));
537
+	}
538
+
539
+
540
+
541
+	public function _confirm_migration_crash_report_sent()
542
+	{
543
+		try {
544
+			$most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
545
+		} catch (EE_Error $e) {
546
+			EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
547
+			//now, just so we can display the page correctly, make a error migration script stage object
548
+			//and also put the error on it. It only persists for the duration of this request
549
+			$most_recent_migration = new EE_DMS_Unknown_1_0_0();
550
+			$most_recent_migration->add_error($e->getMessage());
551
+		}
552
+		$success = $this->_req_data['success'] == '1' ? true : false;
553
+		$this->_template_args['success'] = $success;
554
+		$this->_template_args['most_recent_migration'] = $most_recent_migration;
555
+		$this->_template_args['reset_db_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
556
+			EE_MAINTENANCE_ADMIN_URL);
557
+		$this->_template_args['reset_db_page_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
558
+			EE_MAINTENANCE_ADMIN_URL);
559
+		$this->_template_args['reattempt_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reattempt_migration'),
560
+			EE_MAINTENANCE_ADMIN_URL);
561
+		$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_confirm_migration_crash_report_sent.template.php';
562
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
563
+			$this->_template_args, true);
564
+		$this->display_admin_page_with_sidebar();
565
+	}
566
+
567
+
568
+
569
+	/**
570
+	 * Resets the entire EE4 database.
571
+	 * Currently basically only sets up ee4 database for a fresh install- doesn't
572
+	 * actually clean out the old wp options, or cpts (although does erase old ee table data)
573
+	 *
574
+	 * @param boolean $nuke_old_ee4_data controls whether or not we
575
+	 *                                   destroy the old ee4 data, or just try initializing ee4 default data
576
+	 * @throws \EE_Error
577
+	 */
578
+	public function _reset_db($nuke_old_ee4_data = true)
579
+	{
580
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
581
+		if ($nuke_old_ee4_data) {
582
+			EEH_Activation::delete_all_espresso_cpt_data();
583
+			EEH_Activation::delete_all_espresso_tables_and_data(false);
584
+			EEH_Activation::remove_cron_tasks();
585
+		}
586
+		//make sure when we reset the registry's config that it
587
+		//switches to using the new singleton
588
+		EE_Registry::instance()->CFG = EE_Registry::instance()->CFG->reset(true);
589
+		/** @var EventEspresso\core\services\activation\InitializeCore $initialize_core */
590
+		$initialize_core = EE_Registry::instance()->create(
591
+			'EventEspresso\core\services\activation\InitializeCore',
592
+			array(true)
593
+		);
594
+		$initialize_core->initialize();
595
+		$initialize_core->redirectToAboutPage();
596
+	}
597
+
598
+
599
+
600
+	/**
601
+	 * Deletes ALL EE tables, Records, and Options from the database.
602
+	 */
603
+	public function _delete_db()
604
+	{
605
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
606
+		EEH_Activation::delete_all_espresso_cpt_data();
607
+		EEH_Activation::delete_all_espresso_tables_and_data();
608
+		EEH_Activation::remove_cron_tasks();
609
+		EEH_Activation::deactivate_event_espresso();
610
+		wp_safe_redirect(admin_url('plugins.php'));
611
+		exit;
612
+	}
613
+
614
+
615
+
616
+	/**
617
+	 * sets up EE4 to rerun the migrations from ee3 to ee4
618
+	 */
619
+	public function _rerun_migration_from_ee3()
620
+	{
621
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
622
+		EEH_Activation::delete_all_espresso_cpt_data();
623
+		EEH_Activation::delete_all_espresso_tables_and_data(false);
624
+		//set the db state to something that will require migrations
625
+		update_option(EE_Data_Migration_Manager::current_database_state, '3.1.36.0');
626
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_2_complete_maintenance);
627
+		$this->_redirect_after_action(true, esc_html__("Database", 'event_espresso'), esc_html__("reset", 'event_espresso'));
628
+	}
629
+
630
+
631
+
632
+	//none of the below group are currently used for Gateway Settings
633
+	protected function _add_screen_options()
634
+	{
635
+	}
636
+
637
+
638
+
639
+	protected function _add_feature_pointers()
640
+	{
641
+	}
642
+
643
+
644
+
645
+	public function admin_init()
646
+	{
647
+	}
648
+
649
+
650
+
651
+	public function admin_notices()
652
+	{
653
+	}
654
+
655 655
 
656 656
 
657
-    public function admin_footer_scripts()
658
-    {
659
-    }
657
+	public function admin_footer_scripts()
658
+	{
659
+	}
660 660
 
661 661
 
662 662
 
663
-    public function load_scripts_styles()
664
-    {
665
-        wp_enqueue_script('ee_admin_js');
663
+	public function load_scripts_styles()
664
+	{
665
+		wp_enqueue_script('ee_admin_js');
666 666
 //		wp_enqueue_media();
667 667
 //		wp_enqueue_script('media-upload');
668
-        wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL . '/ee-maintenance.js', array('jquery'),
669
-            EVENT_ESPRESSO_VERSION, true);
670
-        wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL . 'ee-maintenance.css', array(),
671
-            EVENT_ESPRESSO_VERSION);
672
-        wp_enqueue_style('espresso_maintenance');
673
-    }
668
+		wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL . '/ee-maintenance.js', array('jquery'),
669
+			EVENT_ESPRESSO_VERSION, true);
670
+		wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL . 'ee-maintenance.css', array(),
671
+			EVENT_ESPRESSO_VERSION);
672
+		wp_enqueue_style('espresso_maintenance');
673
+	}
674 674
 
675 675
 
676 676
 
677
-    public function load_scripts_styles_default()
678
-    {
679
-        //styles
677
+	public function load_scripts_styles_default()
678
+	{
679
+		//styles
680 680
 //		wp_enqueue_style('ee-text-links');
681 681
 //		//scripts
682 682
 //		wp_enqueue_script('ee-text-links');
683
-    }
684
-
685
-
686
-    protected function _datetime_tools()
687
-    {
688
-        $form_action = EE_Admin_Page::add_query_args_and_nonce(
689
-            array(
690
-                'action' => 'run_datetime_offset_fix',
691
-                'return_action' => $this->_req_action
692
-            ),
693
-            EE_MAINTENANCE_ADMIN_URL
694
-        );
695
-        $form = $this->_get_datetime_offset_fix_form();
696
-        $this->_admin_page_title = esc_html__('Datetime Utilities', 'event_espresso');
697
-        $this->_template_args['admin_page_content'] = $form->form_open($form_action, 'post')
698
-                                                      . $form->get_html_and_js()
699
-                                                      . $form->form_close();
700
-        $this->display_admin_page_with_no_sidebar();
701
-    }
702
-
703
-
704
-
705
-    protected function _get_datetime_offset_fix_form()
706
-    {
707
-        if (! $this->datetime_fix_offset_form instanceof EE_Form_Section_Proper) {
708
-            $this->datetime_fix_offset_form =  new EE_Form_Section_Proper(
709
-                array(
710
-                    'name' => 'datetime_offset_fix_option',
711
-                    'layout_strategy' => new EE_Admin_Two_Column_Layout(),
712
-                    'subsections' => array(
713
-                        'title' => new EE_Form_Section_HTML(
714
-                            EEH_HTML::h2(
715
-                                esc_html__('Datetime Offset Tool', 'event_espresso')
716
-                            )
717
-                        ),
718
-                        'explanation' => new EE_Form_Section_HTML(
719
-                            EEH_HTML::p(
720
-                                esc_html__(
721
-                                    'Use this tool to automatically apply the provided offset to all Event Espresso records in your database that involve dates and times.',
722
-                                    'event_espresso'
723
-                                )
724
-                            )
725
-                            . EEH_HTML::p(
726
-                                esc_html__(
727
-                                    'Note: If you enter 1.25, that will result in the offset of 1 hour 15 minutes being applied.  Decimals represent the fraction of hours, not minutes.',
728
-                                    'event_espresso'
729
-                                )
730
-                            )
731
-                        ),
732
-                        'offset_input' => new EE_Float_Input(
733
-                            array(
734
-                                'html_name' => 'offset_for_datetimes',
735
-                                'html_label_text' => esc_html__(
736
-                                    'Offset to apply (in hours):',
737
-                                    'event_espresso'
738
-                                ),
739
-                                'min_value' => '-12',
740
-                                'max_value' => '14',
741
-                                'step_value' => '.25',
742
-                                'default' => DatetimeOffsetFix::getOffset()
743
-                            )
744
-                        ),
745
-                        'submit' => new EE_Submit_Input(
746
-                            array(
747
-                                'html_label_text' => '',
748
-                                'default' => esc_html__('Apply Offset', 'event_espresso')
749
-                            )
750
-                        )
751
-                    )
752
-                )
753
-            );
754
-        }
755
-        return $this->datetime_fix_offset_form;
756
-    }
757
-
758
-
759
-    /**
760
-     * Callback for the run_datetime_offset_fix route.
761
-     * @throws EE_Error
762
-     */
763
-    protected function _apply_datetime_offset()
764
-    {
765
-        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
766
-            $form = $this->_get_datetime_offset_fix_form();
767
-            $form->receive_form_submission($this->_req_data);
768
-            if ($form->is_valid()) {
769
-                //save offset so batch processor can get it.
770
-                DatetimeOffsetFix::updateOffset($form->get_input_value('offset_input'));
771
-                //redirect to batch tool
772
-                wp_redirect(
773
-                    EE_Admin_Page::add_query_args_and_nonce(
774
-                        array(
775
-                            'page' => 'espresso_batch',
776
-                            'batch' => 'job',
777
-                            'label' => esc_html__('Applying Offset', 'event_espresso'),
778
-                            'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\DatetimeOffsetFix'),
779
-                            'return_url' => urlencode(home_url(add_query_arg(null, null))),
780
-                        ),
781
-                        admin_url()
782
-                    )
783
-                );
784
-                exit;
785
-            }
786
-        }
787
-    }
683
+	}
684
+
685
+
686
+	protected function _datetime_tools()
687
+	{
688
+		$form_action = EE_Admin_Page::add_query_args_and_nonce(
689
+			array(
690
+				'action' => 'run_datetime_offset_fix',
691
+				'return_action' => $this->_req_action
692
+			),
693
+			EE_MAINTENANCE_ADMIN_URL
694
+		);
695
+		$form = $this->_get_datetime_offset_fix_form();
696
+		$this->_admin_page_title = esc_html__('Datetime Utilities', 'event_espresso');
697
+		$this->_template_args['admin_page_content'] = $form->form_open($form_action, 'post')
698
+													  . $form->get_html_and_js()
699
+													  . $form->form_close();
700
+		$this->display_admin_page_with_no_sidebar();
701
+	}
702
+
703
+
704
+
705
+	protected function _get_datetime_offset_fix_form()
706
+	{
707
+		if (! $this->datetime_fix_offset_form instanceof EE_Form_Section_Proper) {
708
+			$this->datetime_fix_offset_form =  new EE_Form_Section_Proper(
709
+				array(
710
+					'name' => 'datetime_offset_fix_option',
711
+					'layout_strategy' => new EE_Admin_Two_Column_Layout(),
712
+					'subsections' => array(
713
+						'title' => new EE_Form_Section_HTML(
714
+							EEH_HTML::h2(
715
+								esc_html__('Datetime Offset Tool', 'event_espresso')
716
+							)
717
+						),
718
+						'explanation' => new EE_Form_Section_HTML(
719
+							EEH_HTML::p(
720
+								esc_html__(
721
+									'Use this tool to automatically apply the provided offset to all Event Espresso records in your database that involve dates and times.',
722
+									'event_espresso'
723
+								)
724
+							)
725
+							. EEH_HTML::p(
726
+								esc_html__(
727
+									'Note: If you enter 1.25, that will result in the offset of 1 hour 15 minutes being applied.  Decimals represent the fraction of hours, not minutes.',
728
+									'event_espresso'
729
+								)
730
+							)
731
+						),
732
+						'offset_input' => new EE_Float_Input(
733
+							array(
734
+								'html_name' => 'offset_for_datetimes',
735
+								'html_label_text' => esc_html__(
736
+									'Offset to apply (in hours):',
737
+									'event_espresso'
738
+								),
739
+								'min_value' => '-12',
740
+								'max_value' => '14',
741
+								'step_value' => '.25',
742
+								'default' => DatetimeOffsetFix::getOffset()
743
+							)
744
+						),
745
+						'submit' => new EE_Submit_Input(
746
+							array(
747
+								'html_label_text' => '',
748
+								'default' => esc_html__('Apply Offset', 'event_espresso')
749
+							)
750
+						)
751
+					)
752
+				)
753
+			);
754
+		}
755
+		return $this->datetime_fix_offset_form;
756
+	}
757
+
758
+
759
+	/**
760
+	 * Callback for the run_datetime_offset_fix route.
761
+	 * @throws EE_Error
762
+	 */
763
+	protected function _apply_datetime_offset()
764
+	{
765
+		if ($_SERVER['REQUEST_METHOD'] === 'POST') {
766
+			$form = $this->_get_datetime_offset_fix_form();
767
+			$form->receive_form_submission($this->_req_data);
768
+			if ($form->is_valid()) {
769
+				//save offset so batch processor can get it.
770
+				DatetimeOffsetFix::updateOffset($form->get_input_value('offset_input'));
771
+				//redirect to batch tool
772
+				wp_redirect(
773
+					EE_Admin_Page::add_query_args_and_nonce(
774
+						array(
775
+							'page' => 'espresso_batch',
776
+							'batch' => 'job',
777
+							'label' => esc_html__('Applying Offset', 'event_espresso'),
778
+							'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\DatetimeOffsetFix'),
779
+							'return_url' => urlencode(home_url(add_query_arg(null, null))),
780
+						),
781
+						admin_url()
782
+					)
783
+				);
784
+				exit;
785
+			}
786
+		}
787
+	}
788 788
 } //end Maintenance_Admin_Page class
Please login to merge, or discard this patch.