Completed
Branch BUG/3575-event-deletion-previe... (bbeda1)
by
unknown
06:40 queued 04:49
created
4_5_0_stages/EE_DMS_4_5_0_update_wp_user_for_price_types.dmsstage.php 2 patches
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -9,36 +9,36 @@
 block discarded – undo
9 9
 */
10 10
 class EE_DMS_4_5_0_update_wp_user_for_price_types extends EE_Data_Migration_Script_Stage_Table
11 11
 {
12
-    public function __construct()
13
-    {
14
-        global $wpdb;
15
-        $this->_pretty_name = esc_html__("Price Types", "event_espresso");
16
-        $this->_old_table = $wpdb->prefix . "esp_price_type";
17
-        parent::__construct();
18
-    }
19
-    protected function _migrate_old_row($old_row)
20
-    {
21
-        // foreach ticket row we add the id for the current logged in user.
22
-        global $wpdb;
23
-        $user_id = EEH_Activation::get_default_creator_id();
24
-        $updated = $wpdb->update(
25
-            $this->_old_table,
26
-            array('PRT_wp_user' => $user_id),
27
-            array('PRT_ID' => $old_row['PRT_ID']),
28
-            array('%d',// PRT_wp_user
29
-                    ),
30
-            array('%d',// PRT_ID
31
-                    )
32
-        );
33
-        if (false === $updated) {
34
-            $this->add_error(
35
-                sprintf(
36
-                    esc_html__("Error in updating table %s setting PRT_wp_user = %d where PRT_ID = %d", 'event_espresso'),
37
-                    $this->_old_table,
38
-                    $user_id,
39
-                    $old_row['PRT_ID']
40
-                )
41
-            );
42
-        }
43
-    }
12
+	public function __construct()
13
+	{
14
+		global $wpdb;
15
+		$this->_pretty_name = esc_html__("Price Types", "event_espresso");
16
+		$this->_old_table = $wpdb->prefix . "esp_price_type";
17
+		parent::__construct();
18
+	}
19
+	protected function _migrate_old_row($old_row)
20
+	{
21
+		// foreach ticket row we add the id for the current logged in user.
22
+		global $wpdb;
23
+		$user_id = EEH_Activation::get_default_creator_id();
24
+		$updated = $wpdb->update(
25
+			$this->_old_table,
26
+			array('PRT_wp_user' => $user_id),
27
+			array('PRT_ID' => $old_row['PRT_ID']),
28
+			array('%d',// PRT_wp_user
29
+					),
30
+			array('%d',// PRT_ID
31
+					)
32
+		);
33
+		if (false === $updated) {
34
+			$this->add_error(
35
+				sprintf(
36
+					esc_html__("Error in updating table %s setting PRT_wp_user = %d where PRT_ID = %d", 'event_espresso'),
37
+					$this->_old_table,
38
+					$user_id,
39
+					$old_row['PRT_ID']
40
+				)
41
+			);
42
+		}
43
+	}
44 44
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -13,7 +13,7 @@  discard block
 block discarded – undo
13 13
     {
14 14
         global $wpdb;
15 15
         $this->_pretty_name = esc_html__("Price Types", "event_espresso");
16
-        $this->_old_table = $wpdb->prefix . "esp_price_type";
16
+        $this->_old_table = $wpdb->prefix."esp_price_type";
17 17
         parent::__construct();
18 18
     }
19 19
     protected function _migrate_old_row($old_row)
@@ -25,9 +25,9 @@  discard block
 block discarded – undo
25 25
             $this->_old_table,
26 26
             array('PRT_wp_user' => $user_id),
27 27
             array('PRT_ID' => $old_row['PRT_ID']),
28
-            array('%d',// PRT_wp_user
28
+            array('%d', // PRT_wp_user
29 29
                     ),
30
-            array('%d',// PRT_ID
30
+            array('%d', // PRT_ID
31 31
                     )
32 32
         );
33 33
         if (false === $updated) {
Please login to merge, or discard this patch.
4_5_0_stages/EE_DMS_4_5_0_update_wp_user_for_prices.dmsstage.php 2 patches
Indentation   +35 added lines, -35 removed lines patch added patch discarded remove patch
@@ -9,39 +9,39 @@
 block discarded – undo
9 9
 */
10 10
 class EE_DMS_4_5_0_update_wp_user_for_prices extends EE_Data_Migration_Script_Stage_Table
11 11
 {
12
-    public function __construct()
13
-    {
14
-        global $wpdb;
15
-        $this->_pretty_name = esc_html__("Prices", "event_espresso");
16
-        $this->_old_table = $wpdb->prefix . "esp_price";
17
-        parent::__construct();
18
-    }
19
-    protected function _migrate_old_row($old_row)
20
-    {
21
-        // foreach ticket row we add the id for the current logged in user.
22
-        global $wpdb;
23
-        $user_id = EEH_Activation::get_default_creator_id();
24
-        $updated = $wpdb->update(
25
-            $this->_old_table,
26
-            array('PRC_wp_user' => $user_id),
27
-            array('PRC_ID' => $old_row['PRC_ID']),
28
-            array('%d',// PRC_wp_user
29
-                    ),
30
-            array('%d',// PRC_ID
31
-                    )
32
-        );
33
-        if (false === $updated) {
34
-            $this->add_error(
35
-                sprintf(
36
-                    esc_html__(
37
-                        "Error in updating table %s setting PRC_wp_user = %d where PRC_ID = %d",
38
-                        'event_espresso'
39
-                    ),
40
-                    $this->_old_table,
41
-                    $user_id,
42
-                    $old_row['PRC_ID']
43
-                )
44
-            );
45
-        }
46
-    }
12
+	public function __construct()
13
+	{
14
+		global $wpdb;
15
+		$this->_pretty_name = esc_html__("Prices", "event_espresso");
16
+		$this->_old_table = $wpdb->prefix . "esp_price";
17
+		parent::__construct();
18
+	}
19
+	protected function _migrate_old_row($old_row)
20
+	{
21
+		// foreach ticket row we add the id for the current logged in user.
22
+		global $wpdb;
23
+		$user_id = EEH_Activation::get_default_creator_id();
24
+		$updated = $wpdb->update(
25
+			$this->_old_table,
26
+			array('PRC_wp_user' => $user_id),
27
+			array('PRC_ID' => $old_row['PRC_ID']),
28
+			array('%d',// PRC_wp_user
29
+					),
30
+			array('%d',// PRC_ID
31
+					)
32
+		);
33
+		if (false === $updated) {
34
+			$this->add_error(
35
+				sprintf(
36
+					esc_html__(
37
+						"Error in updating table %s setting PRC_wp_user = %d where PRC_ID = %d",
38
+						'event_espresso'
39
+					),
40
+					$this->_old_table,
41
+					$user_id,
42
+					$old_row['PRC_ID']
43
+				)
44
+			);
45
+		}
46
+	}
47 47
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -13,7 +13,7 @@  discard block
 block discarded – undo
13 13
     {
14 14
         global $wpdb;
15 15
         $this->_pretty_name = esc_html__("Prices", "event_espresso");
16
-        $this->_old_table = $wpdb->prefix . "esp_price";
16
+        $this->_old_table = $wpdb->prefix."esp_price";
17 17
         parent::__construct();
18 18
     }
19 19
     protected function _migrate_old_row($old_row)
@@ -25,9 +25,9 @@  discard block
 block discarded – undo
25 25
             $this->_old_table,
26 26
             array('PRC_wp_user' => $user_id),
27 27
             array('PRC_ID' => $old_row['PRC_ID']),
28
-            array('%d',// PRC_wp_user
28
+            array('%d', // PRC_wp_user
29 29
                     ),
30
-            array('%d',// PRC_ID
30
+            array('%d', // PRC_ID
31 31
                     )
32 32
         );
33 33
         if (false === $updated) {
Please login to merge, or discard this patch.
core/data_migration_scripts/EE_DMS_Core_4_5_0.dms.php 2 patches
Indentation   +229 added lines, -229 removed lines patch added patch discarded remove patch
@@ -18,9 +18,9 @@  discard block
 block discarded – undo
18 18
 $stages = glob(EE_CORE . 'data_migration_scripts/4_5_0_stages/*');
19 19
 $class_to_filepath = array();
20 20
 foreach ($stages as $filepath) {
21
-    $matches = array();
22
-    preg_match('~4_5_0_stages/(.*).dmsstage.php~', $filepath, $matches);
23
-    $class_to_filepath[ $matches[1] ] = $filepath;
21
+	$matches = array();
22
+	preg_match('~4_5_0_stages/(.*).dmsstage.php~', $filepath, $matches);
23
+	$class_to_filepath[ $matches[1] ] = $filepath;
24 24
 }
25 25
 // give addons a chance to autoload their stages too
26 26
 $class_to_filepath = apply_filters('FHEE__EE_DMS_4_5_0__autoloaded_stages', $class_to_filepath);
@@ -33,59 +33,59 @@  discard block
 block discarded – undo
33 33
 
34 34
 
35 35
 
36
-    /**
37
-     * EE_DMS_Core_4_5_0 constructor.
38
-     *
39
-     * @param TableManager  $table_manager
40
-     * @param TableAnalysis $table_analysis
41
-     */
42
-    public function __construct(TableManager $table_manager = null, TableAnalysis $table_analysis = null)
43
-    {
44
-        $this->_pretty_name = esc_html__("Data Update to Event Espresso 4.5.0", "event_espresso");
45
-        $this->_priority = 10;
46
-        $this->_migration_stages = array(
47
-            new EE_DMS_4_5_0_update_wp_user_for_tickets(),
48
-            new EE_DMS_4_5_0_update_wp_user_for_prices(),
49
-            new EE_DMS_4_5_0_update_wp_user_for_price_types(),
50
-            new EE_DMS_4_5_0_update_wp_user_for_question_groups(),
51
-            new EE_DMS_4_5_0_invoice_settings(),
52
-        );
53
-        parent::__construct($table_manager, $table_analysis);
54
-    }
36
+	/**
37
+	 * EE_DMS_Core_4_5_0 constructor.
38
+	 *
39
+	 * @param TableManager  $table_manager
40
+	 * @param TableAnalysis $table_analysis
41
+	 */
42
+	public function __construct(TableManager $table_manager = null, TableAnalysis $table_analysis = null)
43
+	{
44
+		$this->_pretty_name = esc_html__("Data Update to Event Espresso 4.5.0", "event_espresso");
45
+		$this->_priority = 10;
46
+		$this->_migration_stages = array(
47
+			new EE_DMS_4_5_0_update_wp_user_for_tickets(),
48
+			new EE_DMS_4_5_0_update_wp_user_for_prices(),
49
+			new EE_DMS_4_5_0_update_wp_user_for_price_types(),
50
+			new EE_DMS_4_5_0_update_wp_user_for_question_groups(),
51
+			new EE_DMS_4_5_0_invoice_settings(),
52
+		);
53
+		parent::__construct($table_manager, $table_analysis);
54
+	}
55 55
 
56 56
 
57 57
 
58
-    public function can_migrate_from_version($version_array)
59
-    {
60
-        $version_string = $version_array['Core'];
61
-        if (version_compare($version_string, '4.5.0.decaf', '<') && version_compare($version_string, '4.3.0.decaf', '>=')) {
58
+	public function can_migrate_from_version($version_array)
59
+	{
60
+		$version_string = $version_array['Core'];
61
+		if (version_compare($version_string, '4.5.0.decaf', '<') && version_compare($version_string, '4.3.0.decaf', '>=')) {
62 62
 //          echo "$version_string can be migrated from";
63
-            return true;
64
-        } elseif (! $version_string) {
63
+			return true;
64
+		} elseif (! $version_string) {
65 65
 //          echo "no version string provided: $version_string";
66
-            // no version string provided... this must be pre 4.3
67
-            return false;// changed mind. dont want people thinking they should migrate yet because they cant
68
-        } else {
66
+			// no version string provided... this must be pre 4.3
67
+			return false;// changed mind. dont want people thinking they should migrate yet because they cant
68
+		} else {
69 69
 //          echo "$version_string doesnt apply";
70
-            return false;
71
-        }
72
-    }
70
+			return false;
71
+		}
72
+	}
73 73
 
74 74
 
75 75
 
76
-    public function schema_changes_before_migration()
77
-    {
78
-        // relies on 4.1's EEH_Activation::create_table
79
-        require_once(EE_HELPERS . 'EEH_Activation.helper.php');
80
-        $table_name = 'esp_answer';
81
-        $sql = "ANS_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
76
+	public function schema_changes_before_migration()
77
+	{
78
+		// relies on 4.1's EEH_Activation::create_table
79
+		require_once(EE_HELPERS . 'EEH_Activation.helper.php');
80
+		$table_name = 'esp_answer';
81
+		$sql = "ANS_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
82 82
 					REG_ID int(10) unsigned NOT NULL,
83 83
 					QST_ID int(10) unsigned NOT NULL,
84 84
 					ANS_value text NOT NULL,
85 85
 					PRIMARY KEY  (ANS_ID)";
86
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
87
-        $table_name = 'esp_attendee_meta';
88
-        $sql = "ATTM_ID int(10) unsigned NOT	NULL AUTO_INCREMENT,
86
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
87
+		$table_name = 'esp_attendee_meta';
88
+		$sql = "ATTM_ID int(10) unsigned NOT	NULL AUTO_INCREMENT,
89 89
 						ATT_ID bigint(20) unsigned NOT NULL,
90 90
 						ATT_fname varchar(45) NOT NULL,
91 91
 						ATT_lname varchar(45) NOT	NULL,
@@ -101,9 +101,9 @@  discard block
 block discarded – undo
101 101
 								KEY ATT_fname (ATT_fname),
102 102
 								KEY ATT_lname (ATT_lname),
103 103
 								KEY ATT_email (ATT_email(191))";
104
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
105
-        $table_name = 'esp_country';
106
-        $sql = "CNT_ISO varchar(2) COLLATE utf8_bin NOT NULL,
104
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
105
+		$table_name = 'esp_country';
106
+		$sql = "CNT_ISO varchar(2) COLLATE utf8_bin NOT NULL,
107 107
 					  CNT_ISO3 varchar(3) COLLATE utf8_bin NOT NULL,
108 108
 					  RGN_ID tinyint(3) unsigned DEFAULT NULL,
109 109
 					  CNT_name varchar(45) COLLATE utf8_bin NOT NULL,
@@ -119,9 +119,9 @@  discard block
 block discarded – undo
119 119
 					  CNT_is_EU tinyint(1) DEFAULT '0',
120 120
 					  CNT_active tinyint(1) DEFAULT '0',
121 121
 					  PRIMARY KEY  (CNT_ISO)";
122
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
123
-        $table_name = 'esp_datetime';
124
-        $sql = "DTT_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
122
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
123
+		$table_name = 'esp_datetime';
124
+		$sql = "DTT_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
125 125
 				  EVT_ID bigint(20) unsigned NOT NULL,
126 126
 				  DTT_name varchar(255) NOT NULL DEFAULT '',
127 127
 				  DTT_description text NOT NULL,
@@ -136,9 +136,9 @@  discard block
 block discarded – undo
136 136
 						PRIMARY KEY  (DTT_ID),
137 137
 						KEY EVT_ID (EVT_ID),
138 138
 						KEY DTT_is_primary (DTT_is_primary)";
139
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
140
-        $table_name = 'esp_event_meta';
141
-        $sql = "
139
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
140
+		$table_name = 'esp_event_meta';
141
+		$sql = "
142 142
 			EVTM_ID int(10) NOT NULL AUTO_INCREMENT,
143 143
 			EVT_ID bigint(20) unsigned NOT NULL,
144 144
 			EVT_display_desc tinyint(1) unsigned NOT NULL DEFAULT 1,
@@ -153,31 +153,31 @@  discard block
 block discarded – undo
153 153
 			EVT_external_URL varchar(200) NULL,
154 154
 			EVT_donations tinyint(1) NULL,
155 155
 			PRIMARY KEY  (EVTM_ID)";
156
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
157
-        $table_name = 'esp_event_question_group';
158
-        $sql = "EQG_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
156
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
157
+		$table_name = 'esp_event_question_group';
158
+		$sql = "EQG_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
159 159
 					EVT_ID bigint(20) unsigned NOT NULL,
160 160
 					QSG_ID int(10) unsigned NOT NULL,
161 161
 					EQG_primary tinyint(1) unsigned NOT NULL DEFAULT 0,
162 162
 					PRIMARY KEY  (EQG_ID)";
163
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
164
-        $table_name = 'esp_event_venue';
165
-        $sql = "EVV_ID int(11) NOT NULL AUTO_INCREMENT,
163
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
164
+		$table_name = 'esp_event_venue';
165
+		$sql = "EVV_ID int(11) NOT NULL AUTO_INCREMENT,
166 166
 				EVT_ID bigint(20) unsigned NOT NULL,
167 167
 				VNU_ID bigint(20) unsigned NOT NULL,
168 168
 				EVV_primary tinyint(1) unsigned NOT NULL DEFAULT 0,
169 169
 				PRIMARY KEY  (EVV_ID)";
170
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
171
-        $table_name = 'esp_extra_meta';
172
-        $sql = "EXM_ID int(11) NOT NULL AUTO_INCREMENT,
170
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
171
+		$table_name = 'esp_extra_meta';
172
+		$sql = "EXM_ID int(11) NOT NULL AUTO_INCREMENT,
173 173
 				OBJ_ID int(11) DEFAULT NULL,
174 174
 				EXM_type varchar(45) DEFAULT NULL,
175 175
 				EXM_key varchar(45) DEFAULT NULL,
176 176
 				EXM_value text,
177 177
 				PRIMARY KEY  (EXM_ID)";
178
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
179
-        $table_name = 'esp_line_item';
180
-        $sql = "LIN_ID int(11) NOT NULL AUTO_INCREMENT,
178
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
179
+		$table_name = 'esp_line_item';
180
+		$sql = "LIN_ID int(11) NOT NULL AUTO_INCREMENT,
181 181
 				LIN_code varchar(245) NOT NULL DEFAULT '',
182 182
 				TXN_ID int(11) DEFAULT NULL,
183 183
 				LIN_name varchar(245) NOT NULL DEFAULT '',
@@ -193,19 +193,19 @@  discard block
 block discarded – undo
193 193
 				OBJ_ID int(11) DEFAULT NULL,
194 194
 				OBJ_type varchar(45)DEFAULT NULL,
195 195
 				PRIMARY KEY  (LIN_ID)";
196
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
197
-        $table_name = 'esp_message_template';
198
-        $sql = "MTP_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
196
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
197
+		$table_name = 'esp_message_template';
198
+		$sql = "MTP_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
199 199
 					GRP_ID int(10) unsigned NOT NULL,
200 200
 					MTP_context varchar(50) NOT NULL,
201 201
 					MTP_template_field varchar(30) NOT NULL,
202 202
 					MTP_content text NOT NULL,
203 203
 					PRIMARY KEY  (MTP_ID),
204 204
 					KEY GRP_ID (GRP_ID)";
205
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
206
-        $this->_get_table_manager()->dropIndex('esp_message_template_group', 'EVT_ID');
207
-        $table_name = 'esp_message_template_group';
208
-        $sql = "GRP_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
205
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
206
+		$this->_get_table_manager()->dropIndex('esp_message_template_group', 'EVT_ID');
207
+		$table_name = 'esp_message_template_group';
208
+		$sql = "GRP_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
209 209
 					MTP_user_id int(10) NOT NULL DEFAULT '1',
210 210
 					MTP_name varchar(245) NOT NULL DEFAULT '',
211 211
 					MTP_description varchar(245) NOT NULL DEFAULT '',
@@ -217,17 +217,17 @@  discard block
 block discarded – undo
217 217
 					MTP_is_active tinyint(1) NOT NULL DEFAULT '1',
218 218
 					PRIMARY KEY  (GRP_ID),
219 219
 					KEY MTP_user_id (MTP_user_id)";
220
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
221
-        $table_name = 'esp_event_message_template';
222
-        $sql = "EMT_ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
220
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
221
+		$table_name = 'esp_event_message_template';
222
+		$sql = "EMT_ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
223 223
 					EVT_ID bigint(20) unsigned NOT NULL DEFAULT 0,
224 224
 					GRP_ID int(10) unsigned NOT NULL DEFAULT 0,
225 225
 					PRIMARY KEY  (EMT_ID),
226 226
 					KEY EVT_ID (EVT_ID),
227 227
 					KEY GRP_ID (GRP_ID)";
228
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
229
-        $table_name = 'esp_payment';
230
-        $sql = "PAY_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
228
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
229
+		$table_name = 'esp_payment';
230
+		$sql = "PAY_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
231 231
 					TXN_ID int(10) unsigned DEFAULT NULL,
232 232
 					STS_ID varchar(3) COLLATE utf8_bin DEFAULT NULL,
233 233
 					PAY_timestamp datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -243,28 +243,28 @@  discard block
 block discarded – undo
243 243
 					PRIMARY KEY  (PAY_ID),
244 244
 					KEY TXN_ID (TXN_ID),
245 245
 					KEY PAY_timestamp (PAY_timestamp)";
246
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
247
-        $table_name = "esp_ticket_price";
248
-        $sql = "TKP_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
246
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
247
+		$table_name = "esp_ticket_price";
248
+		$sql = "TKP_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
249 249
 					  TKT_ID int(10) unsigned NOT NULL,
250 250
 					  PRC_ID int(10) unsigned NOT NULL,
251 251
 					  PRIMARY KEY  (TKP_ID)";
252
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
253
-        $table_name = "esp_datetime_ticket";
254
-        $sql = "DTK_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
252
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
253
+		$table_name = "esp_datetime_ticket";
254
+		$sql = "DTK_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
255 255
 					  DTT_ID int(10) unsigned NOT NULL,
256 256
 					  TKT_ID int(10) unsigned NOT NULL,
257 257
 					  PRIMARY KEY  (DTK_ID)";
258
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
259
-        $table_name = "esp_ticket_template";
260
-        $sql = "TTM_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
258
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
259
+		$table_name = "esp_ticket_template";
260
+		$sql = "TTM_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
261 261
 					  TTM_name varchar(45) NOT NULL,
262 262
 					  TTM_description text,
263 263
 					  TTM_file varchar(45),
264 264
 					  PRIMARY KEY  (TTM_ID)";
265
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
266
-        $table_name = 'esp_question';
267
-        $sql = 'QST_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
265
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
266
+		$table_name = 'esp_question';
267
+		$sql = 'QST_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
268 268
 					QST_display_text text NOT NULL,
269 269
 					QST_admin_label varchar(255) NOT NULL,
270 270
 					QST_system varchar(25) DEFAULT NULL,
@@ -276,25 +276,25 @@  discard block
 block discarded – undo
276 276
 					QST_wp_user bigint(20) unsigned NULL,
277 277
 					QST_deleted tinyint(1) unsigned NOT NULL DEFAULT 0,
278 278
 					PRIMARY KEY  (QST_ID)';
279
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
280
-        $table_name = 'esp_question_group_question';
281
-        $sql = "QGQ_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
279
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
280
+		$table_name = 'esp_question_group_question';
281
+		$sql = "QGQ_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
282 282
 					QSG_ID int(10) unsigned NOT NULL,
283 283
 					QST_ID int(10) unsigned NOT NULL,
284 284
 					QGQ_order int(10) unsigned NOT NULL DEFAULT 0,
285 285
 					PRIMARY KEY  (QGQ_ID) ";
286
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
287
-        $table_name = 'esp_question_option';
288
-        $sql = "QSO_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
286
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
287
+		$table_name = 'esp_question_option';
288
+		$sql = "QSO_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
289 289
 					QSO_value varchar(255) NOT NULL,
290 290
 					QSO_desc text NOT NULL,
291 291
 					QST_ID int(10) unsigned NOT NULL,
292 292
 					QSO_order int(10) unsigned NOT NULL DEFAULT 0,
293 293
 					QSO_deleted tinyint(1) unsigned NOT NULL DEFAULT 0,
294 294
 					PRIMARY KEY  (QSO_ID)";
295
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
296
-        $table_name = 'esp_registration';
297
-        $sql = "REG_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
295
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
296
+		$table_name = 'esp_registration';
297
+		$sql = "REG_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
298 298
 					  EVT_ID bigint(20) unsigned NOT NULL,
299 299
 					  ATT_ID bigint(20) unsigned NOT NULL,
300 300
 					  TXN_ID int(10) unsigned NOT NULL,
@@ -317,25 +317,25 @@  discard block
 block discarded – undo
317 317
 					  KEY STS_ID (STS_ID),
318 318
 					  KEY REG_url_link (REG_url_link),
319 319
 					  KEY REG_code (REG_code)";
320
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
321
-        $table_name = 'esp_checkin';
322
-        $sql = "CHK_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
320
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
321
+		$table_name = 'esp_checkin';
322
+		$sql = "CHK_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
323 323
 					REG_ID int(10) unsigned NOT NULL,
324 324
 					DTT_ID int(10) unsigned NOT NULL,
325 325
 					CHK_in tinyint(1) unsigned NOT NULL DEFAULT 1,
326 326
 					CHK_timestamp datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
327 327
 					PRIMARY KEY  (CHK_ID)";
328
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
329
-        $table_name = 'esp_state';
330
-        $sql = "STA_ID smallint(5) unsigned NOT NULL AUTO_INCREMENT,
328
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
329
+		$table_name = 'esp_state';
330
+		$sql = "STA_ID smallint(5) unsigned NOT NULL AUTO_INCREMENT,
331 331
 					  CNT_ISO varchar(2) COLLATE utf8_bin NOT NULL,
332 332
 					  STA_abbrev varchar(6) COLLATE utf8_bin NOT NULL,
333 333
 					  STA_name varchar(100) COLLATE utf8_bin NOT NULL,
334 334
 					  STA_active tinyint(1) DEFAULT '1',
335 335
 					  PRIMARY KEY  (STA_ID)";
336
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
337
-        $table_name = 'esp_status';
338
-        $sql = "STS_ID varchar(3) COLLATE utf8_bin NOT NULL,
336
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
337
+		$table_name = 'esp_status';
338
+		$sql = "STS_ID varchar(3) COLLATE utf8_bin NOT NULL,
339 339
 					  STS_code varchar(45) COLLATE utf8_bin NOT NULL,
340 340
 					  STS_type set('event','registration','transaction','payment','email') COLLATE utf8_bin NOT NULL,
341 341
 					  STS_can_edit tinyint(1) NOT NULL DEFAULT 0,
@@ -343,9 +343,9 @@  discard block
 block discarded – undo
343 343
 					  STS_open tinyint(1) NOT NULL DEFAULT 1,
344 344
 					  UNIQUE KEY STS_ID_UNIQUE (STS_ID),
345 345
 					  KEY STS_type (STS_type)";
346
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
347
-        $table_name = 'esp_transaction';
348
-        $sql = "TXN_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
346
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
347
+		$table_name = 'esp_transaction';
348
+		$sql = "TXN_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
349 349
 					  TXN_timestamp datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
350 350
 					  TXN_total decimal(10,3) DEFAULT '0.00',
351 351
 					  TXN_paid decimal(10,3) NOT NULL DEFAULT '0.00',
@@ -356,9 +356,9 @@  discard block
 block discarded – undo
356 356
 					  PRIMARY KEY  (TXN_ID),
357 357
 					  KEY TXN_timestamp (TXN_timestamp),
358 358
 					  KEY STS_ID (STS_ID)";
359
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
360
-        $table_name = 'esp_venue_meta';
361
-        $sql = "VNUM_ID int(11) NOT NULL AUTO_INCREMENT,
359
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
360
+		$table_name = 'esp_venue_meta';
361
+		$sql = "VNUM_ID int(11) NOT NULL AUTO_INCREMENT,
362 362
 			VNU_ID bigint(20) unsigned NOT NULL DEFAULT 0,
363 363
 			VNU_address varchar(255) DEFAULT NULL,
364 364
 			VNU_address2 varchar(255) DEFAULT NULL,
@@ -376,10 +376,10 @@  discard block
 block discarded – undo
376 376
 			PRIMARY KEY  (VNUM_ID),
377 377
 			KEY STA_ID (STA_ID),
378 378
 			KEY CNT_ISO (CNT_ISO)";
379
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
380
-        // modified tables
381
-        $table_name = "esp_price";
382
-        $sql = "PRC_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
379
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
380
+		// modified tables
381
+		$table_name = "esp_price";
382
+		$sql = "PRC_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
383 383
 					  PRT_ID tinyint(3) unsigned NOT NULL,
384 384
 					  PRC_amount decimal(10,3) NOT NULL DEFAULT '0.00',
385 385
 					  PRC_name varchar(245) NOT NULL,
@@ -391,9 +391,9 @@  discard block
 block discarded – undo
391 391
 					  PRC_wp_user bigint(20) unsigned NULL,
392 392
 					  PRC_parent int(10) unsigned DEFAULT 0,
393 393
 					  PRIMARY KEY  (PRC_ID)";
394
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
395
-        $table_name = "esp_price_type";
396
-        $sql = "PRT_ID tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
394
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
395
+		$table_name = "esp_price_type";
396
+		$sql = "PRT_ID tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
397 397
 				  PRT_name varchar(45) NOT NULL,
398 398
 				  PBT_ID tinyint(3) unsigned NOT NULL DEFAULT '1',
399 399
 				  PRT_is_percent tinyint(1) NOT NULL DEFAULT '0',
@@ -402,9 +402,9 @@  discard block
 block discarded – undo
402 402
 				  PRT_deleted tinyint(1) NOT NULL DEFAULT '0',
403 403
 				  UNIQUE KEY PRT_name_UNIQUE (PRT_name),
404 404
 				  PRIMARY KEY  (PRT_ID)";
405
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
406
-        $table_name = "esp_ticket";
407
-        $sql = "TKT_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
405
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB ');
406
+		$table_name = "esp_ticket";
407
+		$sql = "TKT_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
408 408
 					  TTM_ID int(10) unsigned NOT NULL,
409 409
 					  TKT_name varchar(245) NOT NULL DEFAULT '',
410 410
 					  TKT_description text NOT NULL,
@@ -425,10 +425,10 @@  discard block
 block discarded – undo
425 425
 					  TKT_parent int(10) unsigned DEFAULT '0',
426 426
 					  TKT_deleted tinyint(1) NOT NULL DEFAULT '0',
427 427
 					  PRIMARY KEY  (TKT_ID)";
428
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
429
-        $this->_get_table_manager()->dropIndex('esp_question_group', 'QSG_identifier_UNIQUE');
430
-        $table_name = 'esp_question_group';
431
-        $sql = 'QSG_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
428
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
429
+		$this->_get_table_manager()->dropIndex('esp_question_group', 'QSG_identifier_UNIQUE');
430
+		$table_name = 'esp_question_group';
431
+		$sql = 'QSG_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
432 432
 					QSG_name varchar(255) NOT NULL,
433 433
 					QSG_identifier varchar(100) NOT NULL,
434 434
 					QSG_desc text NULL,
@@ -440,133 +440,133 @@  discard block
 block discarded – undo
440 440
 					QSG_wp_user bigint(20) unsigned NULL,
441 441
 					PRIMARY KEY  (QSG_ID),
442 442
 					UNIQUE KEY QSG_identifier_UNIQUE (QSG_identifier ASC)';
443
-        $this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
444
-        $script_4_1_defaults = EE_Registry::instance()->load_dms('Core_4_1_0');
445
-        // (because many need to convert old string states to foreign keys into the states table)
446
-        $script_4_1_defaults->insert_default_states();
447
-        $script_4_1_defaults->insert_default_countries();
448
-        // schema on price, price_types and tickets has changed so use the DEFAULT method in here instead of 4.1's and later.
449
-        $this->insert_default_price_types();
450
-        $this->insert_default_prices();
451
-        $this->insert_default_tickets();
452
-        // setting up the config wp option pretty well counts as a 'schema change', or at least should happen ehre
453
-        EE_Config::instance()->update_espresso_config(false, true);
454
-        return true;
455
-    }
443
+		$this->_table_should_exist_previously($table_name, $sql, 'ENGINE=InnoDB');
444
+		$script_4_1_defaults = EE_Registry::instance()->load_dms('Core_4_1_0');
445
+		// (because many need to convert old string states to foreign keys into the states table)
446
+		$script_4_1_defaults->insert_default_states();
447
+		$script_4_1_defaults->insert_default_countries();
448
+		// schema on price, price_types and tickets has changed so use the DEFAULT method in here instead of 4.1's and later.
449
+		$this->insert_default_price_types();
450
+		$this->insert_default_prices();
451
+		$this->insert_default_tickets();
452
+		// setting up the config wp option pretty well counts as a 'schema change', or at least should happen ehre
453
+		EE_Config::instance()->update_espresso_config(false, true);
454
+		return true;
455
+	}
456 456
 
457 457
 
458 458
 
459
-    /**
460
-     * @return boolean
461
-     */
462
-    public function schema_changes_after_migration()
463
-    {
464
-        return true;
465
-    }
459
+	/**
460
+	 * @return boolean
461
+	 */
462
+	public function schema_changes_after_migration()
463
+	{
464
+		return true;
465
+	}
466 466
 
467 467
 
468 468
 
469
-    public function migration_page_hooks()
470
-    {
471
-    }
469
+	public function migration_page_hooks()
470
+	{
471
+	}
472 472
 
473 473
 
474 474
 
475
-    /**
476
-     * insert_default_price_types
477
-     *
478
-     * @since 4.5.0
479
-     * @return void
480
-     */
481
-    public function insert_default_price_types()
482
-    {
483
-        global $wpdb;
484
-        $price_type_table = $wpdb->prefix . "esp_price_type";
485
-        if ($this->_get_table_analysis()->tableExists($price_type_table)) {
486
-            $SQL = 'SELECT COUNT(PRT_ID) FROM ' . $price_type_table;
487
-            $price_types_exist = $wpdb->get_var($SQL);
488
-            if (! $price_types_exist) {
489
-                $user_id = EEH_Activation::get_default_creator_id();
490
-                $SQL = "INSERT INTO $price_type_table ( PRT_ID, PRT_name, PBT_ID, PRT_is_percent, PRT_order, PRT_wp_user, PRT_deleted ) VALUES
475
+	/**
476
+	 * insert_default_price_types
477
+	 *
478
+	 * @since 4.5.0
479
+	 * @return void
480
+	 */
481
+	public function insert_default_price_types()
482
+	{
483
+		global $wpdb;
484
+		$price_type_table = $wpdb->prefix . "esp_price_type";
485
+		if ($this->_get_table_analysis()->tableExists($price_type_table)) {
486
+			$SQL = 'SELECT COUNT(PRT_ID) FROM ' . $price_type_table;
487
+			$price_types_exist = $wpdb->get_var($SQL);
488
+			if (! $price_types_exist) {
489
+				$user_id = EEH_Activation::get_default_creator_id();
490
+				$SQL = "INSERT INTO $price_type_table ( PRT_ID, PRT_name, PBT_ID, PRT_is_percent, PRT_order, PRT_wp_user, PRT_deleted ) VALUES
491 491
 							(1, '" . esc_html__('Base Price', 'event_espresso') . "', 1,  0, 0, $user_id, 0),
492 492
 							(2, '" . esc_html__('Percent Discount', 'event_espresso') . "', 2,  1, 20, $user_id, 0),
493 493
 							(3, '" . esc_html__('Dollar Discount', 'event_espresso') . "', 2,  0, 30, $user_id, 0),
494 494
 							(4, '" . esc_html__('Percent Surcharge', 'event_espresso') . "', 3,  1, 40, $user_id,  0),
495 495
 							(5, '" . esc_html__('Dollar Surcharge', 'event_espresso') . "', 3,  0, 50, $user_id, 0);";
496
-                $SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_price_types__SQL', $SQL);
497
-                $wpdb->query($SQL);
498
-            }
499
-        }
500
-    }
496
+				$SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_price_types__SQL', $SQL);
497
+				$wpdb->query($SQL);
498
+			}
499
+		}
500
+	}
501 501
 
502 502
 
503 503
 
504
-    /**
505
-     * insert DEFAULT prices.
506
-     *  If we're INSTALLING 4.x CAF, then we add a few extra DEFAULT prices
507
-     * when EEH_Activaion's initialize_db_content is called via  ahook in
508
-     * EE_Brewing_regular
509
-     *
510
-     * @since 4.5.0
511
-     * @return void
512
-     */
513
-    public function insert_default_prices()
514
-    {
515
-        global $wpdb;
516
-        $price_table = $wpdb->prefix . "esp_price";
517
-        if ($this->_get_table_analysis()->tableExists($price_table)) {
518
-            $SQL = 'SELECT COUNT(PRC_ID) FROM ' . $price_table;
519
-            $prices_exist = $wpdb->get_var($SQL);
520
-            if (! $prices_exist) {
521
-                $user_id = EEH_Activation::get_default_creator_id();
522
-                $SQL = "INSERT INTO $price_table
504
+	/**
505
+	 * insert DEFAULT prices.
506
+	 *  If we're INSTALLING 4.x CAF, then we add a few extra DEFAULT prices
507
+	 * when EEH_Activaion's initialize_db_content is called via  ahook in
508
+	 * EE_Brewing_regular
509
+	 *
510
+	 * @since 4.5.0
511
+	 * @return void
512
+	 */
513
+	public function insert_default_prices()
514
+	{
515
+		global $wpdb;
516
+		$price_table = $wpdb->prefix . "esp_price";
517
+		if ($this->_get_table_analysis()->tableExists($price_table)) {
518
+			$SQL = 'SELECT COUNT(PRC_ID) FROM ' . $price_table;
519
+			$prices_exist = $wpdb->get_var($SQL);
520
+			if (! $prices_exist) {
521
+				$user_id = EEH_Activation::get_default_creator_id();
522
+				$SQL = "INSERT INTO $price_table
523 523
 							(PRC_ID, PRT_ID, PRC_amount, PRC_name, PRC_desc,  PRC_is_default, PRC_overrides, PRC_wp_user, PRC_order, PRC_deleted, PRC_parent ) VALUES
524 524
 							(1, 1, '0.00', 'Free Admission', '', 1, NULL, $user_id, 0, 0, 0);";
525
-                $SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_prices__SQL', $SQL);
526
-                $wpdb->query($SQL);
527
-            }
528
-        }
529
-    }
525
+				$SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_prices__SQL', $SQL);
526
+				$wpdb->query($SQL);
527
+			}
528
+		}
529
+	}
530 530
 
531 531
 
532 532
 
533
-    /**
534
-     * insert DEFAULT ticket
535
-     * Almost identical to EE_DMS_Core_4_3_0::insert_default_tickets, except is aware of the TKT_wp_user field
536
-     *
537
-     * @since 4.5.0
538
-     * @return void
539
-     */
540
-    public function insert_default_tickets()
541
-    {
542
-        global $wpdb;
543
-        $ticket_table = $wpdb->prefix . "esp_ticket";
544
-        if ($this->_get_table_analysis()->tableExists($ticket_table)) {
545
-            $SQL = 'SELECT COUNT(TKT_ID) FROM ' . $ticket_table;
546
-            $tickets_exist = $wpdb->get_var($SQL);
547
-            if (! $tickets_exist) {
548
-                $user_id = EEH_Activation::get_default_creator_id();
549
-                $SQL = "INSERT INTO $ticket_table
533
+	/**
534
+	 * insert DEFAULT ticket
535
+	 * Almost identical to EE_DMS_Core_4_3_0::insert_default_tickets, except is aware of the TKT_wp_user field
536
+	 *
537
+	 * @since 4.5.0
538
+	 * @return void
539
+	 */
540
+	public function insert_default_tickets()
541
+	{
542
+		global $wpdb;
543
+		$ticket_table = $wpdb->prefix . "esp_ticket";
544
+		if ($this->_get_table_analysis()->tableExists($ticket_table)) {
545
+			$SQL = 'SELECT COUNT(TKT_ID) FROM ' . $ticket_table;
546
+			$tickets_exist = $wpdb->get_var($SQL);
547
+			if (! $tickets_exist) {
548
+				$user_id = EEH_Activation::get_default_creator_id();
549
+				$SQL = "INSERT INTO $ticket_table
550 550
 					( TKT_ID, TTM_ID, TKT_name, TKT_description, TKT_qty, TKT_sold, TKT_uses, TKT_required, TKT_min, TKT_max, TKT_price, TKT_start_date, TKT_end_date, TKT_taxable, TKT_order, TKT_row, TKT_is_default, TKT_parent, TKT_wp_user, TKT_deleted ) VALUES
551 551
 					( 1, 0, '"
552
-                       . esc_html__("Free Ticket", "event_espresso")
553
-                       . "', '', 100, 0, -1, 0, 0, -1, 0.00, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 1, 1, 0, $user_id, 0);";
554
-                $SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_tickets__SQL', $SQL);
555
-                $wpdb->query($SQL);
556
-            }
557
-        }
558
-        $ticket_price_table = $wpdb->prefix . "esp_ticket_price";
559
-        if ($this->_get_table_analysis()->tableExists($ticket_price_table)) {
560
-            $SQL = 'SELECT COUNT(TKP_ID) FROM ' . $ticket_price_table;
561
-            $ticket_prc_exist = $wpdb->get_var($SQL);
562
-            if (! $ticket_prc_exist) {
563
-                $SQL = "INSERT INTO $ticket_price_table
552
+					   . esc_html__("Free Ticket", "event_espresso")
553
+					   . "', '', 100, 0, -1, 0, 0, -1, 0.00, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 0, 1, 1, 0, $user_id, 0);";
554
+				$SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_tickets__SQL', $SQL);
555
+				$wpdb->query($SQL);
556
+			}
557
+		}
558
+		$ticket_price_table = $wpdb->prefix . "esp_ticket_price";
559
+		if ($this->_get_table_analysis()->tableExists($ticket_price_table)) {
560
+			$SQL = 'SELECT COUNT(TKP_ID) FROM ' . $ticket_price_table;
561
+			$ticket_prc_exist = $wpdb->get_var($SQL);
562
+			if (! $ticket_prc_exist) {
563
+				$SQL = "INSERT INTO $ticket_price_table
564 564
 				( TKP_ID, TKT_ID, PRC_ID ) VALUES
565 565
 				( 1, 1, 1 )
566 566
 				";
567
-                $SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_tickets__SQL__ticket_price', $SQL);
568
-                $wpdb->query($SQL);
569
-            }
570
-        }
571
-    }
567
+				$SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_tickets__SQL__ticket_price', $SQL);
568
+				$wpdb->query($SQL);
569
+			}
570
+		}
571
+	}
572 572
 }
Please login to merge, or discard this patch.
Spacing   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -15,12 +15,12 @@  discard block
 block discarded – undo
15 15
 // unfortunately, this needs to be done upon INCLUSION of this file,
16 16
 // instead of construction, because it only gets constructed on first page load
17 17
 // (all other times it gets resurrected from a wordpress option)
18
-$stages = glob(EE_CORE . 'data_migration_scripts/4_5_0_stages/*');
18
+$stages = glob(EE_CORE.'data_migration_scripts/4_5_0_stages/*');
19 19
 $class_to_filepath = array();
20 20
 foreach ($stages as $filepath) {
21 21
     $matches = array();
22 22
     preg_match('~4_5_0_stages/(.*).dmsstage.php~', $filepath, $matches);
23
-    $class_to_filepath[ $matches[1] ] = $filepath;
23
+    $class_to_filepath[$matches[1]] = $filepath;
24 24
 }
25 25
 // give addons a chance to autoload their stages too
26 26
 $class_to_filepath = apply_filters('FHEE__EE_DMS_4_5_0__autoloaded_stages', $class_to_filepath);
@@ -61,10 +61,10 @@  discard block
 block discarded – undo
61 61
         if (version_compare($version_string, '4.5.0.decaf', '<') && version_compare($version_string, '4.3.0.decaf', '>=')) {
62 62
 //          echo "$version_string can be migrated from";
63 63
             return true;
64
-        } elseif (! $version_string) {
64
+        } elseif ( ! $version_string) {
65 65
 //          echo "no version string provided: $version_string";
66 66
             // no version string provided... this must be pre 4.3
67
-            return false;// changed mind. dont want people thinking they should migrate yet because they cant
67
+            return false; // changed mind. dont want people thinking they should migrate yet because they cant
68 68
         } else {
69 69
 //          echo "$version_string doesnt apply";
70 70
             return false;
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
     public function schema_changes_before_migration()
77 77
     {
78 78
         // relies on 4.1's EEH_Activation::create_table
79
-        require_once(EE_HELPERS . 'EEH_Activation.helper.php');
79
+        require_once(EE_HELPERS.'EEH_Activation.helper.php');
80 80
         $table_name = 'esp_answer';
81 81
         $sql = "ANS_ID int(10) unsigned NOT NULL AUTO_INCREMENT,
82 82
 					REG_ID int(10) unsigned NOT NULL,
@@ -481,18 +481,18 @@  discard block
 block discarded – undo
481 481
     public function insert_default_price_types()
482 482
     {
483 483
         global $wpdb;
484
-        $price_type_table = $wpdb->prefix . "esp_price_type";
484
+        $price_type_table = $wpdb->prefix."esp_price_type";
485 485
         if ($this->_get_table_analysis()->tableExists($price_type_table)) {
486
-            $SQL = 'SELECT COUNT(PRT_ID) FROM ' . $price_type_table;
486
+            $SQL = 'SELECT COUNT(PRT_ID) FROM '.$price_type_table;
487 487
             $price_types_exist = $wpdb->get_var($SQL);
488
-            if (! $price_types_exist) {
488
+            if ( ! $price_types_exist) {
489 489
                 $user_id = EEH_Activation::get_default_creator_id();
490 490
                 $SQL = "INSERT INTO $price_type_table ( PRT_ID, PRT_name, PBT_ID, PRT_is_percent, PRT_order, PRT_wp_user, PRT_deleted ) VALUES
491
-							(1, '" . esc_html__('Base Price', 'event_espresso') . "', 1,  0, 0, $user_id, 0),
492
-							(2, '" . esc_html__('Percent Discount', 'event_espresso') . "', 2,  1, 20, $user_id, 0),
493
-							(3, '" . esc_html__('Dollar Discount', 'event_espresso') . "', 2,  0, 30, $user_id, 0),
494
-							(4, '" . esc_html__('Percent Surcharge', 'event_espresso') . "', 3,  1, 40, $user_id,  0),
495
-							(5, '" . esc_html__('Dollar Surcharge', 'event_espresso') . "', 3,  0, 50, $user_id, 0);";
491
+							(1, '".esc_html__('Base Price', 'event_espresso')."', 1,  0, 0, $user_id, 0),
492
+							(2, '".esc_html__('Percent Discount', 'event_espresso')."', 2,  1, 20, $user_id, 0),
493
+							(3, '".esc_html__('Dollar Discount', 'event_espresso')."', 2,  0, 30, $user_id, 0),
494
+							(4, '".esc_html__('Percent Surcharge', 'event_espresso')."', 3,  1, 40, $user_id,  0),
495
+							(5, '".esc_html__('Dollar Surcharge', 'event_espresso')."', 3,  0, 50, $user_id, 0);";
496 496
                 $SQL = apply_filters('FHEE__EE_DMS_4_5_0__insert_default_price_types__SQL', $SQL);
497 497
                 $wpdb->query($SQL);
498 498
             }
@@ -513,11 +513,11 @@  discard block
 block discarded – undo
513 513
     public function insert_default_prices()
514 514
     {
515 515
         global $wpdb;
516
-        $price_table = $wpdb->prefix . "esp_price";
516
+        $price_table = $wpdb->prefix."esp_price";
517 517
         if ($this->_get_table_analysis()->tableExists($price_table)) {
518
-            $SQL = 'SELECT COUNT(PRC_ID) FROM ' . $price_table;
518
+            $SQL = 'SELECT COUNT(PRC_ID) FROM '.$price_table;
519 519
             $prices_exist = $wpdb->get_var($SQL);
520
-            if (! $prices_exist) {
520
+            if ( ! $prices_exist) {
521 521
                 $user_id = EEH_Activation::get_default_creator_id();
522 522
                 $SQL = "INSERT INTO $price_table
523 523
 							(PRC_ID, PRT_ID, PRC_amount, PRC_name, PRC_desc,  PRC_is_default, PRC_overrides, PRC_wp_user, PRC_order, PRC_deleted, PRC_parent ) VALUES
@@ -540,11 +540,11 @@  discard block
 block discarded – undo
540 540
     public function insert_default_tickets()
541 541
     {
542 542
         global $wpdb;
543
-        $ticket_table = $wpdb->prefix . "esp_ticket";
543
+        $ticket_table = $wpdb->prefix."esp_ticket";
544 544
         if ($this->_get_table_analysis()->tableExists($ticket_table)) {
545
-            $SQL = 'SELECT COUNT(TKT_ID) FROM ' . $ticket_table;
545
+            $SQL = 'SELECT COUNT(TKT_ID) FROM '.$ticket_table;
546 546
             $tickets_exist = $wpdb->get_var($SQL);
547
-            if (! $tickets_exist) {
547
+            if ( ! $tickets_exist) {
548 548
                 $user_id = EEH_Activation::get_default_creator_id();
549 549
                 $SQL = "INSERT INTO $ticket_table
550 550
 					( TKT_ID, TTM_ID, TKT_name, TKT_description, TKT_qty, TKT_sold, TKT_uses, TKT_required, TKT_min, TKT_max, TKT_price, TKT_start_date, TKT_end_date, TKT_taxable, TKT_order, TKT_row, TKT_is_default, TKT_parent, TKT_wp_user, TKT_deleted ) VALUES
@@ -555,11 +555,11 @@  discard block
 block discarded – undo
555 555
                 $wpdb->query($SQL);
556 556
             }
557 557
         }
558
-        $ticket_price_table = $wpdb->prefix . "esp_ticket_price";
558
+        $ticket_price_table = $wpdb->prefix."esp_ticket_price";
559 559
         if ($this->_get_table_analysis()->tableExists($ticket_price_table)) {
560
-            $SQL = 'SELECT COUNT(TKP_ID) FROM ' . $ticket_price_table;
560
+            $SQL = 'SELECT COUNT(TKP_ID) FROM '.$ticket_price_table;
561 561
             $ticket_prc_exist = $wpdb->get_var($SQL);
562
-            if (! $ticket_prc_exist) {
562
+            if ( ! $ticket_prc_exist) {
563 563
                 $SQL = "INSERT INTO $ticket_price_table
564 564
 				( TKP_ID, TKT_ID, PRC_ID ) VALUES
565 565
 				( 1, 1, 1 )
Please login to merge, or discard this patch.
4_9_0_stages/EE_DMS_4_9_0_Email_System_Question.dmsstage.php 2 patches
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -14,48 +14,48 @@
 block discarded – undo
14 14
 
15 15
 
16 16
 
17
-    /**
18
-     * Just initializes the status of the migration
19
-     *
20
-     * @return EE_DMS_4_9_0_Email_System_Question
21
-     */
22
-    public function __construct()
23
-    {
24
-        global $wpdb;
25
-        $this->_pretty_name = esc_html__('Email - System Question', 'event_espresso');
26
-        $this->_old_table = $wpdb->prefix . 'esp_question';
27
-        $this->_extra_where_sql = "WHERE QST_system = 'email'";
28
-        parent::__construct();
29
-    }
17
+	/**
18
+	 * Just initializes the status of the migration
19
+	 *
20
+	 * @return EE_DMS_4_9_0_Email_System_Question
21
+	 */
22
+	public function __construct()
23
+	{
24
+		global $wpdb;
25
+		$this->_pretty_name = esc_html__('Email - System Question', 'event_espresso');
26
+		$this->_old_table = $wpdb->prefix . 'esp_question';
27
+		$this->_extra_where_sql = "WHERE QST_system = 'email'";
28
+		parent::__construct();
29
+	}
30 30
 
31 31
 
32 32
 
33
-    /**
34
-     * updates the question with the new question type
35
-     * @param array $question an associative array where keys are column names and values are their values.
36
-     * @return null
37
-     */
38
-    protected function _migrate_old_row($question)
39
-    {
40
-        if ($question['QST_ID'] && $question['QST_system'] == 'email') {
41
-            global $wpdb;
42
-            $success = $wpdb->update(
43
-                $this->_old_table,
44
-                array( 'QST_type' => 'EMAIL' ),  // data
45
-                array( 'QST_ID' => $question['QST_ID'] ),  // where
46
-                array( '%s' ),   // data format
47
-                array( '%d' )  // where format
48
-            );
49
-            if (! $success) {
50
-                $this->add_error(
51
-                    sprintf(
52
-                        esc_html__('Could not update question system name "%1$s" for question ID=%2$d because "%3$s"', 'event_espresso'),
53
-                        wp_json_encode($question['QST_system']),
54
-                        $question['QST_ID'],
55
-                        $wpdb->last_error
56
-                    )
57
-                );
58
-            }
59
-        }
60
-    }
33
+	/**
34
+	 * updates the question with the new question type
35
+	 * @param array $question an associative array where keys are column names and values are their values.
36
+	 * @return null
37
+	 */
38
+	protected function _migrate_old_row($question)
39
+	{
40
+		if ($question['QST_ID'] && $question['QST_system'] == 'email') {
41
+			global $wpdb;
42
+			$success = $wpdb->update(
43
+				$this->_old_table,
44
+				array( 'QST_type' => 'EMAIL' ),  // data
45
+				array( 'QST_ID' => $question['QST_ID'] ),  // where
46
+				array( '%s' ),   // data format
47
+				array( '%d' )  // where format
48
+			);
49
+			if (! $success) {
50
+				$this->add_error(
51
+					sprintf(
52
+						esc_html__('Could not update question system name "%1$s" for question ID=%2$d because "%3$s"', 'event_espresso'),
53
+						wp_json_encode($question['QST_system']),
54
+						$question['QST_ID'],
55
+						$wpdb->last_error
56
+					)
57
+				);
58
+			}
59
+		}
60
+	}
61 61
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@  discard block
 block discarded – undo
23 23
     {
24 24
         global $wpdb;
25 25
         $this->_pretty_name = esc_html__('Email - System Question', 'event_espresso');
26
-        $this->_old_table = $wpdb->prefix . 'esp_question';
26
+        $this->_old_table = $wpdb->prefix.'esp_question';
27 27
         $this->_extra_where_sql = "WHERE QST_system = 'email'";
28 28
         parent::__construct();
29 29
     }
@@ -41,12 +41,12 @@  discard block
 block discarded – undo
41 41
             global $wpdb;
42 42
             $success = $wpdb->update(
43 43
                 $this->_old_table,
44
-                array( 'QST_type' => 'EMAIL' ),  // data
45
-                array( 'QST_ID' => $question['QST_ID'] ),  // where
46
-                array( '%s' ),   // data format
47
-                array( '%d' )  // where format
44
+                array('QST_type' => 'EMAIL'), // data
45
+                array('QST_ID' => $question['QST_ID']), // where
46
+                array('%s'), // data format
47
+                array('%d')  // where format
48 48
             );
49
-            if (! $success) {
49
+            if ( ! $success) {
50 50
                 $this->add_error(
51 51
                     sprintf(
52 52
                         esc_html__('Could not update question system name "%1$s" for question ID=%2$d because "%3$s"', 'event_espresso'),
Please login to merge, or discard this patch.
core/db_classes/EE_Export.class.php 2 patches
Indentation   +777 added lines, -777 removed lines patch added patch discarded remove patch
@@ -16,781 +16,781 @@
 block discarded – undo
16 16
 class EE_Export
17 17
 {
18 18
 
19
-    const option_prefix = 'ee_report_job_';
20
-
21
-
22
-    // instance of the EE_Export object
23
-    private static $_instance = null;
24
-
25
-    // instance of the EE_CSV object
26
-    /**
27
-     *
28
-     * @var EE_CSV
29
-     */
30
-    public $EE_CSV = null;
31
-
32
-
33
-    private $_req_data = array();
34
-
35
-
36
-    /**
37
-     *        private constructor to prevent direct creation
38
-     *
39
-     * @Constructor
40
-     * @access private
41
-     * @param array $request_data
42
-     */
43
-    private function __construct($request_data = array())
44
-    {
45
-        $this->_req_data = $request_data;
46
-        $this->today = date("Y-m-d", time());
47
-        require_once(EE_CLASSES . 'EE_CSV.class.php');
48
-        $this->EE_CSV = EE_CSV::instance();
49
-    }
50
-
51
-
52
-    /**
53
-     *        @ singleton method used to instantiate class object
54
-     *        @ access public
55
-     *
56
-     * @param array $request_data
57
-     * @return \EE_Export
58
-     */
59
-    public static function instance($request_data = array())
60
-    {
61
-        // check if class object is instantiated
62
-        if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_Export)) {
63
-            self::$_instance = new self($request_data);
64
-        }
65
-        return self::$_instance;
66
-    }
67
-
68
-
69
-    /**
70
-     * @Export Event Espresso data - routes export requests
71
-     * @access public
72
-     * @return void | bool
73
-     */
74
-    public function export()
75
-    {
76
-        // in case of bulk exports, the "actual" action will be in action2, but first check regular action for "export" keyword
77
-        if (isset($this->_req_data['action']) && strpos($this->_req_data['action'], 'export') === false) {
78
-            // check if action2 has export action
79
-            if (isset($this->_req_data['action2']) && strpos($this->_req_data['action2'], 'export') !== false) {
80
-                // whoop! there it is!
81
-                $this->_req_data['action'] = $this->_req_data['action2'];
82
-            }
83
-        }
84
-
85
-        $this->_req_data['export'] = isset($this->_req_data['export']) ? $this->_req_data['export'] : '';
86
-
87
-        switch ($this->_req_data['export']) {
88
-            case 'report':
89
-                switch ($this->_req_data['action']) {
90
-                    case "event":
91
-                    case "export_events":
92
-                    case 'all_event_data':
93
-                        $this->export_all_event_data();
94
-                        break;
95
-
96
-                    case 'registrations_report_for_event':
97
-                        $this->report_registrations_for_event($this->_req_data['EVT_ID']);
98
-                        break;
99
-
100
-                    case 'attendees':
101
-                        $this->export_attendees();
102
-                        break;
103
-
104
-                    case 'categories':
105
-                        $this->export_categories();
106
-                        break;
107
-
108
-                    default:
109
-                        EE_Error::add_error(
110
-                            esc_html__('An error occurred! The requested export report could not be found.', 'event_espresso'),
111
-                            __FILE__,
112
-                            __FUNCTION__,
113
-                            __LINE__
114
-                        );
115
-                        return false;
116
-                        break;
117
-                }
118
-                break; // end of switch export : report
119
-            default:
120
-                break;
121
-        } // end of switch export
122
-
123
-        exit;
124
-    }
125
-
126
-    /**
127
-     * Downloads a CSV file with all the columns, but no data. This should be used for importing
128
-     *
129
-     * @return null kills execution
130
-     */
131
-    public function export_sample()
132
-    {
133
-        $event = EEM_Event::instance()->get_one();
134
-        $this->_req_data['EVT_ID'] = $event->ID();
135
-        $this->export_all_event_data();
136
-    }
137
-
138
-
139
-    /**
140
-     * @Export data for ALL events
141
-     * @access public
142
-     * @return void
143
-     */
144
-    public function export_all_event_data()
145
-    {
146
-        // are any Event IDs set?
147
-        $event_query_params = array();
148
-        $related_models_query_params = array();
149
-        $related_through_reg_query_params = array();
150
-        $datetime_ticket_query_params = array();
151
-        $price_query_params = array();
152
-        $price_type_query_params = array();
153
-        $term_query_params = array();
154
-        $state_country_query_params = array();
155
-        $question_group_query_params = array();
156
-        $question_query_params = array();
157
-        if (isset($this->_req_data['EVT_ID'])) {
158
-            // do we have an array of IDs ?
159
-
160
-            if (is_array($this->_req_data['EVT_ID'])) {
161
-                $EVT_IDs = array_map('sanitize_text_field', $this->_req_data['EVT_ID']);
162
-                $value_to_equal = array('IN', $EVT_IDs);
163
-                $filename = 'events';
164
-            } else {
165
-                // generate regular where = clause
166
-                $EVT_ID = absint($this->_req_data['EVT_ID']);
167
-                $value_to_equal = $EVT_ID;
168
-                $event = EE_Registry::instance()->load_model('Event')->get_one_by_ID($EVT_ID);
169
-
170
-                $filename = 'event-' . ($event instanceof EE_Event ? $event->slug() : esc_html__('unknown', 'event_espresso'));
171
-            }
172
-            $event_query_params[0]['EVT_ID'] = $value_to_equal;
173
-            $related_models_query_params[0]['Event.EVT_ID'] = $value_to_equal;
174
-            $related_through_reg_query_params[0]['Registration.EVT_ID'] = $value_to_equal;
175
-            $datetime_ticket_query_params[0]['Datetime.EVT_ID'] = $value_to_equal;
176
-            $price_query_params[0]['Ticket.Datetime.EVT_ID'] = $value_to_equal;
177
-            $price_type_query_params[0]['Price.Ticket.Datetime.EVT_ID'] = $value_to_equal;
178
-            $term_query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $value_to_equal;
179
-            $state_country_query_params[0]['Venue.Event.EVT_ID'] = $value_to_equal;
180
-            $question_group_query_params[0]['Event.EVT_ID'] = $value_to_equal;
181
-            $question_query_params[0]['Question_Group.Event.EVT_ID'] = $value_to_equal;
182
-        } else {
183
-            $filename = 'all-events';
184
-        }
185
-
186
-
187
-        // array in the format:  table name =>  query where clause
188
-        $models_to_export = array(
189
-            'Event'                   => $event_query_params,
190
-            'Datetime'                => $related_models_query_params,
191
-            'Ticket_Template'         => $price_query_params,
192
-            'Ticket'                  => $datetime_ticket_query_params,
193
-            'Datetime_Ticket'         => $datetime_ticket_query_params,
194
-            'Price_Type'              => $price_type_query_params,
195
-            'Price'                   => $price_query_params,
196
-            'Ticket_Price'            => $price_query_params,
197
-            'Term'                    => $term_query_params,
198
-            'Term_Taxonomy'           => $related_models_query_params,
199
-            'Term_Relationship'       => $related_models_query_params, // model has NO primary key...
200
-            'Country'                 => $state_country_query_params,
201
-            'State'                   => $state_country_query_params,
202
-            'Venue'                   => $related_models_query_params,
203
-            'Event_Venue'             => $related_models_query_params,
204
-            'Question_Group'          => $question_group_query_params,
205
-            'Event_Question_Group'    => $question_group_query_params,
206
-            'Question'                => $question_query_params,
207
-            'Question_Group_Question' => $question_query_params,
208
-            // 'Transaction'=>$related_through_reg_query_params,
209
-            // 'Registration'=>$related_models_query_params,
210
-            // 'Attendee'=>$related_through_reg_query_params,
211
-            // 'Line_Item'=>
212
-
213
-        );
214
-
215
-        $model_data = $this->_get_export_data_for_models($models_to_export);
216
-
217
-        $filename = $this->generate_filename($filename);
218
-
219
-        if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
220
-            EE_Error::add_error(
221
-                esc_html__(
222
-                    "'An error occurred and the Event details could not be exported from the database.'",
223
-                    "event_espresso"
224
-                ),
225
-                __FILE__,
226
-                __FUNCTION__,
227
-                __LINE__
228
-            );
229
-        }
230
-    }
231
-
232
-    public function report_attendees()
233
-    {
234
-        $attendee_rows = EEM_Attendee::instance()->get_all_wpdb_results(
235
-            array(
236
-                'force_join' => array('State', 'Country'),
237
-                'caps'       => EEM_Base::caps_read_admin,
238
-            )
239
-        );
240
-        $csv_data = array();
241
-        foreach ($attendee_rows as $attendee_row) {
242
-            $csv_row = array();
243
-            foreach (EEM_Attendee::instance()->field_settings() as $field_name => $field_obj) {
244
-                if ($field_name == 'STA_ID') {
245
-                    $state_name_field = EEM_State::instance()->field_settings_for('STA_name');
246
-                    $csv_row[ esc_html__('State', 'event_espresso') ] = $attendee_row[ $state_name_field->get_qualified_column(
247
-                    ) ];
248
-                } elseif ($field_name == 'CNT_ISO') {
249
-                    $country_name_field = EEM_Country::instance()->field_settings_for('CNT_name');
250
-                    $csv_row[ esc_html__(
251
-                        'Country',
252
-                        'event_espresso'
253
-                    ) ] = $attendee_row[ $country_name_field->get_qualified_column() ];
254
-                } else {
255
-                    $csv_row[ $field_obj->get_nicename() ] = $attendee_row[ $field_obj->get_qualified_column() ];
256
-                }
257
-            }
258
-            $csv_data[] = $csv_row;
259
-        }
260
-
261
-        $filename = $this->generate_filename('contact-list-report');
262
-
263
-        $handle = $this->EE_CSV->begin_sending_csv($filename);
264
-        $this->EE_CSV->write_data_array_to_csv($handle, $csv_data);
265
-        $this->EE_CSV->end_sending_csv($handle);
266
-    }
267
-
268
-
269
-    /**
270
-     * @Export data for ALL attendees
271
-     * @access public
272
-     * @return void
273
-     */
274
-    public function export_attendees()
275
-    {
276
-
277
-        $states_that_have_an_attendee = EEM_State::instance()->get_all(
278
-            array(0 => array('Attendee.ATT_ID' => array('IS NOT NULL')))
279
-        );
280
-        $countries_that_have_an_attendee = EEM_Country::instance()->get_all(
281
-            array(0 => array('Attendee.ATT_ID' => array('IS NOT NULL')))
282
-        );
283
-        // $states_to_export_query_params
284
-        $models_to_export = array(
285
-            'Country'  => array(array('CNT_ISO' => array('IN', array_keys($countries_that_have_an_attendee)))),
286
-            'State'    => array(array('STA_ID' => array('IN', array_keys($states_that_have_an_attendee)))),
287
-            'Attendee' => array(),
288
-        );
289
-
290
-
291
-        $model_data = $this->_get_export_data_for_models($models_to_export);
292
-        $filename = $this->generate_filename('all-attendees');
293
-
294
-        if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
295
-            EE_Error::add_error(
296
-                esc_html__(
297
-                    'An error occurred and the Attendee data could not be exported from the database.',
298
-                    'event_espresso'
299
-                ),
300
-                __FILE__,
301
-                __FUNCTION__,
302
-                __LINE__
303
-            );
304
-        }
305
-    }
306
-
307
-    /**
308
-     * Shortcut for preparing a database result for display
309
-     *
310
-     * @param EEM_Base       $model
311
-     * @param string         $field_name
312
-     * @param string         $raw_db_value
313
-     * @param boolean|string $pretty_schema true to display pretty, a string to use a specific "Schema", or false to
314
-     *                                      NOT display pretty
315
-     * @return string
316
-     */
317
-    protected function _prepare_value_from_db_for_display($model, $field_name, $raw_db_value, $pretty_schema = true)
318
-    {
319
-        $field_obj = $model->field_settings_for($field_name);
320
-        $value_on_model_obj = $field_obj->prepare_for_set_from_db($raw_db_value);
321
-        if ($field_obj instanceof EE_Datetime_Field) {
322
-            $field_obj->set_date_format(
323
-                EE_CSV::instance()->get_date_format_for_csv($field_obj->get_date_format($pretty_schema)),
324
-                $pretty_schema
325
-            );
326
-            $field_obj->set_time_format(
327
-                EE_CSV::instance()->get_time_format_for_csv($field_obj->get_time_format($pretty_schema)),
328
-                $pretty_schema
329
-            );
330
-        }
331
-        if ($pretty_schema === true) {
332
-            return $field_obj->prepare_for_pretty_echoing($value_on_model_obj);
333
-        } elseif (is_string($pretty_schema)) {
334
-            return $field_obj->prepare_for_pretty_echoing($value_on_model_obj, $pretty_schema);
335
-        } else {
336
-            return $field_obj->prepare_for_get($value_on_model_obj);
337
-        }
338
-    }
339
-
340
-    /**
341
-     * Export a custom CSV of registration info including: A bunch of the reg fields, the time of the event, the price
342
-     * name, and the questions associated with the registrations
343
-     *
344
-     * @param int $event_id
345
-     */
346
-    public function report_registrations_for_event($event_id = null)
347
-    {
348
-        $reg_fields_to_include = array(
349
-            'TXN_ID',
350
-            'ATT_ID',
351
-            'REG_ID',
352
-            'REG_date',
353
-            'REG_code',
354
-            'REG_count',
355
-            'REG_final_price',
356
-
357
-        );
358
-        $att_fields_to_include = array(
359
-            'ATT_fname',
360
-            'ATT_lname',
361
-            'ATT_email',
362
-            'ATT_address',
363
-            'ATT_address2',
364
-            'ATT_city',
365
-            'STA_ID',
366
-            'CNT_ISO',
367
-            'ATT_zip',
368
-            'ATT_phone',
369
-        );
370
-
371
-        $registrations_csv_ready_array = array();
372
-        $reg_model = EE_Registry::instance()->load_model('Registration');
373
-        $query_params = apply_filters(
374
-            'FHEE__EE_Export__report_registration_for_event',
375
-            array(
376
-                array(
377
-                    'OR'                 => array(
378
-                        // don't include registrations from failed or abandoned transactions...
379
-                        'Transaction.STS_ID' => array(
380
-                            'NOT IN',
381
-                            array(EEM_Transaction::failed_status_code, EEM_Transaction::abandoned_status_code),
382
-                        ),
383
-                        // unless the registration is approved, in which case include it regardless of transaction status
384
-                        'STS_ID'             => EEM_Registration::status_id_approved,
385
-                    ),
386
-                    'Ticket.TKT_deleted' => array('IN', array(true, false)),
387
-                ),
388
-                'order_by'   => array('Transaction.TXN_ID' => 'asc', 'REG_count' => 'asc'),
389
-                'force_join' => array('Transaction', 'Ticket', 'Attendee'),
390
-                'caps'       => EEM_Base::caps_read_admin,
391
-            ),
392
-            $event_id
393
-        );
394
-        if ($event_id) {
395
-            $query_params[0]['EVT_ID'] = $event_id;
396
-        } else {
397
-            $query_params['force_join'][] = 'Event';
398
-        }
399
-        $registration_rows = $reg_model->get_all_wpdb_results($query_params);
400
-        // get all questions which relate to someone in this group
401
-        $registration_ids = array();
402
-        foreach ($registration_rows as $reg_row) {
403
-            $registration_ids[] = intval($reg_row['Registration.REG_ID']);
404
-        }
405
-        // EEM_Question::instance()->show_next_x_db_queries();
406
-        $questions_for_these_regs_rows = EEM_Question::instance()->get_all_wpdb_results(
407
-            array(array('Answer.REG_ID' => array('IN', $registration_ids)))
408
-        );
409
-        foreach ($registration_rows as $reg_row) {
410
-            if (is_array($reg_row)) {
411
-                $reg_csv_array = array();
412
-                if (! $event_id) {
413
-                    // get the event's name and Id
414
-                    $reg_csv_array[ esc_html__('Event', 'event_espresso') ] = sprintf(
415
-                        esc_html__('%1$s (%2$s)', 'event_espresso'),
416
-                        $this->_prepare_value_from_db_for_display(
417
-                            EEM_Event::instance(),
418
-                            'EVT_name',
419
-                            $reg_row['Event_CPT.post_title']
420
-                        ),
421
-                        $reg_row['Event_CPT.ID']
422
-                    );
423
-                }
424
-                $is_primary_reg = $reg_row['Registration.REG_count'] == '1' ? true : false;
425
-                /*@var $reg_row EE_Registration */
426
-                foreach ($reg_fields_to_include as $field_name) {
427
-                    $field = $reg_model->field_settings_for($field_name);
428
-                    if ($field_name == 'REG_final_price') {
429
-                        $value = $this->_prepare_value_from_db_for_display(
430
-                            $reg_model,
431
-                            $field_name,
432
-                            $reg_row['Registration.REG_final_price'],
433
-                            'localized_float'
434
-                        );
435
-                    } elseif ($field_name == 'REG_count') {
436
-                        $value = sprintf(
437
-                            esc_html__('%s of %s', 'event_espresso'),
438
-                            $this->_prepare_value_from_db_for_display(
439
-                                $reg_model,
440
-                                'REG_count',
441
-                                $reg_row['Registration.REG_count']
442
-                            ),
443
-                            $this->_prepare_value_from_db_for_display(
444
-                                $reg_model,
445
-                                'REG_group_size',
446
-                                $reg_row['Registration.REG_group_size']
447
-                            )
448
-                        );
449
-                    } elseif ($field_name == 'REG_date') {
450
-                        $value = $this->_prepare_value_from_db_for_display(
451
-                            $reg_model,
452
-                            $field_name,
453
-                            $reg_row['Registration.REG_date'],
454
-                            'no_html'
455
-                        );
456
-                    } else {
457
-                        $value = $this->_prepare_value_from_db_for_display(
458
-                            $reg_model,
459
-                            $field_name,
460
-                            $reg_row[ $field->get_qualified_column() ]
461
-                        );
462
-                    }
463
-                    $reg_csv_array[ $this->_get_column_name_for_field($field) ] = $value;
464
-                    if ($field_name == 'REG_final_price') {
465
-                        // add a column named Currency after the final price
466
-                        $reg_csv_array[ esc_html__("Currency", "event_espresso") ] = EE_Config::instance()->currency->code;
467
-                    }
468
-                }
469
-                // get pretty status
470
-                $stati = EEM_Status::instance()->localized_status(
471
-                    array(
472
-                        $reg_row['Registration.STS_ID']     => esc_html__('unknown', 'event_espresso'),
473
-                        $reg_row['TransactionTable.STS_ID'] => esc_html__('unknown', 'event_espresso'),
474
-                    ),
475
-                    false,
476
-                    'sentence'
477
-                );
478
-                $reg_csv_array[ esc_html__(
479
-                    "Registration Status",
480
-                    'event_espresso'
481
-                ) ] = $stati[ $reg_row['Registration.STS_ID'] ];
482
-                // get pretty trnasaction status
483
-                $reg_csv_array[ esc_html__(
484
-                    "Transaction Status",
485
-                    'event_espresso'
486
-                ) ] = $stati[ $reg_row['TransactionTable.STS_ID'] ];
487
-                $reg_csv_array[ esc_html__('Transaction Amount Due', 'event_espresso') ] = $is_primary_reg
488
-                    ? $this->_prepare_value_from_db_for_display(
489
-                        EEM_Transaction::instance(),
490
-                        'TXN_total',
491
-                        $reg_row['TransactionTable.TXN_total'],
492
-                        'localized_float'
493
-                    ) : '0.00';
494
-                $reg_csv_array[ esc_html__('Amount Paid', 'event_espresso') ] = $is_primary_reg
495
-                    ? $this->_prepare_value_from_db_for_display(
496
-                        EEM_Transaction::instance(),
497
-                        'TXN_paid',
498
-                        $reg_row['TransactionTable.TXN_paid'],
499
-                        'localized_float'
500
-                    ) : '0.00';
501
-                $payment_methods = array();
502
-                $gateway_txn_ids_etc = array();
503
-                $payment_times = array();
504
-                if ($is_primary_reg && $reg_row['TransactionTable.TXN_ID']) {
505
-                    $payments_info = EEM_Payment::instance()->get_all_wpdb_results(
506
-                        array(
507
-                            array(
508
-                                'TXN_ID' => $reg_row['TransactionTable.TXN_ID'],
509
-                                'STS_ID' => EEM_Payment::status_id_approved,
510
-                            ),
511
-                            'force_join' => array('Payment_Method'),
512
-                        ),
513
-                        ARRAY_A,
514
-                        'Payment_Method.PMD_admin_name as name, Payment.PAY_txn_id_chq_nmbr as gateway_txn_id, Payment.PAY_timestamp as payment_time'
515
-                    );
516
-
517
-                    foreach ($payments_info as $payment_method_and_gateway_txn_id) {
518
-                        $payment_methods[] = isset($payment_method_and_gateway_txn_id['name'])
519
-                            ? $payment_method_and_gateway_txn_id['name'] : esc_html__('Unknown', 'event_espresso');
520
-                        $gateway_txn_ids_etc[] = isset($payment_method_and_gateway_txn_id['gateway_txn_id'])
521
-                            ? $payment_method_and_gateway_txn_id['gateway_txn_id'] : '';
522
-                        $payment_times[] = isset($payment_method_and_gateway_txn_id['payment_time'])
523
-                            ? $payment_method_and_gateway_txn_id['payment_time'] : '';
524
-                    }
525
-                }
526
-                $reg_csv_array[ esc_html__('Payment Date(s)', 'event_espresso') ] = implode(',', $payment_times);
527
-                $reg_csv_array[ esc_html__('Payment Method(s)', 'event_espresso') ] = implode(",", $payment_methods);
528
-                $reg_csv_array[ esc_html__('Gateway Transaction ID(s)', 'event_espresso') ] = implode(
529
-                    ',',
530
-                    $gateway_txn_ids_etc
531
-                );
532
-
533
-                // get whether or not the user has checked in
534
-                $reg_csv_array[ esc_html__("Check-Ins", "event_espresso") ] = $reg_model->count_related(
535
-                    $reg_row['Registration.REG_ID'],
536
-                    'Checkin'
537
-                );
538
-                // get ticket of registration and its price
539
-                $ticket_model = EE_Registry::instance()->load_model('Ticket');
540
-                if ($reg_row['Ticket.TKT_ID']) {
541
-                    $ticket_name = $this->_prepare_value_from_db_for_display(
542
-                        $ticket_model,
543
-                        'TKT_name',
544
-                        $reg_row['Ticket.TKT_name']
545
-                    );
546
-                    $datetimes_strings = array();
547
-                    foreach (
548
-                        EEM_Datetime::instance()->get_all_wpdb_results(
549
-                            array(
550
-                            array('Ticket.TKT_ID' => $reg_row['Ticket.TKT_ID']),
551
-                            'order_by'                 => array('DTT_EVT_start' => 'ASC'),
552
-                            'default_where_conditions' => 'none',
553
-                            )
554
-                        ) as $datetime
555
-                    ) {
556
-                        $datetimes_strings[] = $this->_prepare_value_from_db_for_display(
557
-                            EEM_Datetime::instance(),
558
-                            'DTT_EVT_start',
559
-                            $datetime['Datetime.DTT_EVT_start']
560
-                        );
561
-                    }
562
-                } else {
563
-                    $ticket_name = esc_html__('Unknown', 'event_espresso');
564
-                    $datetimes_strings = array(esc_html__('Unknown', 'event_espresso'));
565
-                }
566
-                $reg_csv_array[ $ticket_model->field_settings_for('TKT_name')->get_nicename() ] = $ticket_name;
567
-                $reg_csv_array[ esc_html__("Datetimes of Ticket", "event_espresso") ] = implode(", ", $datetimes_strings);
568
-                // get datetime(s) of registration
569
-
570
-                // add attendee columns
571
-                foreach ($att_fields_to_include as $att_field_name) {
572
-                    $field_obj = EEM_Attendee::instance()->field_settings_for($att_field_name);
573
-                    if ($reg_row['Attendee_CPT.ID']) {
574
-                        if ($att_field_name == 'STA_ID') {
575
-                            $value = EEM_State::instance()->get_var(
576
-                                array(array('STA_ID' => $reg_row['Attendee_Meta.STA_ID'])),
577
-                                'STA_name'
578
-                            );
579
-                        } elseif ($att_field_name == 'CNT_ISO') {
580
-                            $value = EEM_Country::instance()->get_var(
581
-                                array(array('CNT_ISO' => $reg_row['Attendee_Meta.CNT_ISO'])),
582
-                                'CNT_name'
583
-                            );
584
-                        } else {
585
-                            $value = $this->_prepare_value_from_db_for_display(
586
-                                EEM_Attendee::instance(),
587
-                                $att_field_name,
588
-                                $reg_row[ $field_obj->get_qualified_column() ]
589
-                            );
590
-                        }
591
-                    } else {
592
-                        $value = '';
593
-                    }
594
-
595
-                    $reg_csv_array[ $this->_get_column_name_for_field($field_obj) ] = $value;
596
-                }
597
-
598
-                // make sure each registration has the same questions in the same order
599
-                foreach ($questions_for_these_regs_rows as $question_row) {
600
-                    if (! isset($reg_csv_array[ $question_row['Question.QST_admin_label'] ])) {
601
-                        $reg_csv_array[ $question_row['Question.QST_admin_label'] ] = null;
602
-                    }
603
-                }
604
-                // now fill out the questions THEY answered
605
-                foreach (
606
-                    EEM_Answer::instance()->get_all_wpdb_results(
607
-                        array(array('REG_ID' => $reg_row['Registration.REG_ID']), 'force_join' => array('Question'))
608
-                    ) as $answer_row
609
-                ) {
610
-                    /* @var $answer EE_Answer */
611
-                    if ($answer_row['Question.QST_ID']) {
612
-                        $question_label = $this->_prepare_value_from_db_for_display(
613
-                            EEM_Question::instance(),
614
-                            'QST_admin_label',
615
-                            $answer_row['Question.QST_admin_label']
616
-                        );
617
-                    } else {
618
-                        $question_label = sprintf(esc_html__('Question $s', 'event_espresso'), $answer_row['Answer.QST_ID']);
619
-                    }
620
-                    if (isset($answer_row['Question.QST_type']) && $answer_row['Question.QST_type'] == EEM_Question::QST_type_state) {
621
-                        $reg_csv_array[ $question_label ] = EEM_State::instance()->get_state_name_by_ID(
622
-                            $answer_row['Answer.ANS_value']
623
-                        );
624
-                    } else {
625
-                        $reg_csv_array[ $question_label ] = $this->_prepare_value_from_db_for_display(
626
-                            EEM_Answer::instance(),
627
-                            'ANS_value',
628
-                            $answer_row['Answer.ANS_value']
629
-                        );
630
-                    }
631
-                }
632
-                $registrations_csv_ready_array[] = apply_filters(
633
-                    'FHEE__EE_Export__report_registrations__reg_csv_array',
634
-                    $reg_csv_array,
635
-                    $reg_row
636
-                );
637
-            }
638
-        }
639
-
640
-        // if we couldn't export anything, we want to at least show the column headers
641
-        if (empty($registrations_csv_ready_array)) {
642
-            $reg_csv_array = array();
643
-            $model_and_fields_to_include = array(
644
-                'Registration' => $reg_fields_to_include,
645
-                'Attendee'     => $att_fields_to_include,
646
-            );
647
-            foreach ($model_and_fields_to_include as $model_name => $field_list) {
648
-                $model = EE_Registry::instance()->load_model($model_name);
649
-                foreach ($field_list as $field_name) {
650
-                    $field = $model->field_settings_for($field_name);
651
-                    $reg_csv_array[ $this->_get_column_name_for_field(
652
-                        $field
653
-                    ) ] = null;// $registration->get($field->get_name());
654
-                }
655
-            }
656
-            $registrations_csv_ready_array [] = $reg_csv_array;
657
-        }
658
-        if ($event_id) {
659
-            $event_slug = EEM_Event::instance()->get_var(array(array('EVT_ID' => $event_id)), 'EVT_slug');
660
-            if (! $event_slug) {
661
-                $event_slug = esc_html__('unknown', 'event_espresso');
662
-            }
663
-        } else {
664
-            $event_slug = esc_html__('all', 'event_espresso');
665
-        }
666
-        $filename = sprintf("registrations-for-%s", $event_slug);
667
-
668
-        $handle = $this->EE_CSV->begin_sending_csv($filename);
669
-        $this->EE_CSV->write_data_array_to_csv($handle, $registrations_csv_ready_array);
670
-        $this->EE_CSV->end_sending_csv($handle);
671
-    }
672
-
673
-    /**
674
-     * Gets the 'normal' column named for fields
675
-     *
676
-     * @param EE_Model_Field_Base $field
677
-     * @return string
678
-     */
679
-    protected function _get_column_name_for_field(EE_Model_Field_Base $field)
680
-    {
681
-        return $field->get_nicename() . "[" . $field->get_name() . "]";
682
-    }
683
-
684
-
685
-    /**
686
-     * @Export data for ALL events
687
-     * @access public
688
-     * @return void
689
-     */
690
-    public function export_categories()
691
-    {
692
-        // are any Event IDs set?
693
-        $query_params = array();
694
-        if (isset($this->_req_data['EVT_CAT_ID'])) {
695
-            // do we have an array of IDs ?
696
-            if (is_array($this->_req_data['EVT_CAT_ID'])) {
697
-                // generate an "IN (CSV)" where clause
698
-                $EVT_CAT_IDs = array_map('sanitize_text_field', $this->_req_data['EVT_CAT_ID']);
699
-                $filename = 'event-categories';
700
-                $query_params[0]['term_taxonomy_id'] = array('IN', $EVT_CAT_IDs);
701
-            } else {
702
-                // generate regular where = clause
703
-                $EVT_CAT_ID = absint($this->_req_data['EVT_CAT_ID']);
704
-                $filename = 'event-category#' . $EVT_CAT_ID;
705
-                $query_params[0]['term_taxonomy_id'] = $EVT_CAT_ID;
706
-            }
707
-        } else {
708
-            // no IDs means we will d/l the entire table
709
-            $filename = 'all-categories';
710
-        }
711
-
712
-        $tables_to_export = array(
713
-            'Term_Taxonomy' => $query_params,
714
-        );
715
-
716
-        $table_data = $this->_get_export_data_for_models($tables_to_export);
717
-        $filename = $this->generate_filename($filename);
718
-
719
-        if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $table_data)) {
720
-            EE_Error::add_error(
721
-                esc_html__(
722
-                    'An error occurred and the Category details could not be exported from the database.',
723
-                    'event_espresso'
724
-                ),
725
-                __FILE__,
726
-                __FUNCTION__,
727
-                __LINE__
728
-            );
729
-        }
730
-    }
731
-
732
-
733
-    /**
734
-     * @process export name to create a suitable filename
735
-     * @access  private
736
-     * @param string - export_name
737
-     * @return string on success, FALSE on fail
738
-     */
739
-    private function generate_filename($export_name = '')
740
-    {
741
-        if ($export_name != '') {
742
-            $filename = get_bloginfo('name') . '-' . $export_name;
743
-            $filename = sanitize_key($filename) . '-' . $this->today;
744
-            return $filename;
745
-        } else {
746
-            EE_Error::add_error(esc_html__("No filename was provided", "event_espresso"), __FILE__, __FUNCTION__, __LINE__);
747
-        }
748
-        return false;
749
-    }
750
-
751
-
752
-    /**
753
-     * @recursive function for exporting table data and merging the results with the next results
754
-     * @access    private
755
-     * @param array $models_to_export keys are model names (eg 'Event', 'Attendee', etc.) and values are arrays of
756
-     *                                query params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
757
-     * @return array on success, FALSE on fail
758
-     */
759
-    private function _get_export_data_for_models($models_to_export = array())
760
-    {
761
-        $table_data = false;
762
-        if (is_array($models_to_export)) {
763
-            foreach ($models_to_export as $model_name => $query_params) {
764
-                // check for a numerically-indexed array. in that case, $model_name is the value!!
765
-                if (is_int($model_name)) {
766
-                    $model_name = $query_params;
767
-                    $query_params = array();
768
-                }
769
-                $model = EE_Registry::instance()->load_model($model_name);
770
-                $model_objects = $model->get_all($query_params);
771
-
772
-                $table_data[ $model_name ] = array();
773
-                foreach ($model_objects as $model_object) {
774
-                    $model_data_array = array();
775
-                    $fields = $model->field_settings();
776
-                    foreach ($fields as $field) {
777
-                        $column_name = $field->get_nicename() . "[" . $field->get_name() . "]";
778
-                        if ($field instanceof EE_Datetime_Field) {
779
-                            // $field->set_date_format('Y-m-d');
780
-                            // $field->set_time_format('H:i:s');
781
-                            $model_data_array[ $column_name ] = $model_object->get_datetime(
782
-                                $field->get_name(),
783
-                                'Y-m-d',
784
-                                'H:i:s'
785
-                            );
786
-                        } else {
787
-                            $model_data_array[ $column_name ] = $model_object->get($field->get_name());
788
-                        }
789
-                    }
790
-                    $table_data[ $model_name ][] = $model_data_array;
791
-                }
792
-            }
793
-        }
794
-        return $table_data;
795
-    }
19
+	const option_prefix = 'ee_report_job_';
20
+
21
+
22
+	// instance of the EE_Export object
23
+	private static $_instance = null;
24
+
25
+	// instance of the EE_CSV object
26
+	/**
27
+	 *
28
+	 * @var EE_CSV
29
+	 */
30
+	public $EE_CSV = null;
31
+
32
+
33
+	private $_req_data = array();
34
+
35
+
36
+	/**
37
+	 *        private constructor to prevent direct creation
38
+	 *
39
+	 * @Constructor
40
+	 * @access private
41
+	 * @param array $request_data
42
+	 */
43
+	private function __construct($request_data = array())
44
+	{
45
+		$this->_req_data = $request_data;
46
+		$this->today = date("Y-m-d", time());
47
+		require_once(EE_CLASSES . 'EE_CSV.class.php');
48
+		$this->EE_CSV = EE_CSV::instance();
49
+	}
50
+
51
+
52
+	/**
53
+	 *        @ singleton method used to instantiate class object
54
+	 *        @ access public
55
+	 *
56
+	 * @param array $request_data
57
+	 * @return \EE_Export
58
+	 */
59
+	public static function instance($request_data = array())
60
+	{
61
+		// check if class object is instantiated
62
+		if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_Export)) {
63
+			self::$_instance = new self($request_data);
64
+		}
65
+		return self::$_instance;
66
+	}
67
+
68
+
69
+	/**
70
+	 * @Export Event Espresso data - routes export requests
71
+	 * @access public
72
+	 * @return void | bool
73
+	 */
74
+	public function export()
75
+	{
76
+		// in case of bulk exports, the "actual" action will be in action2, but first check regular action for "export" keyword
77
+		if (isset($this->_req_data['action']) && strpos($this->_req_data['action'], 'export') === false) {
78
+			// check if action2 has export action
79
+			if (isset($this->_req_data['action2']) && strpos($this->_req_data['action2'], 'export') !== false) {
80
+				// whoop! there it is!
81
+				$this->_req_data['action'] = $this->_req_data['action2'];
82
+			}
83
+		}
84
+
85
+		$this->_req_data['export'] = isset($this->_req_data['export']) ? $this->_req_data['export'] : '';
86
+
87
+		switch ($this->_req_data['export']) {
88
+			case 'report':
89
+				switch ($this->_req_data['action']) {
90
+					case "event":
91
+					case "export_events":
92
+					case 'all_event_data':
93
+						$this->export_all_event_data();
94
+						break;
95
+
96
+					case 'registrations_report_for_event':
97
+						$this->report_registrations_for_event($this->_req_data['EVT_ID']);
98
+						break;
99
+
100
+					case 'attendees':
101
+						$this->export_attendees();
102
+						break;
103
+
104
+					case 'categories':
105
+						$this->export_categories();
106
+						break;
107
+
108
+					default:
109
+						EE_Error::add_error(
110
+							esc_html__('An error occurred! The requested export report could not be found.', 'event_espresso'),
111
+							__FILE__,
112
+							__FUNCTION__,
113
+							__LINE__
114
+						);
115
+						return false;
116
+						break;
117
+				}
118
+				break; // end of switch export : report
119
+			default:
120
+				break;
121
+		} // end of switch export
122
+
123
+		exit;
124
+	}
125
+
126
+	/**
127
+	 * Downloads a CSV file with all the columns, but no data. This should be used for importing
128
+	 *
129
+	 * @return null kills execution
130
+	 */
131
+	public function export_sample()
132
+	{
133
+		$event = EEM_Event::instance()->get_one();
134
+		$this->_req_data['EVT_ID'] = $event->ID();
135
+		$this->export_all_event_data();
136
+	}
137
+
138
+
139
+	/**
140
+	 * @Export data for ALL events
141
+	 * @access public
142
+	 * @return void
143
+	 */
144
+	public function export_all_event_data()
145
+	{
146
+		// are any Event IDs set?
147
+		$event_query_params = array();
148
+		$related_models_query_params = array();
149
+		$related_through_reg_query_params = array();
150
+		$datetime_ticket_query_params = array();
151
+		$price_query_params = array();
152
+		$price_type_query_params = array();
153
+		$term_query_params = array();
154
+		$state_country_query_params = array();
155
+		$question_group_query_params = array();
156
+		$question_query_params = array();
157
+		if (isset($this->_req_data['EVT_ID'])) {
158
+			// do we have an array of IDs ?
159
+
160
+			if (is_array($this->_req_data['EVT_ID'])) {
161
+				$EVT_IDs = array_map('sanitize_text_field', $this->_req_data['EVT_ID']);
162
+				$value_to_equal = array('IN', $EVT_IDs);
163
+				$filename = 'events';
164
+			} else {
165
+				// generate regular where = clause
166
+				$EVT_ID = absint($this->_req_data['EVT_ID']);
167
+				$value_to_equal = $EVT_ID;
168
+				$event = EE_Registry::instance()->load_model('Event')->get_one_by_ID($EVT_ID);
169
+
170
+				$filename = 'event-' . ($event instanceof EE_Event ? $event->slug() : esc_html__('unknown', 'event_espresso'));
171
+			}
172
+			$event_query_params[0]['EVT_ID'] = $value_to_equal;
173
+			$related_models_query_params[0]['Event.EVT_ID'] = $value_to_equal;
174
+			$related_through_reg_query_params[0]['Registration.EVT_ID'] = $value_to_equal;
175
+			$datetime_ticket_query_params[0]['Datetime.EVT_ID'] = $value_to_equal;
176
+			$price_query_params[0]['Ticket.Datetime.EVT_ID'] = $value_to_equal;
177
+			$price_type_query_params[0]['Price.Ticket.Datetime.EVT_ID'] = $value_to_equal;
178
+			$term_query_params[0]['Term_Taxonomy.Event.EVT_ID'] = $value_to_equal;
179
+			$state_country_query_params[0]['Venue.Event.EVT_ID'] = $value_to_equal;
180
+			$question_group_query_params[0]['Event.EVT_ID'] = $value_to_equal;
181
+			$question_query_params[0]['Question_Group.Event.EVT_ID'] = $value_to_equal;
182
+		} else {
183
+			$filename = 'all-events';
184
+		}
185
+
186
+
187
+		// array in the format:  table name =>  query where clause
188
+		$models_to_export = array(
189
+			'Event'                   => $event_query_params,
190
+			'Datetime'                => $related_models_query_params,
191
+			'Ticket_Template'         => $price_query_params,
192
+			'Ticket'                  => $datetime_ticket_query_params,
193
+			'Datetime_Ticket'         => $datetime_ticket_query_params,
194
+			'Price_Type'              => $price_type_query_params,
195
+			'Price'                   => $price_query_params,
196
+			'Ticket_Price'            => $price_query_params,
197
+			'Term'                    => $term_query_params,
198
+			'Term_Taxonomy'           => $related_models_query_params,
199
+			'Term_Relationship'       => $related_models_query_params, // model has NO primary key...
200
+			'Country'                 => $state_country_query_params,
201
+			'State'                   => $state_country_query_params,
202
+			'Venue'                   => $related_models_query_params,
203
+			'Event_Venue'             => $related_models_query_params,
204
+			'Question_Group'          => $question_group_query_params,
205
+			'Event_Question_Group'    => $question_group_query_params,
206
+			'Question'                => $question_query_params,
207
+			'Question_Group_Question' => $question_query_params,
208
+			// 'Transaction'=>$related_through_reg_query_params,
209
+			// 'Registration'=>$related_models_query_params,
210
+			// 'Attendee'=>$related_through_reg_query_params,
211
+			// 'Line_Item'=>
212
+
213
+		);
214
+
215
+		$model_data = $this->_get_export_data_for_models($models_to_export);
216
+
217
+		$filename = $this->generate_filename($filename);
218
+
219
+		if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
220
+			EE_Error::add_error(
221
+				esc_html__(
222
+					"'An error occurred and the Event details could not be exported from the database.'",
223
+					"event_espresso"
224
+				),
225
+				__FILE__,
226
+				__FUNCTION__,
227
+				__LINE__
228
+			);
229
+		}
230
+	}
231
+
232
+	public function report_attendees()
233
+	{
234
+		$attendee_rows = EEM_Attendee::instance()->get_all_wpdb_results(
235
+			array(
236
+				'force_join' => array('State', 'Country'),
237
+				'caps'       => EEM_Base::caps_read_admin,
238
+			)
239
+		);
240
+		$csv_data = array();
241
+		foreach ($attendee_rows as $attendee_row) {
242
+			$csv_row = array();
243
+			foreach (EEM_Attendee::instance()->field_settings() as $field_name => $field_obj) {
244
+				if ($field_name == 'STA_ID') {
245
+					$state_name_field = EEM_State::instance()->field_settings_for('STA_name');
246
+					$csv_row[ esc_html__('State', 'event_espresso') ] = $attendee_row[ $state_name_field->get_qualified_column(
247
+					) ];
248
+				} elseif ($field_name == 'CNT_ISO') {
249
+					$country_name_field = EEM_Country::instance()->field_settings_for('CNT_name');
250
+					$csv_row[ esc_html__(
251
+						'Country',
252
+						'event_espresso'
253
+					) ] = $attendee_row[ $country_name_field->get_qualified_column() ];
254
+				} else {
255
+					$csv_row[ $field_obj->get_nicename() ] = $attendee_row[ $field_obj->get_qualified_column() ];
256
+				}
257
+			}
258
+			$csv_data[] = $csv_row;
259
+		}
260
+
261
+		$filename = $this->generate_filename('contact-list-report');
262
+
263
+		$handle = $this->EE_CSV->begin_sending_csv($filename);
264
+		$this->EE_CSV->write_data_array_to_csv($handle, $csv_data);
265
+		$this->EE_CSV->end_sending_csv($handle);
266
+	}
267
+
268
+
269
+	/**
270
+	 * @Export data for ALL attendees
271
+	 * @access public
272
+	 * @return void
273
+	 */
274
+	public function export_attendees()
275
+	{
276
+
277
+		$states_that_have_an_attendee = EEM_State::instance()->get_all(
278
+			array(0 => array('Attendee.ATT_ID' => array('IS NOT NULL')))
279
+		);
280
+		$countries_that_have_an_attendee = EEM_Country::instance()->get_all(
281
+			array(0 => array('Attendee.ATT_ID' => array('IS NOT NULL')))
282
+		);
283
+		// $states_to_export_query_params
284
+		$models_to_export = array(
285
+			'Country'  => array(array('CNT_ISO' => array('IN', array_keys($countries_that_have_an_attendee)))),
286
+			'State'    => array(array('STA_ID' => array('IN', array_keys($states_that_have_an_attendee)))),
287
+			'Attendee' => array(),
288
+		);
289
+
290
+
291
+		$model_data = $this->_get_export_data_for_models($models_to_export);
292
+		$filename = $this->generate_filename('all-attendees');
293
+
294
+		if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
295
+			EE_Error::add_error(
296
+				esc_html__(
297
+					'An error occurred and the Attendee data could not be exported from the database.',
298
+					'event_espresso'
299
+				),
300
+				__FILE__,
301
+				__FUNCTION__,
302
+				__LINE__
303
+			);
304
+		}
305
+	}
306
+
307
+	/**
308
+	 * Shortcut for preparing a database result for display
309
+	 *
310
+	 * @param EEM_Base       $model
311
+	 * @param string         $field_name
312
+	 * @param string         $raw_db_value
313
+	 * @param boolean|string $pretty_schema true to display pretty, a string to use a specific "Schema", or false to
314
+	 *                                      NOT display pretty
315
+	 * @return string
316
+	 */
317
+	protected function _prepare_value_from_db_for_display($model, $field_name, $raw_db_value, $pretty_schema = true)
318
+	{
319
+		$field_obj = $model->field_settings_for($field_name);
320
+		$value_on_model_obj = $field_obj->prepare_for_set_from_db($raw_db_value);
321
+		if ($field_obj instanceof EE_Datetime_Field) {
322
+			$field_obj->set_date_format(
323
+				EE_CSV::instance()->get_date_format_for_csv($field_obj->get_date_format($pretty_schema)),
324
+				$pretty_schema
325
+			);
326
+			$field_obj->set_time_format(
327
+				EE_CSV::instance()->get_time_format_for_csv($field_obj->get_time_format($pretty_schema)),
328
+				$pretty_schema
329
+			);
330
+		}
331
+		if ($pretty_schema === true) {
332
+			return $field_obj->prepare_for_pretty_echoing($value_on_model_obj);
333
+		} elseif (is_string($pretty_schema)) {
334
+			return $field_obj->prepare_for_pretty_echoing($value_on_model_obj, $pretty_schema);
335
+		} else {
336
+			return $field_obj->prepare_for_get($value_on_model_obj);
337
+		}
338
+	}
339
+
340
+	/**
341
+	 * Export a custom CSV of registration info including: A bunch of the reg fields, the time of the event, the price
342
+	 * name, and the questions associated with the registrations
343
+	 *
344
+	 * @param int $event_id
345
+	 */
346
+	public function report_registrations_for_event($event_id = null)
347
+	{
348
+		$reg_fields_to_include = array(
349
+			'TXN_ID',
350
+			'ATT_ID',
351
+			'REG_ID',
352
+			'REG_date',
353
+			'REG_code',
354
+			'REG_count',
355
+			'REG_final_price',
356
+
357
+		);
358
+		$att_fields_to_include = array(
359
+			'ATT_fname',
360
+			'ATT_lname',
361
+			'ATT_email',
362
+			'ATT_address',
363
+			'ATT_address2',
364
+			'ATT_city',
365
+			'STA_ID',
366
+			'CNT_ISO',
367
+			'ATT_zip',
368
+			'ATT_phone',
369
+		);
370
+
371
+		$registrations_csv_ready_array = array();
372
+		$reg_model = EE_Registry::instance()->load_model('Registration');
373
+		$query_params = apply_filters(
374
+			'FHEE__EE_Export__report_registration_for_event',
375
+			array(
376
+				array(
377
+					'OR'                 => array(
378
+						// don't include registrations from failed or abandoned transactions...
379
+						'Transaction.STS_ID' => array(
380
+							'NOT IN',
381
+							array(EEM_Transaction::failed_status_code, EEM_Transaction::abandoned_status_code),
382
+						),
383
+						// unless the registration is approved, in which case include it regardless of transaction status
384
+						'STS_ID'             => EEM_Registration::status_id_approved,
385
+					),
386
+					'Ticket.TKT_deleted' => array('IN', array(true, false)),
387
+				),
388
+				'order_by'   => array('Transaction.TXN_ID' => 'asc', 'REG_count' => 'asc'),
389
+				'force_join' => array('Transaction', 'Ticket', 'Attendee'),
390
+				'caps'       => EEM_Base::caps_read_admin,
391
+			),
392
+			$event_id
393
+		);
394
+		if ($event_id) {
395
+			$query_params[0]['EVT_ID'] = $event_id;
396
+		} else {
397
+			$query_params['force_join'][] = 'Event';
398
+		}
399
+		$registration_rows = $reg_model->get_all_wpdb_results($query_params);
400
+		// get all questions which relate to someone in this group
401
+		$registration_ids = array();
402
+		foreach ($registration_rows as $reg_row) {
403
+			$registration_ids[] = intval($reg_row['Registration.REG_ID']);
404
+		}
405
+		// EEM_Question::instance()->show_next_x_db_queries();
406
+		$questions_for_these_regs_rows = EEM_Question::instance()->get_all_wpdb_results(
407
+			array(array('Answer.REG_ID' => array('IN', $registration_ids)))
408
+		);
409
+		foreach ($registration_rows as $reg_row) {
410
+			if (is_array($reg_row)) {
411
+				$reg_csv_array = array();
412
+				if (! $event_id) {
413
+					// get the event's name and Id
414
+					$reg_csv_array[ esc_html__('Event', 'event_espresso') ] = sprintf(
415
+						esc_html__('%1$s (%2$s)', 'event_espresso'),
416
+						$this->_prepare_value_from_db_for_display(
417
+							EEM_Event::instance(),
418
+							'EVT_name',
419
+							$reg_row['Event_CPT.post_title']
420
+						),
421
+						$reg_row['Event_CPT.ID']
422
+					);
423
+				}
424
+				$is_primary_reg = $reg_row['Registration.REG_count'] == '1' ? true : false;
425
+				/*@var $reg_row EE_Registration */
426
+				foreach ($reg_fields_to_include as $field_name) {
427
+					$field = $reg_model->field_settings_for($field_name);
428
+					if ($field_name == 'REG_final_price') {
429
+						$value = $this->_prepare_value_from_db_for_display(
430
+							$reg_model,
431
+							$field_name,
432
+							$reg_row['Registration.REG_final_price'],
433
+							'localized_float'
434
+						);
435
+					} elseif ($field_name == 'REG_count') {
436
+						$value = sprintf(
437
+							esc_html__('%s of %s', 'event_espresso'),
438
+							$this->_prepare_value_from_db_for_display(
439
+								$reg_model,
440
+								'REG_count',
441
+								$reg_row['Registration.REG_count']
442
+							),
443
+							$this->_prepare_value_from_db_for_display(
444
+								$reg_model,
445
+								'REG_group_size',
446
+								$reg_row['Registration.REG_group_size']
447
+							)
448
+						);
449
+					} elseif ($field_name == 'REG_date') {
450
+						$value = $this->_prepare_value_from_db_for_display(
451
+							$reg_model,
452
+							$field_name,
453
+							$reg_row['Registration.REG_date'],
454
+							'no_html'
455
+						);
456
+					} else {
457
+						$value = $this->_prepare_value_from_db_for_display(
458
+							$reg_model,
459
+							$field_name,
460
+							$reg_row[ $field->get_qualified_column() ]
461
+						);
462
+					}
463
+					$reg_csv_array[ $this->_get_column_name_for_field($field) ] = $value;
464
+					if ($field_name == 'REG_final_price') {
465
+						// add a column named Currency after the final price
466
+						$reg_csv_array[ esc_html__("Currency", "event_espresso") ] = EE_Config::instance()->currency->code;
467
+					}
468
+				}
469
+				// get pretty status
470
+				$stati = EEM_Status::instance()->localized_status(
471
+					array(
472
+						$reg_row['Registration.STS_ID']     => esc_html__('unknown', 'event_espresso'),
473
+						$reg_row['TransactionTable.STS_ID'] => esc_html__('unknown', 'event_espresso'),
474
+					),
475
+					false,
476
+					'sentence'
477
+				);
478
+				$reg_csv_array[ esc_html__(
479
+					"Registration Status",
480
+					'event_espresso'
481
+				) ] = $stati[ $reg_row['Registration.STS_ID'] ];
482
+				// get pretty trnasaction status
483
+				$reg_csv_array[ esc_html__(
484
+					"Transaction Status",
485
+					'event_espresso'
486
+				) ] = $stati[ $reg_row['TransactionTable.STS_ID'] ];
487
+				$reg_csv_array[ esc_html__('Transaction Amount Due', 'event_espresso') ] = $is_primary_reg
488
+					? $this->_prepare_value_from_db_for_display(
489
+						EEM_Transaction::instance(),
490
+						'TXN_total',
491
+						$reg_row['TransactionTable.TXN_total'],
492
+						'localized_float'
493
+					) : '0.00';
494
+				$reg_csv_array[ esc_html__('Amount Paid', 'event_espresso') ] = $is_primary_reg
495
+					? $this->_prepare_value_from_db_for_display(
496
+						EEM_Transaction::instance(),
497
+						'TXN_paid',
498
+						$reg_row['TransactionTable.TXN_paid'],
499
+						'localized_float'
500
+					) : '0.00';
501
+				$payment_methods = array();
502
+				$gateway_txn_ids_etc = array();
503
+				$payment_times = array();
504
+				if ($is_primary_reg && $reg_row['TransactionTable.TXN_ID']) {
505
+					$payments_info = EEM_Payment::instance()->get_all_wpdb_results(
506
+						array(
507
+							array(
508
+								'TXN_ID' => $reg_row['TransactionTable.TXN_ID'],
509
+								'STS_ID' => EEM_Payment::status_id_approved,
510
+							),
511
+							'force_join' => array('Payment_Method'),
512
+						),
513
+						ARRAY_A,
514
+						'Payment_Method.PMD_admin_name as name, Payment.PAY_txn_id_chq_nmbr as gateway_txn_id, Payment.PAY_timestamp as payment_time'
515
+					);
516
+
517
+					foreach ($payments_info as $payment_method_and_gateway_txn_id) {
518
+						$payment_methods[] = isset($payment_method_and_gateway_txn_id['name'])
519
+							? $payment_method_and_gateway_txn_id['name'] : esc_html__('Unknown', 'event_espresso');
520
+						$gateway_txn_ids_etc[] = isset($payment_method_and_gateway_txn_id['gateway_txn_id'])
521
+							? $payment_method_and_gateway_txn_id['gateway_txn_id'] : '';
522
+						$payment_times[] = isset($payment_method_and_gateway_txn_id['payment_time'])
523
+							? $payment_method_and_gateway_txn_id['payment_time'] : '';
524
+					}
525
+				}
526
+				$reg_csv_array[ esc_html__('Payment Date(s)', 'event_espresso') ] = implode(',', $payment_times);
527
+				$reg_csv_array[ esc_html__('Payment Method(s)', 'event_espresso') ] = implode(",", $payment_methods);
528
+				$reg_csv_array[ esc_html__('Gateway Transaction ID(s)', 'event_espresso') ] = implode(
529
+					',',
530
+					$gateway_txn_ids_etc
531
+				);
532
+
533
+				// get whether or not the user has checked in
534
+				$reg_csv_array[ esc_html__("Check-Ins", "event_espresso") ] = $reg_model->count_related(
535
+					$reg_row['Registration.REG_ID'],
536
+					'Checkin'
537
+				);
538
+				// get ticket of registration and its price
539
+				$ticket_model = EE_Registry::instance()->load_model('Ticket');
540
+				if ($reg_row['Ticket.TKT_ID']) {
541
+					$ticket_name = $this->_prepare_value_from_db_for_display(
542
+						$ticket_model,
543
+						'TKT_name',
544
+						$reg_row['Ticket.TKT_name']
545
+					);
546
+					$datetimes_strings = array();
547
+					foreach (
548
+						EEM_Datetime::instance()->get_all_wpdb_results(
549
+							array(
550
+							array('Ticket.TKT_ID' => $reg_row['Ticket.TKT_ID']),
551
+							'order_by'                 => array('DTT_EVT_start' => 'ASC'),
552
+							'default_where_conditions' => 'none',
553
+							)
554
+						) as $datetime
555
+					) {
556
+						$datetimes_strings[] = $this->_prepare_value_from_db_for_display(
557
+							EEM_Datetime::instance(),
558
+							'DTT_EVT_start',
559
+							$datetime['Datetime.DTT_EVT_start']
560
+						);
561
+					}
562
+				} else {
563
+					$ticket_name = esc_html__('Unknown', 'event_espresso');
564
+					$datetimes_strings = array(esc_html__('Unknown', 'event_espresso'));
565
+				}
566
+				$reg_csv_array[ $ticket_model->field_settings_for('TKT_name')->get_nicename() ] = $ticket_name;
567
+				$reg_csv_array[ esc_html__("Datetimes of Ticket", "event_espresso") ] = implode(", ", $datetimes_strings);
568
+				// get datetime(s) of registration
569
+
570
+				// add attendee columns
571
+				foreach ($att_fields_to_include as $att_field_name) {
572
+					$field_obj = EEM_Attendee::instance()->field_settings_for($att_field_name);
573
+					if ($reg_row['Attendee_CPT.ID']) {
574
+						if ($att_field_name == 'STA_ID') {
575
+							$value = EEM_State::instance()->get_var(
576
+								array(array('STA_ID' => $reg_row['Attendee_Meta.STA_ID'])),
577
+								'STA_name'
578
+							);
579
+						} elseif ($att_field_name == 'CNT_ISO') {
580
+							$value = EEM_Country::instance()->get_var(
581
+								array(array('CNT_ISO' => $reg_row['Attendee_Meta.CNT_ISO'])),
582
+								'CNT_name'
583
+							);
584
+						} else {
585
+							$value = $this->_prepare_value_from_db_for_display(
586
+								EEM_Attendee::instance(),
587
+								$att_field_name,
588
+								$reg_row[ $field_obj->get_qualified_column() ]
589
+							);
590
+						}
591
+					} else {
592
+						$value = '';
593
+					}
594
+
595
+					$reg_csv_array[ $this->_get_column_name_for_field($field_obj) ] = $value;
596
+				}
597
+
598
+				// make sure each registration has the same questions in the same order
599
+				foreach ($questions_for_these_regs_rows as $question_row) {
600
+					if (! isset($reg_csv_array[ $question_row['Question.QST_admin_label'] ])) {
601
+						$reg_csv_array[ $question_row['Question.QST_admin_label'] ] = null;
602
+					}
603
+				}
604
+				// now fill out the questions THEY answered
605
+				foreach (
606
+					EEM_Answer::instance()->get_all_wpdb_results(
607
+						array(array('REG_ID' => $reg_row['Registration.REG_ID']), 'force_join' => array('Question'))
608
+					) as $answer_row
609
+				) {
610
+					/* @var $answer EE_Answer */
611
+					if ($answer_row['Question.QST_ID']) {
612
+						$question_label = $this->_prepare_value_from_db_for_display(
613
+							EEM_Question::instance(),
614
+							'QST_admin_label',
615
+							$answer_row['Question.QST_admin_label']
616
+						);
617
+					} else {
618
+						$question_label = sprintf(esc_html__('Question $s', 'event_espresso'), $answer_row['Answer.QST_ID']);
619
+					}
620
+					if (isset($answer_row['Question.QST_type']) && $answer_row['Question.QST_type'] == EEM_Question::QST_type_state) {
621
+						$reg_csv_array[ $question_label ] = EEM_State::instance()->get_state_name_by_ID(
622
+							$answer_row['Answer.ANS_value']
623
+						);
624
+					} else {
625
+						$reg_csv_array[ $question_label ] = $this->_prepare_value_from_db_for_display(
626
+							EEM_Answer::instance(),
627
+							'ANS_value',
628
+							$answer_row['Answer.ANS_value']
629
+						);
630
+					}
631
+				}
632
+				$registrations_csv_ready_array[] = apply_filters(
633
+					'FHEE__EE_Export__report_registrations__reg_csv_array',
634
+					$reg_csv_array,
635
+					$reg_row
636
+				);
637
+			}
638
+		}
639
+
640
+		// if we couldn't export anything, we want to at least show the column headers
641
+		if (empty($registrations_csv_ready_array)) {
642
+			$reg_csv_array = array();
643
+			$model_and_fields_to_include = array(
644
+				'Registration' => $reg_fields_to_include,
645
+				'Attendee'     => $att_fields_to_include,
646
+			);
647
+			foreach ($model_and_fields_to_include as $model_name => $field_list) {
648
+				$model = EE_Registry::instance()->load_model($model_name);
649
+				foreach ($field_list as $field_name) {
650
+					$field = $model->field_settings_for($field_name);
651
+					$reg_csv_array[ $this->_get_column_name_for_field(
652
+						$field
653
+					) ] = null;// $registration->get($field->get_name());
654
+				}
655
+			}
656
+			$registrations_csv_ready_array [] = $reg_csv_array;
657
+		}
658
+		if ($event_id) {
659
+			$event_slug = EEM_Event::instance()->get_var(array(array('EVT_ID' => $event_id)), 'EVT_slug');
660
+			if (! $event_slug) {
661
+				$event_slug = esc_html__('unknown', 'event_espresso');
662
+			}
663
+		} else {
664
+			$event_slug = esc_html__('all', 'event_espresso');
665
+		}
666
+		$filename = sprintf("registrations-for-%s", $event_slug);
667
+
668
+		$handle = $this->EE_CSV->begin_sending_csv($filename);
669
+		$this->EE_CSV->write_data_array_to_csv($handle, $registrations_csv_ready_array);
670
+		$this->EE_CSV->end_sending_csv($handle);
671
+	}
672
+
673
+	/**
674
+	 * Gets the 'normal' column named for fields
675
+	 *
676
+	 * @param EE_Model_Field_Base $field
677
+	 * @return string
678
+	 */
679
+	protected function _get_column_name_for_field(EE_Model_Field_Base $field)
680
+	{
681
+		return $field->get_nicename() . "[" . $field->get_name() . "]";
682
+	}
683
+
684
+
685
+	/**
686
+	 * @Export data for ALL events
687
+	 * @access public
688
+	 * @return void
689
+	 */
690
+	public function export_categories()
691
+	{
692
+		// are any Event IDs set?
693
+		$query_params = array();
694
+		if (isset($this->_req_data['EVT_CAT_ID'])) {
695
+			// do we have an array of IDs ?
696
+			if (is_array($this->_req_data['EVT_CAT_ID'])) {
697
+				// generate an "IN (CSV)" where clause
698
+				$EVT_CAT_IDs = array_map('sanitize_text_field', $this->_req_data['EVT_CAT_ID']);
699
+				$filename = 'event-categories';
700
+				$query_params[0]['term_taxonomy_id'] = array('IN', $EVT_CAT_IDs);
701
+			} else {
702
+				// generate regular where = clause
703
+				$EVT_CAT_ID = absint($this->_req_data['EVT_CAT_ID']);
704
+				$filename = 'event-category#' . $EVT_CAT_ID;
705
+				$query_params[0]['term_taxonomy_id'] = $EVT_CAT_ID;
706
+			}
707
+		} else {
708
+			// no IDs means we will d/l the entire table
709
+			$filename = 'all-categories';
710
+		}
711
+
712
+		$tables_to_export = array(
713
+			'Term_Taxonomy' => $query_params,
714
+		);
715
+
716
+		$table_data = $this->_get_export_data_for_models($tables_to_export);
717
+		$filename = $this->generate_filename($filename);
718
+
719
+		if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $table_data)) {
720
+			EE_Error::add_error(
721
+				esc_html__(
722
+					'An error occurred and the Category details could not be exported from the database.',
723
+					'event_espresso'
724
+				),
725
+				__FILE__,
726
+				__FUNCTION__,
727
+				__LINE__
728
+			);
729
+		}
730
+	}
731
+
732
+
733
+	/**
734
+	 * @process export name to create a suitable filename
735
+	 * @access  private
736
+	 * @param string - export_name
737
+	 * @return string on success, FALSE on fail
738
+	 */
739
+	private function generate_filename($export_name = '')
740
+	{
741
+		if ($export_name != '') {
742
+			$filename = get_bloginfo('name') . '-' . $export_name;
743
+			$filename = sanitize_key($filename) . '-' . $this->today;
744
+			return $filename;
745
+		} else {
746
+			EE_Error::add_error(esc_html__("No filename was provided", "event_espresso"), __FILE__, __FUNCTION__, __LINE__);
747
+		}
748
+		return false;
749
+	}
750
+
751
+
752
+	/**
753
+	 * @recursive function for exporting table data and merging the results with the next results
754
+	 * @access    private
755
+	 * @param array $models_to_export keys are model names (eg 'Event', 'Attendee', etc.) and values are arrays of
756
+	 *                                query params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
757
+	 * @return array on success, FALSE on fail
758
+	 */
759
+	private function _get_export_data_for_models($models_to_export = array())
760
+	{
761
+		$table_data = false;
762
+		if (is_array($models_to_export)) {
763
+			foreach ($models_to_export as $model_name => $query_params) {
764
+				// check for a numerically-indexed array. in that case, $model_name is the value!!
765
+				if (is_int($model_name)) {
766
+					$model_name = $query_params;
767
+					$query_params = array();
768
+				}
769
+				$model = EE_Registry::instance()->load_model($model_name);
770
+				$model_objects = $model->get_all($query_params);
771
+
772
+				$table_data[ $model_name ] = array();
773
+				foreach ($model_objects as $model_object) {
774
+					$model_data_array = array();
775
+					$fields = $model->field_settings();
776
+					foreach ($fields as $field) {
777
+						$column_name = $field->get_nicename() . "[" . $field->get_name() . "]";
778
+						if ($field instanceof EE_Datetime_Field) {
779
+							// $field->set_date_format('Y-m-d');
780
+							// $field->set_time_format('H:i:s');
781
+							$model_data_array[ $column_name ] = $model_object->get_datetime(
782
+								$field->get_name(),
783
+								'Y-m-d',
784
+								'H:i:s'
785
+							);
786
+						} else {
787
+							$model_data_array[ $column_name ] = $model_object->get($field->get_name());
788
+						}
789
+					}
790
+					$table_data[ $model_name ][] = $model_data_array;
791
+				}
792
+			}
793
+		}
794
+		return $table_data;
795
+	}
796 796
 }
Please login to merge, or discard this patch.
Spacing   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -44,7 +44,7 @@  discard block
 block discarded – undo
44 44
     {
45 45
         $this->_req_data = $request_data;
46 46
         $this->today = date("Y-m-d", time());
47
-        require_once(EE_CLASSES . 'EE_CSV.class.php');
47
+        require_once(EE_CLASSES.'EE_CSV.class.php');
48 48
         $this->EE_CSV = EE_CSV::instance();
49 49
     }
50 50
 
@@ -167,7 +167,7 @@  discard block
 block discarded – undo
167 167
                 $value_to_equal = $EVT_ID;
168 168
                 $event = EE_Registry::instance()->load_model('Event')->get_one_by_ID($EVT_ID);
169 169
 
170
-                $filename = 'event-' . ($event instanceof EE_Event ? $event->slug() : esc_html__('unknown', 'event_espresso'));
170
+                $filename = 'event-'.($event instanceof EE_Event ? $event->slug() : esc_html__('unknown', 'event_espresso'));
171 171
             }
172 172
             $event_query_params[0]['EVT_ID'] = $value_to_equal;
173 173
             $related_models_query_params[0]['Event.EVT_ID'] = $value_to_equal;
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
 
217 217
         $filename = $this->generate_filename($filename);
218 218
 
219
-        if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
219
+        if ( ! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
220 220
             EE_Error::add_error(
221 221
                 esc_html__(
222 222
                     "'An error occurred and the Event details could not be exported from the database.'",
@@ -243,16 +243,16 @@  discard block
 block discarded – undo
243 243
             foreach (EEM_Attendee::instance()->field_settings() as $field_name => $field_obj) {
244 244
                 if ($field_name == 'STA_ID') {
245 245
                     $state_name_field = EEM_State::instance()->field_settings_for('STA_name');
246
-                    $csv_row[ esc_html__('State', 'event_espresso') ] = $attendee_row[ $state_name_field->get_qualified_column(
247
-                    ) ];
246
+                    $csv_row[esc_html__('State', 'event_espresso')] = $attendee_row[$state_name_field->get_qualified_column(
247
+                    )];
248 248
                 } elseif ($field_name == 'CNT_ISO') {
249 249
                     $country_name_field = EEM_Country::instance()->field_settings_for('CNT_name');
250
-                    $csv_row[ esc_html__(
250
+                    $csv_row[esc_html__(
251 251
                         'Country',
252 252
                         'event_espresso'
253
-                    ) ] = $attendee_row[ $country_name_field->get_qualified_column() ];
253
+                    )] = $attendee_row[$country_name_field->get_qualified_column()];
254 254
                 } else {
255
-                    $csv_row[ $field_obj->get_nicename() ] = $attendee_row[ $field_obj->get_qualified_column() ];
255
+                    $csv_row[$field_obj->get_nicename()] = $attendee_row[$field_obj->get_qualified_column()];
256 256
                 }
257 257
             }
258 258
             $csv_data[] = $csv_row;
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
         $model_data = $this->_get_export_data_for_models($models_to_export);
292 292
         $filename = $this->generate_filename('all-attendees');
293 293
 
294
-        if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
294
+        if ( ! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $model_data)) {
295 295
             EE_Error::add_error(
296 296
                 esc_html__(
297 297
                     'An error occurred and the Attendee data could not be exported from the database.',
@@ -409,9 +409,9 @@  discard block
 block discarded – undo
409 409
         foreach ($registration_rows as $reg_row) {
410 410
             if (is_array($reg_row)) {
411 411
                 $reg_csv_array = array();
412
-                if (! $event_id) {
412
+                if ( ! $event_id) {
413 413
                     // get the event's name and Id
414
-                    $reg_csv_array[ esc_html__('Event', 'event_espresso') ] = sprintf(
414
+                    $reg_csv_array[esc_html__('Event', 'event_espresso')] = sprintf(
415 415
                         esc_html__('%1$s (%2$s)', 'event_espresso'),
416 416
                         $this->_prepare_value_from_db_for_display(
417 417
                             EEM_Event::instance(),
@@ -457,13 +457,13 @@  discard block
 block discarded – undo
457 457
                         $value = $this->_prepare_value_from_db_for_display(
458 458
                             $reg_model,
459 459
                             $field_name,
460
-                            $reg_row[ $field->get_qualified_column() ]
460
+                            $reg_row[$field->get_qualified_column()]
461 461
                         );
462 462
                     }
463
-                    $reg_csv_array[ $this->_get_column_name_for_field($field) ] = $value;
463
+                    $reg_csv_array[$this->_get_column_name_for_field($field)] = $value;
464 464
                     if ($field_name == 'REG_final_price') {
465 465
                         // add a column named Currency after the final price
466
-                        $reg_csv_array[ esc_html__("Currency", "event_espresso") ] = EE_Config::instance()->currency->code;
466
+                        $reg_csv_array[esc_html__("Currency", "event_espresso")] = EE_Config::instance()->currency->code;
467 467
                     }
468 468
                 }
469 469
                 // get pretty status
@@ -475,23 +475,23 @@  discard block
 block discarded – undo
475 475
                     false,
476 476
                     'sentence'
477 477
                 );
478
-                $reg_csv_array[ esc_html__(
478
+                $reg_csv_array[esc_html__(
479 479
                     "Registration Status",
480 480
                     'event_espresso'
481
-                ) ] = $stati[ $reg_row['Registration.STS_ID'] ];
481
+                )] = $stati[$reg_row['Registration.STS_ID']];
482 482
                 // get pretty trnasaction status
483
-                $reg_csv_array[ esc_html__(
483
+                $reg_csv_array[esc_html__(
484 484
                     "Transaction Status",
485 485
                     'event_espresso'
486
-                ) ] = $stati[ $reg_row['TransactionTable.STS_ID'] ];
487
-                $reg_csv_array[ esc_html__('Transaction Amount Due', 'event_espresso') ] = $is_primary_reg
486
+                )] = $stati[$reg_row['TransactionTable.STS_ID']];
487
+                $reg_csv_array[esc_html__('Transaction Amount Due', 'event_espresso')] = $is_primary_reg
488 488
                     ? $this->_prepare_value_from_db_for_display(
489 489
                         EEM_Transaction::instance(),
490 490
                         'TXN_total',
491 491
                         $reg_row['TransactionTable.TXN_total'],
492 492
                         'localized_float'
493 493
                     ) : '0.00';
494
-                $reg_csv_array[ esc_html__('Amount Paid', 'event_espresso') ] = $is_primary_reg
494
+                $reg_csv_array[esc_html__('Amount Paid', 'event_espresso')] = $is_primary_reg
495 495
                     ? $this->_prepare_value_from_db_for_display(
496 496
                         EEM_Transaction::instance(),
497 497
                         'TXN_paid',
@@ -523,15 +523,15 @@  discard block
 block discarded – undo
523 523
                             ? $payment_method_and_gateway_txn_id['payment_time'] : '';
524 524
                     }
525 525
                 }
526
-                $reg_csv_array[ esc_html__('Payment Date(s)', 'event_espresso') ] = implode(',', $payment_times);
527
-                $reg_csv_array[ esc_html__('Payment Method(s)', 'event_espresso') ] = implode(",", $payment_methods);
528
-                $reg_csv_array[ esc_html__('Gateway Transaction ID(s)', 'event_espresso') ] = implode(
526
+                $reg_csv_array[esc_html__('Payment Date(s)', 'event_espresso')] = implode(',', $payment_times);
527
+                $reg_csv_array[esc_html__('Payment Method(s)', 'event_espresso')] = implode(",", $payment_methods);
528
+                $reg_csv_array[esc_html__('Gateway Transaction ID(s)', 'event_espresso')] = implode(
529 529
                     ',',
530 530
                     $gateway_txn_ids_etc
531 531
                 );
532 532
 
533 533
                 // get whether or not the user has checked in
534
-                $reg_csv_array[ esc_html__("Check-Ins", "event_espresso") ] = $reg_model->count_related(
534
+                $reg_csv_array[esc_html__("Check-Ins", "event_espresso")] = $reg_model->count_related(
535 535
                     $reg_row['Registration.REG_ID'],
536 536
                     'Checkin'
537 537
                 );
@@ -563,8 +563,8 @@  discard block
 block discarded – undo
563 563
                     $ticket_name = esc_html__('Unknown', 'event_espresso');
564 564
                     $datetimes_strings = array(esc_html__('Unknown', 'event_espresso'));
565 565
                 }
566
-                $reg_csv_array[ $ticket_model->field_settings_for('TKT_name')->get_nicename() ] = $ticket_name;
567
-                $reg_csv_array[ esc_html__("Datetimes of Ticket", "event_espresso") ] = implode(", ", $datetimes_strings);
566
+                $reg_csv_array[$ticket_model->field_settings_for('TKT_name')->get_nicename()] = $ticket_name;
567
+                $reg_csv_array[esc_html__("Datetimes of Ticket", "event_espresso")] = implode(", ", $datetimes_strings);
568 568
                 // get datetime(s) of registration
569 569
 
570 570
                 // add attendee columns
@@ -585,20 +585,20 @@  discard block
 block discarded – undo
585 585
                             $value = $this->_prepare_value_from_db_for_display(
586 586
                                 EEM_Attendee::instance(),
587 587
                                 $att_field_name,
588
-                                $reg_row[ $field_obj->get_qualified_column() ]
588
+                                $reg_row[$field_obj->get_qualified_column()]
589 589
                             );
590 590
                         }
591 591
                     } else {
592 592
                         $value = '';
593 593
                     }
594 594
 
595
-                    $reg_csv_array[ $this->_get_column_name_for_field($field_obj) ] = $value;
595
+                    $reg_csv_array[$this->_get_column_name_for_field($field_obj)] = $value;
596 596
                 }
597 597
 
598 598
                 // make sure each registration has the same questions in the same order
599 599
                 foreach ($questions_for_these_regs_rows as $question_row) {
600
-                    if (! isset($reg_csv_array[ $question_row['Question.QST_admin_label'] ])) {
601
-                        $reg_csv_array[ $question_row['Question.QST_admin_label'] ] = null;
600
+                    if ( ! isset($reg_csv_array[$question_row['Question.QST_admin_label']])) {
601
+                        $reg_csv_array[$question_row['Question.QST_admin_label']] = null;
602 602
                     }
603 603
                 }
604 604
                 // now fill out the questions THEY answered
@@ -618,11 +618,11 @@  discard block
 block discarded – undo
618 618
                         $question_label = sprintf(esc_html__('Question $s', 'event_espresso'), $answer_row['Answer.QST_ID']);
619 619
                     }
620 620
                     if (isset($answer_row['Question.QST_type']) && $answer_row['Question.QST_type'] == EEM_Question::QST_type_state) {
621
-                        $reg_csv_array[ $question_label ] = EEM_State::instance()->get_state_name_by_ID(
621
+                        $reg_csv_array[$question_label] = EEM_State::instance()->get_state_name_by_ID(
622 622
                             $answer_row['Answer.ANS_value']
623 623
                         );
624 624
                     } else {
625
-                        $reg_csv_array[ $question_label ] = $this->_prepare_value_from_db_for_display(
625
+                        $reg_csv_array[$question_label] = $this->_prepare_value_from_db_for_display(
626 626
                             EEM_Answer::instance(),
627 627
                             'ANS_value',
628 628
                             $answer_row['Answer.ANS_value']
@@ -648,16 +648,16 @@  discard block
 block discarded – undo
648 648
                 $model = EE_Registry::instance()->load_model($model_name);
649 649
                 foreach ($field_list as $field_name) {
650 650
                     $field = $model->field_settings_for($field_name);
651
-                    $reg_csv_array[ $this->_get_column_name_for_field(
651
+                    $reg_csv_array[$this->_get_column_name_for_field(
652 652
                         $field
653
-                    ) ] = null;// $registration->get($field->get_name());
653
+                    )] = null; // $registration->get($field->get_name());
654 654
                 }
655 655
             }
656 656
             $registrations_csv_ready_array [] = $reg_csv_array;
657 657
         }
658 658
         if ($event_id) {
659 659
             $event_slug = EEM_Event::instance()->get_var(array(array('EVT_ID' => $event_id)), 'EVT_slug');
660
-            if (! $event_slug) {
660
+            if ( ! $event_slug) {
661 661
                 $event_slug = esc_html__('unknown', 'event_espresso');
662 662
             }
663 663
         } else {
@@ -678,7 +678,7 @@  discard block
 block discarded – undo
678 678
      */
679 679
     protected function _get_column_name_for_field(EE_Model_Field_Base $field)
680 680
     {
681
-        return $field->get_nicename() . "[" . $field->get_name() . "]";
681
+        return $field->get_nicename()."[".$field->get_name()."]";
682 682
     }
683 683
 
684 684
 
@@ -701,7 +701,7 @@  discard block
 block discarded – undo
701 701
             } else {
702 702
                 // generate regular where = clause
703 703
                 $EVT_CAT_ID = absint($this->_req_data['EVT_CAT_ID']);
704
-                $filename = 'event-category#' . $EVT_CAT_ID;
704
+                $filename = 'event-category#'.$EVT_CAT_ID;
705 705
                 $query_params[0]['term_taxonomy_id'] = $EVT_CAT_ID;
706 706
             }
707 707
         } else {
@@ -716,7 +716,7 @@  discard block
 block discarded – undo
716 716
         $table_data = $this->_get_export_data_for_models($tables_to_export);
717 717
         $filename = $this->generate_filename($filename);
718 718
 
719
-        if (! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $table_data)) {
719
+        if ( ! $this->EE_CSV->export_multiple_model_data_to_csv($filename, $table_data)) {
720 720
             EE_Error::add_error(
721 721
                 esc_html__(
722 722
                     'An error occurred and the Category details could not be exported from the database.',
@@ -739,8 +739,8 @@  discard block
 block discarded – undo
739 739
     private function generate_filename($export_name = '')
740 740
     {
741 741
         if ($export_name != '') {
742
-            $filename = get_bloginfo('name') . '-' . $export_name;
743
-            $filename = sanitize_key($filename) . '-' . $this->today;
742
+            $filename = get_bloginfo('name').'-'.$export_name;
743
+            $filename = sanitize_key($filename).'-'.$this->today;
744 744
             return $filename;
745 745
         } else {
746 746
             EE_Error::add_error(esc_html__("No filename was provided", "event_espresso"), __FILE__, __FUNCTION__, __LINE__);
@@ -769,25 +769,25 @@  discard block
 block discarded – undo
769 769
                 $model = EE_Registry::instance()->load_model($model_name);
770 770
                 $model_objects = $model->get_all($query_params);
771 771
 
772
-                $table_data[ $model_name ] = array();
772
+                $table_data[$model_name] = array();
773 773
                 foreach ($model_objects as $model_object) {
774 774
                     $model_data_array = array();
775 775
                     $fields = $model->field_settings();
776 776
                     foreach ($fields as $field) {
777
-                        $column_name = $field->get_nicename() . "[" . $field->get_name() . "]";
777
+                        $column_name = $field->get_nicename()."[".$field->get_name()."]";
778 778
                         if ($field instanceof EE_Datetime_Field) {
779 779
                             // $field->set_date_format('Y-m-d');
780 780
                             // $field->set_time_format('H:i:s');
781
-                            $model_data_array[ $column_name ] = $model_object->get_datetime(
781
+                            $model_data_array[$column_name] = $model_object->get_datetime(
782 782
                                 $field->get_name(),
783 783
                                 'Y-m-d',
784 784
                                 'H:i:s'
785 785
                             );
786 786
                         } else {
787
-                            $model_data_array[ $column_name ] = $model_object->get($field->get_name());
787
+                            $model_data_array[$column_name] = $model_object->get($field->get_name());
788 788
                         }
789 789
                     }
790
-                    $table_data[ $model_name ][] = $model_data_array;
790
+                    $table_data[$model_name][] = $model_data_array;
791 791
                 }
792 792
             }
793 793
         }
Please login to merge, or discard this patch.
core/db_classes/EE_CPT_Base.class.php 2 patches
Indentation   +428 added lines, -428 removed lines patch added patch discarded remove patch
@@ -14,432 +14,432 @@
 block discarded – undo
14 14
 abstract class EE_CPT_Base extends EE_Soft_Delete_Base_Class
15 15
 {
16 16
 
17
-    /**
18
-     * This is a property for holding cached feature images on CPT objects.  Cache's are set on the first
19
-     * "feature_image()" method call.  Each key in the array corresponds to the requested size.
20
-     *
21
-     * @var array
22
-     */
23
-    protected $_feature_image = array();
24
-
25
-    /**
26
-     * @var WP_Post the WP_Post that corresponds with this CPT model object
27
-     */
28
-    protected $_wp_post;
29
-
30
-
31
-    abstract public function wp_user();
32
-
33
-
34
-    /**
35
-     * Returns the WP post associated with this CPT model object. If this CPT is saved, fetches it
36
-     * from the DB. Otherwise, create an unsaved WP_POst object. Caches the post internally.
37
-     *
38
-     * @return WP_Post
39
-     */
40
-    public function wp_post()
41
-    {
42
-        global $wpdb;
43
-        if (! $this->_wp_post instanceof WP_Post) {
44
-            if ($this->ID()) {
45
-                $this->_wp_post = get_post($this->ID());
46
-            } else {
47
-                $simulated_db_result = new stdClass();
48
-                foreach ($this->get_model()->field_settings(true) as $field_name => $field_obj) {
49
-                    if (
50
-                        $this->get_model()->get_table_obj_by_alias($field_obj->get_table_alias())->get_table_name()
51
-                        === $wpdb->posts
52
-                    ) {
53
-                        $column = $field_obj->get_table_column();
54
-
55
-                        if ($field_obj instanceof EE_Datetime_Field) {
56
-                            $value_on_model_obj = $this->get_DateTime_object($field_name);
57
-                        } elseif ($field_obj->is_db_only_field()) {
58
-                            $value_on_model_obj = $field_obj->get_default_value();
59
-                        } else {
60
-                            $value_on_model_obj = $this->get_raw($field_name);
61
-                        }
62
-                        $simulated_db_result->{$column} = $field_obj->prepare_for_use_in_db($value_on_model_obj);
63
-                    }
64
-                }
65
-                $this->_wp_post = new WP_Post($simulated_db_result);
66
-            }
67
-            // and let's make retrieving the EE CPT object easy too
68
-            $classname = get_class($this);
69
-            if (! isset($this->_wp_post->{$classname})) {
70
-                $this->_wp_post->{$classname} = $this;
71
-            }
72
-        }
73
-        return $this->_wp_post;
74
-    }
75
-
76
-    /**
77
-     * When fetching a new value for a post field that uses the global $post for rendering,
78
-     * set the global $post temporarily to be this model object; and afterwards restore it
79
-     *
80
-     * @param string $fieldname
81
-     * @param bool   $pretty
82
-     * @param string $extra_cache_ref
83
-     * @return mixed
84
-     */
85
-    protected function _get_fresh_property($fieldname, $pretty = false, $extra_cache_ref = null)
86
-    {
87
-        global $post;
88
-
89
-        if (
90
-            $pretty
91
-            && (
92
-                ! (
93
-                    $post instanceof WP_Post
94
-                    && $post->ID
95
-                )
96
-                || (int) $post->ID !== $this->ID()
97
-            )
98
-            && $this->get_model()->field_settings_for($fieldname) instanceof EE_Post_Content_Field
99
-        ) {
100
-            $old_post = $post;
101
-            $post = $this->wp_post();
102
-            $return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
103
-            $post = $old_post;
104
-        } else {
105
-            $return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
106
-        }
107
-        return $return_value;
108
-    }
109
-
110
-    /**
111
-     * Adds to the specified event category. If it category doesn't exist, creates it.
112
-     *
113
-     * @param string $category_name
114
-     * @param string $category_description    optional
115
-     * @param int    $parent_term_taxonomy_id optional
116
-     * @return EE_Term_Taxonomy
117
-     */
118
-    public function add_event_category($category_name, $category_description = null, $parent_term_taxonomy_id = null)
119
-    {
120
-        return $this->get_model()->add_event_category(
121
-            $this,
122
-            $category_name,
123
-            $category_description,
124
-            $parent_term_taxonomy_id
125
-        );
126
-    }
127
-
128
-
129
-    /**
130
-     * Removes the event category by specified name from being related ot this event
131
-     *
132
-     * @param string $category_name
133
-     * @return bool
134
-     */
135
-    public function remove_event_category($category_name)
136
-    {
137
-        return $this->get_model()->remove_event_category($this, $category_name);
138
-    }
139
-
140
-
141
-    /**
142
-     * Removes the relation to the specified term taxonomy, and maintains the
143
-     * data integrity of the term taxonomy provided
144
-     *
145
-     * @param EE_Term_Taxonomy $term_taxonomy
146
-     * @return EE_Base_Class the relation was removed from
147
-     */
148
-    public function remove_relation_to_term_taxonomy($term_taxonomy)
149
-    {
150
-        if (! $term_taxonomy) {
151
-            EE_Error::add_error(
152
-                sprintf(
153
-                    esc_html__(
154
-                        "No Term_Taxonomy provided which to remove from model object of type %s and id %d",
155
-                        "event_espresso"
156
-                    ),
157
-                    get_class($this),
158
-                    $this->ID()
159
-                ),
160
-                __FILE__,
161
-                __FUNCTION__,
162
-                __LINE__
163
-            );
164
-            return null;
165
-        }
166
-        $term_taxonomy->set_count($term_taxonomy->count() - 1);
167
-        $term_taxonomy->save();
168
-        return $this->_remove_relation_to($term_taxonomy, 'Term_Taxonomy');
169
-    }
170
-
171
-
172
-    /**
173
-     * The main purpose of this method is to return the post type for the model object
174
-     *
175
-     * @access public
176
-     * @return string
177
-     */
178
-    public function post_type()
179
-    {
180
-        return $this->get_model()->post_type();
181
-    }
182
-
183
-
184
-    /**
185
-     * The main purpose of this method is to return the parent for the model object
186
-     *
187
-     * @access public
188
-     * @return int
189
-     */
190
-    public function parent()
191
-    {
192
-        return $this->get('parent');
193
-    }
194
-
195
-
196
-    /**
197
-     * return the _status property
198
-     *
199
-     * @return string
200
-     */
201
-    public function status()
202
-    {
203
-        return $this->get('status');
204
-    }
205
-
206
-
207
-    /**
208
-     * @param string $status
209
-     */
210
-    public function set_status($status)
211
-    {
212
-        $this->set('status', $status);
213
-    }
214
-
215
-
216
-    /**
217
-     * This calls the equivalent model method for retrieving the feature image which in turn is a wrapper for
218
-     * WordPress' get_the_post_thumbnail() function.
219
-     *
220
-     * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
221
-     * @access protected
222
-     * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
223
-     *                           representing width and height in pixels (i.e. array(32,32) ).
224
-     * @param string|array $attr Optional. Query string or array of attributes.
225
-     * @return string HTML image element
226
-     */
227
-    protected function _get_feature_image($size, $attr)
228
-    {
229
-        // first let's see if we already have the _feature_image property set AND if it has a cached element on it FOR the given size
230
-        $attr_key = is_array($attr) ? implode('_', $attr) : $attr;
231
-        $cache_key = is_array($size) ? implode('_', $size) . $attr_key : $size . $attr_key;
232
-        $this->_feature_image[ $cache_key ] = isset($this->_feature_image[ $cache_key ])
233
-            ? $this->_feature_image[ $cache_key ] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
234
-        return $this->_feature_image[ $cache_key ];
235
-    }
236
-
237
-
238
-    /**
239
-     * See _get_feature_image. Returns the HTML to display a featured image
240
-     *
241
-     * @param string       $size
242
-     * @param string|array $attr
243
-     * @return string of html
244
-     */
245
-    public function feature_image($size = 'thumbnail', $attr = '')
246
-    {
247
-        return $this->_get_feature_image($size, $attr);
248
-    }
249
-
250
-
251
-    /**
252
-     * This uses the wp "wp_get_attachment_image_src()" function to return the feature image for the current class
253
-     * using the given size params.
254
-     *
255
-     * @param  string|array $size can either be a string: 'thumbnail', 'medium', 'large', 'full' OR 2-item array
256
-     *                            representing width and height in pixels eg. array(32,32).
257
-     * @return string|boolean          the url of the image or false if not found
258
-     */
259
-    public function feature_image_url($size = 'thumbnail')
260
-    {
261
-        $attachment = wp_get_attachment_image_src(get_post_thumbnail_id($this->ID()), $size);
262
-        return ! empty($attachment) ? $attachment[0] : false;
263
-    }
264
-
265
-
266
-    /**
267
-     * This is a method for restoring this_obj using details from the given $revision_id
268
-     *
269
-     * @param int   $revision_id       ID of the revision we're getting data from
270
-     * @param array $related_obj_names if included this will be used to restore for related obj
271
-     *                                 if not included then we just do restore on the meta.
272
-     *                                 We will accept an array of related_obj_names for restoration here.
273
-     * @param array $where_query       You can optionally include an array of key=>value pairs
274
-     *                                 that allow you to further constrict the relation to being added.
275
-     *                                 However, keep in mind that the columns (keys) given
276
-     *                                 must match a column on the JOIN table and currently
277
-     *                                 only the HABTM models accept these additional conditions.
278
-     *                                 Also remember that if an exact match isn't found for these extra cols/val pairs,
279
-     *                                 then a NEW row is created in the join table.
280
-     *                                 This array is INDEXED by RELATED OBJ NAME (so it corresponds with the obj_names
281
-     *                                 sent);
282
-     * @return void
283
-     */
284
-    public function restore_revision($revision_id, $related_obj_names = array(), $where_query = array())
285
-    {
286
-        // get revision object
287
-        $revision_obj = $this->get_model()->get_one_by_ID($revision_id);
288
-        if ($revision_obj instanceof EE_CPT_Base) {
289
-            // no related_obj_name so we assume we're saving a revision on this object.
290
-            if (empty($related_obj_names)) {
291
-                $fields = $this->get_model()->get_meta_table_fields();
292
-                foreach ($fields as $field) {
293
-                    $this->set($field, $revision_obj->get($field));
294
-                }
295
-                $this->save();
296
-            }
297
-            $related_obj_names = (array) $related_obj_names;
298
-            foreach ($related_obj_names as $related_name) {
299
-                // related_obj_name so we're saving a revision on an object related to this object
300
-                // do we have $where_query params for this related object?  If we do then we include that.
301
-                $cols_n_values = isset($where_query[ $related_name ]) ? $where_query[ $related_name ] : array();
302
-                $where_params = ! empty($cols_n_values) ? array($cols_n_values) : array();
303
-                $related_objs = $this->get_many_related($related_name, $where_params);
304
-                $revision_related_objs = $revision_obj->get_many_related($related_name, $where_params);
305
-                // load helper
306
-                // remove related objs from this object that are not in revision
307
-                // array_diff *should* work cause I think objects are indexed by ID?
308
-                $related_to_remove = EEH_Array::object_array_diff($related_objs, $revision_related_objs);
309
-                foreach ($related_to_remove as $rr) {
310
-                    $this->_remove_relation_to($rr, $related_name, $cols_n_values);
311
-                }
312
-                // add all related objs attached to revision to this object
313
-                foreach ($revision_related_objs as $r_obj) {
314
-                    $this->_add_relation_to($r_obj, $related_name, $cols_n_values);
315
-                }
316
-            }
317
-        }
318
-    }
319
-
320
-
321
-    /**
322
-     * Wrapper for get_post_meta, http://codex.wordpress.org/Function_Reference/get_post_meta
323
-     *
324
-     * @param string  $meta_key
325
-     * @param boolean $single
326
-     * @return mixed <ul><li>If only $id is set it will return all meta values in an associative array.</li>
327
-     * <li>If $single is set to false, or left blank, the function returns an array containing all values of the
328
-     * specified key.</li>
329
-     * <li>If $single is set to true, the function returns the first value of the specified key (not in an
330
-     * array</li></ul>
331
-     */
332
-    public function get_post_meta($meta_key = null, $single = false)
333
-    {
334
-        return get_post_meta($this->ID(), $meta_key, $single);
335
-    }
336
-
337
-
338
-    /**
339
-     * Wrapper for update_post_meta, http://codex.wordpress.org/Function_Reference/update_post_meta
340
-     *
341
-     * @param string $meta_key
342
-     * @param mixed  $meta_value
343
-     * @param mixed  $prev_value
344
-     * @return mixed Returns meta_id if the meta doesn't exist, otherwise returns true on success and false on failure.
345
-     *               NOTE: If the meta_value passed to this function is the same as the value that is already in the
346
-     *               database, this function returns false.
347
-     */
348
-    public function update_post_meta($meta_key, $meta_value, $prev_value = null)
349
-    {
350
-        if (! $this->ID()) {
351
-            $this->save();
352
-        }
353
-        return update_post_meta($this->ID(), $meta_key, $meta_value, $prev_value);
354
-    }
355
-
356
-
357
-    /**
358
-     * Wrapper for add_post_meta, http://codex.wordpress.org/Function_Reference/add_post_meta
359
-     *
360
-     * @param mixed $meta_key
361
-     * @param mixed $meta_value
362
-     * @param bool  $unique . If postmeta for this $meta_key already exists, whether to add an additional item or not
363
-     * @return boolean Boolean true, except if the $unique argument was set to true and a custom field with the given
364
-     *                 key already exists, in which case false is returned.
365
-     */
366
-    public function add_post_meta($meta_key, $meta_value, $unique = false)
367
-    {
368
-        if ($this->ID()) {
369
-            $this->save();
370
-        }
371
-        return add_post_meta($this->ID(), $meta_key, $meta_value, $unique);
372
-    }
373
-
374
-
375
-    /**
376
-     * Wrapper for delete_post_meta, http://codex.wordpress.org/Function_Reference/delete_post_meta
377
-     *
378
-     * @param mixed $meta_key
379
-     * @param mixed $meta_value
380
-     * @return boolean False for failure. True for success.
381
-     */
382
-    public function delete_post_meta($meta_key, $meta_value = '')
383
-    {
384
-        if (! $this->ID()) {
385
-            // there are obviously no postmetas for this if it's not saved
386
-            // so let's just report this as a success
387
-            return true;
388
-        }
389
-        return delete_post_meta($this->ID(), $meta_key, $meta_value);
390
-    }
391
-
392
-
393
-    /**
394
-     * Gets the URL for viewing this event on the front-end
395
-     *
396
-     * @return string
397
-     */
398
-    public function get_permalink()
399
-    {
400
-        return get_permalink($this->ID());
401
-    }
402
-
403
-
404
-    /**
405
-     * Gets all the term-taxonomies for this CPT
406
-     *
407
-     * @param array $query_params
408
-     * @return EE_Term_Taxonomy
409
-     */
410
-    public function term_taxonomies($query_params = array())
411
-    {
412
-        return $this->get_many_related('Term_Taxonomy', $query_params);
413
-    }
414
-
415
-
416
-    /**
417
-     * @return mixed
418
-     */
419
-    public function get_custom_post_statuses()
420
-    {
421
-        return $this->get_model()->get_custom_post_statuses();
422
-    }
423
-
424
-
425
-    /**
426
-     * @return mixed
427
-     */
428
-    public function get_all_post_statuses()
429
-    {
430
-        return $this->get_model()->get_status_array();
431
-    }
432
-
433
-
434
-    /**
435
-     * Don't serialize the WP Post. That's just duplicate data and we want to avoid recursion
436
-     *
437
-     * @return array
438
-     */
439
-    public function __sleep()
440
-    {
441
-        $properties_to_serialize = parent::__sleep();
442
-        $properties_to_serialize = array_diff($properties_to_serialize, array('_wp_post'));
443
-        return $properties_to_serialize;
444
-    }
17
+	/**
18
+	 * This is a property for holding cached feature images on CPT objects.  Cache's are set on the first
19
+	 * "feature_image()" method call.  Each key in the array corresponds to the requested size.
20
+	 *
21
+	 * @var array
22
+	 */
23
+	protected $_feature_image = array();
24
+
25
+	/**
26
+	 * @var WP_Post the WP_Post that corresponds with this CPT model object
27
+	 */
28
+	protected $_wp_post;
29
+
30
+
31
+	abstract public function wp_user();
32
+
33
+
34
+	/**
35
+	 * Returns the WP post associated with this CPT model object. If this CPT is saved, fetches it
36
+	 * from the DB. Otherwise, create an unsaved WP_POst object. Caches the post internally.
37
+	 *
38
+	 * @return WP_Post
39
+	 */
40
+	public function wp_post()
41
+	{
42
+		global $wpdb;
43
+		if (! $this->_wp_post instanceof WP_Post) {
44
+			if ($this->ID()) {
45
+				$this->_wp_post = get_post($this->ID());
46
+			} else {
47
+				$simulated_db_result = new stdClass();
48
+				foreach ($this->get_model()->field_settings(true) as $field_name => $field_obj) {
49
+					if (
50
+						$this->get_model()->get_table_obj_by_alias($field_obj->get_table_alias())->get_table_name()
51
+						=== $wpdb->posts
52
+					) {
53
+						$column = $field_obj->get_table_column();
54
+
55
+						if ($field_obj instanceof EE_Datetime_Field) {
56
+							$value_on_model_obj = $this->get_DateTime_object($field_name);
57
+						} elseif ($field_obj->is_db_only_field()) {
58
+							$value_on_model_obj = $field_obj->get_default_value();
59
+						} else {
60
+							$value_on_model_obj = $this->get_raw($field_name);
61
+						}
62
+						$simulated_db_result->{$column} = $field_obj->prepare_for_use_in_db($value_on_model_obj);
63
+					}
64
+				}
65
+				$this->_wp_post = new WP_Post($simulated_db_result);
66
+			}
67
+			// and let's make retrieving the EE CPT object easy too
68
+			$classname = get_class($this);
69
+			if (! isset($this->_wp_post->{$classname})) {
70
+				$this->_wp_post->{$classname} = $this;
71
+			}
72
+		}
73
+		return $this->_wp_post;
74
+	}
75
+
76
+	/**
77
+	 * When fetching a new value for a post field that uses the global $post for rendering,
78
+	 * set the global $post temporarily to be this model object; and afterwards restore it
79
+	 *
80
+	 * @param string $fieldname
81
+	 * @param bool   $pretty
82
+	 * @param string $extra_cache_ref
83
+	 * @return mixed
84
+	 */
85
+	protected function _get_fresh_property($fieldname, $pretty = false, $extra_cache_ref = null)
86
+	{
87
+		global $post;
88
+
89
+		if (
90
+			$pretty
91
+			&& (
92
+				! (
93
+					$post instanceof WP_Post
94
+					&& $post->ID
95
+				)
96
+				|| (int) $post->ID !== $this->ID()
97
+			)
98
+			&& $this->get_model()->field_settings_for($fieldname) instanceof EE_Post_Content_Field
99
+		) {
100
+			$old_post = $post;
101
+			$post = $this->wp_post();
102
+			$return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
103
+			$post = $old_post;
104
+		} else {
105
+			$return_value = parent::_get_fresh_property($fieldname, $pretty, $extra_cache_ref);
106
+		}
107
+		return $return_value;
108
+	}
109
+
110
+	/**
111
+	 * Adds to the specified event category. If it category doesn't exist, creates it.
112
+	 *
113
+	 * @param string $category_name
114
+	 * @param string $category_description    optional
115
+	 * @param int    $parent_term_taxonomy_id optional
116
+	 * @return EE_Term_Taxonomy
117
+	 */
118
+	public function add_event_category($category_name, $category_description = null, $parent_term_taxonomy_id = null)
119
+	{
120
+		return $this->get_model()->add_event_category(
121
+			$this,
122
+			$category_name,
123
+			$category_description,
124
+			$parent_term_taxonomy_id
125
+		);
126
+	}
127
+
128
+
129
+	/**
130
+	 * Removes the event category by specified name from being related ot this event
131
+	 *
132
+	 * @param string $category_name
133
+	 * @return bool
134
+	 */
135
+	public function remove_event_category($category_name)
136
+	{
137
+		return $this->get_model()->remove_event_category($this, $category_name);
138
+	}
139
+
140
+
141
+	/**
142
+	 * Removes the relation to the specified term taxonomy, and maintains the
143
+	 * data integrity of the term taxonomy provided
144
+	 *
145
+	 * @param EE_Term_Taxonomy $term_taxonomy
146
+	 * @return EE_Base_Class the relation was removed from
147
+	 */
148
+	public function remove_relation_to_term_taxonomy($term_taxonomy)
149
+	{
150
+		if (! $term_taxonomy) {
151
+			EE_Error::add_error(
152
+				sprintf(
153
+					esc_html__(
154
+						"No Term_Taxonomy provided which to remove from model object of type %s and id %d",
155
+						"event_espresso"
156
+					),
157
+					get_class($this),
158
+					$this->ID()
159
+				),
160
+				__FILE__,
161
+				__FUNCTION__,
162
+				__LINE__
163
+			);
164
+			return null;
165
+		}
166
+		$term_taxonomy->set_count($term_taxonomy->count() - 1);
167
+		$term_taxonomy->save();
168
+		return $this->_remove_relation_to($term_taxonomy, 'Term_Taxonomy');
169
+	}
170
+
171
+
172
+	/**
173
+	 * The main purpose of this method is to return the post type for the model object
174
+	 *
175
+	 * @access public
176
+	 * @return string
177
+	 */
178
+	public function post_type()
179
+	{
180
+		return $this->get_model()->post_type();
181
+	}
182
+
183
+
184
+	/**
185
+	 * The main purpose of this method is to return the parent for the model object
186
+	 *
187
+	 * @access public
188
+	 * @return int
189
+	 */
190
+	public function parent()
191
+	{
192
+		return $this->get('parent');
193
+	}
194
+
195
+
196
+	/**
197
+	 * return the _status property
198
+	 *
199
+	 * @return string
200
+	 */
201
+	public function status()
202
+	{
203
+		return $this->get('status');
204
+	}
205
+
206
+
207
+	/**
208
+	 * @param string $status
209
+	 */
210
+	public function set_status($status)
211
+	{
212
+		$this->set('status', $status);
213
+	}
214
+
215
+
216
+	/**
217
+	 * This calls the equivalent model method for retrieving the feature image which in turn is a wrapper for
218
+	 * WordPress' get_the_post_thumbnail() function.
219
+	 *
220
+	 * @link   http://codex.wordpress.org/Function_Reference/get_the_post_thumbnail
221
+	 * @access protected
222
+	 * @param string|array $size (optional) Image size. Defaults to 'post-thumbnail' but can also be a 2-item array
223
+	 *                           representing width and height in pixels (i.e. array(32,32) ).
224
+	 * @param string|array $attr Optional. Query string or array of attributes.
225
+	 * @return string HTML image element
226
+	 */
227
+	protected function _get_feature_image($size, $attr)
228
+	{
229
+		// first let's see if we already have the _feature_image property set AND if it has a cached element on it FOR the given size
230
+		$attr_key = is_array($attr) ? implode('_', $attr) : $attr;
231
+		$cache_key = is_array($size) ? implode('_', $size) . $attr_key : $size . $attr_key;
232
+		$this->_feature_image[ $cache_key ] = isset($this->_feature_image[ $cache_key ])
233
+			? $this->_feature_image[ $cache_key ] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
234
+		return $this->_feature_image[ $cache_key ];
235
+	}
236
+
237
+
238
+	/**
239
+	 * See _get_feature_image. Returns the HTML to display a featured image
240
+	 *
241
+	 * @param string       $size
242
+	 * @param string|array $attr
243
+	 * @return string of html
244
+	 */
245
+	public function feature_image($size = 'thumbnail', $attr = '')
246
+	{
247
+		return $this->_get_feature_image($size, $attr);
248
+	}
249
+
250
+
251
+	/**
252
+	 * This uses the wp "wp_get_attachment_image_src()" function to return the feature image for the current class
253
+	 * using the given size params.
254
+	 *
255
+	 * @param  string|array $size can either be a string: 'thumbnail', 'medium', 'large', 'full' OR 2-item array
256
+	 *                            representing width and height in pixels eg. array(32,32).
257
+	 * @return string|boolean          the url of the image or false if not found
258
+	 */
259
+	public function feature_image_url($size = 'thumbnail')
260
+	{
261
+		$attachment = wp_get_attachment_image_src(get_post_thumbnail_id($this->ID()), $size);
262
+		return ! empty($attachment) ? $attachment[0] : false;
263
+	}
264
+
265
+
266
+	/**
267
+	 * This is a method for restoring this_obj using details from the given $revision_id
268
+	 *
269
+	 * @param int   $revision_id       ID of the revision we're getting data from
270
+	 * @param array $related_obj_names if included this will be used to restore for related obj
271
+	 *                                 if not included then we just do restore on the meta.
272
+	 *                                 We will accept an array of related_obj_names for restoration here.
273
+	 * @param array $where_query       You can optionally include an array of key=>value pairs
274
+	 *                                 that allow you to further constrict the relation to being added.
275
+	 *                                 However, keep in mind that the columns (keys) given
276
+	 *                                 must match a column on the JOIN table and currently
277
+	 *                                 only the HABTM models accept these additional conditions.
278
+	 *                                 Also remember that if an exact match isn't found for these extra cols/val pairs,
279
+	 *                                 then a NEW row is created in the join table.
280
+	 *                                 This array is INDEXED by RELATED OBJ NAME (so it corresponds with the obj_names
281
+	 *                                 sent);
282
+	 * @return void
283
+	 */
284
+	public function restore_revision($revision_id, $related_obj_names = array(), $where_query = array())
285
+	{
286
+		// get revision object
287
+		$revision_obj = $this->get_model()->get_one_by_ID($revision_id);
288
+		if ($revision_obj instanceof EE_CPT_Base) {
289
+			// no related_obj_name so we assume we're saving a revision on this object.
290
+			if (empty($related_obj_names)) {
291
+				$fields = $this->get_model()->get_meta_table_fields();
292
+				foreach ($fields as $field) {
293
+					$this->set($field, $revision_obj->get($field));
294
+				}
295
+				$this->save();
296
+			}
297
+			$related_obj_names = (array) $related_obj_names;
298
+			foreach ($related_obj_names as $related_name) {
299
+				// related_obj_name so we're saving a revision on an object related to this object
300
+				// do we have $where_query params for this related object?  If we do then we include that.
301
+				$cols_n_values = isset($where_query[ $related_name ]) ? $where_query[ $related_name ] : array();
302
+				$where_params = ! empty($cols_n_values) ? array($cols_n_values) : array();
303
+				$related_objs = $this->get_many_related($related_name, $where_params);
304
+				$revision_related_objs = $revision_obj->get_many_related($related_name, $where_params);
305
+				// load helper
306
+				// remove related objs from this object that are not in revision
307
+				// array_diff *should* work cause I think objects are indexed by ID?
308
+				$related_to_remove = EEH_Array::object_array_diff($related_objs, $revision_related_objs);
309
+				foreach ($related_to_remove as $rr) {
310
+					$this->_remove_relation_to($rr, $related_name, $cols_n_values);
311
+				}
312
+				// add all related objs attached to revision to this object
313
+				foreach ($revision_related_objs as $r_obj) {
314
+					$this->_add_relation_to($r_obj, $related_name, $cols_n_values);
315
+				}
316
+			}
317
+		}
318
+	}
319
+
320
+
321
+	/**
322
+	 * Wrapper for get_post_meta, http://codex.wordpress.org/Function_Reference/get_post_meta
323
+	 *
324
+	 * @param string  $meta_key
325
+	 * @param boolean $single
326
+	 * @return mixed <ul><li>If only $id is set it will return all meta values in an associative array.</li>
327
+	 * <li>If $single is set to false, or left blank, the function returns an array containing all values of the
328
+	 * specified key.</li>
329
+	 * <li>If $single is set to true, the function returns the first value of the specified key (not in an
330
+	 * array</li></ul>
331
+	 */
332
+	public function get_post_meta($meta_key = null, $single = false)
333
+	{
334
+		return get_post_meta($this->ID(), $meta_key, $single);
335
+	}
336
+
337
+
338
+	/**
339
+	 * Wrapper for update_post_meta, http://codex.wordpress.org/Function_Reference/update_post_meta
340
+	 *
341
+	 * @param string $meta_key
342
+	 * @param mixed  $meta_value
343
+	 * @param mixed  $prev_value
344
+	 * @return mixed Returns meta_id if the meta doesn't exist, otherwise returns true on success and false on failure.
345
+	 *               NOTE: If the meta_value passed to this function is the same as the value that is already in the
346
+	 *               database, this function returns false.
347
+	 */
348
+	public function update_post_meta($meta_key, $meta_value, $prev_value = null)
349
+	{
350
+		if (! $this->ID()) {
351
+			$this->save();
352
+		}
353
+		return update_post_meta($this->ID(), $meta_key, $meta_value, $prev_value);
354
+	}
355
+
356
+
357
+	/**
358
+	 * Wrapper for add_post_meta, http://codex.wordpress.org/Function_Reference/add_post_meta
359
+	 *
360
+	 * @param mixed $meta_key
361
+	 * @param mixed $meta_value
362
+	 * @param bool  $unique . If postmeta for this $meta_key already exists, whether to add an additional item or not
363
+	 * @return boolean Boolean true, except if the $unique argument was set to true and a custom field with the given
364
+	 *                 key already exists, in which case false is returned.
365
+	 */
366
+	public function add_post_meta($meta_key, $meta_value, $unique = false)
367
+	{
368
+		if ($this->ID()) {
369
+			$this->save();
370
+		}
371
+		return add_post_meta($this->ID(), $meta_key, $meta_value, $unique);
372
+	}
373
+
374
+
375
+	/**
376
+	 * Wrapper for delete_post_meta, http://codex.wordpress.org/Function_Reference/delete_post_meta
377
+	 *
378
+	 * @param mixed $meta_key
379
+	 * @param mixed $meta_value
380
+	 * @return boolean False for failure. True for success.
381
+	 */
382
+	public function delete_post_meta($meta_key, $meta_value = '')
383
+	{
384
+		if (! $this->ID()) {
385
+			// there are obviously no postmetas for this if it's not saved
386
+			// so let's just report this as a success
387
+			return true;
388
+		}
389
+		return delete_post_meta($this->ID(), $meta_key, $meta_value);
390
+	}
391
+
392
+
393
+	/**
394
+	 * Gets the URL for viewing this event on the front-end
395
+	 *
396
+	 * @return string
397
+	 */
398
+	public function get_permalink()
399
+	{
400
+		return get_permalink($this->ID());
401
+	}
402
+
403
+
404
+	/**
405
+	 * Gets all the term-taxonomies for this CPT
406
+	 *
407
+	 * @param array $query_params
408
+	 * @return EE_Term_Taxonomy
409
+	 */
410
+	public function term_taxonomies($query_params = array())
411
+	{
412
+		return $this->get_many_related('Term_Taxonomy', $query_params);
413
+	}
414
+
415
+
416
+	/**
417
+	 * @return mixed
418
+	 */
419
+	public function get_custom_post_statuses()
420
+	{
421
+		return $this->get_model()->get_custom_post_statuses();
422
+	}
423
+
424
+
425
+	/**
426
+	 * @return mixed
427
+	 */
428
+	public function get_all_post_statuses()
429
+	{
430
+		return $this->get_model()->get_status_array();
431
+	}
432
+
433
+
434
+	/**
435
+	 * Don't serialize the WP Post. That's just duplicate data and we want to avoid recursion
436
+	 *
437
+	 * @return array
438
+	 */
439
+	public function __sleep()
440
+	{
441
+		$properties_to_serialize = parent::__sleep();
442
+		$properties_to_serialize = array_diff($properties_to_serialize, array('_wp_post'));
443
+		return $properties_to_serialize;
444
+	}
445 445
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -40,7 +40,7 @@  discard block
 block discarded – undo
40 40
     public function wp_post()
41 41
     {
42 42
         global $wpdb;
43
-        if (! $this->_wp_post instanceof WP_Post) {
43
+        if ( ! $this->_wp_post instanceof WP_Post) {
44 44
             if ($this->ID()) {
45 45
                 $this->_wp_post = get_post($this->ID());
46 46
             } else {
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
             }
67 67
             // and let's make retrieving the EE CPT object easy too
68 68
             $classname = get_class($this);
69
-            if (! isset($this->_wp_post->{$classname})) {
69
+            if ( ! isset($this->_wp_post->{$classname})) {
70 70
                 $this->_wp_post->{$classname} = $this;
71 71
             }
72 72
         }
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
      */
148 148
     public function remove_relation_to_term_taxonomy($term_taxonomy)
149 149
     {
150
-        if (! $term_taxonomy) {
150
+        if ( ! $term_taxonomy) {
151 151
             EE_Error::add_error(
152 152
                 sprintf(
153 153
                     esc_html__(
@@ -228,10 +228,10 @@  discard block
 block discarded – undo
228 228
     {
229 229
         // first let's see if we already have the _feature_image property set AND if it has a cached element on it FOR the given size
230 230
         $attr_key = is_array($attr) ? implode('_', $attr) : $attr;
231
-        $cache_key = is_array($size) ? implode('_', $size) . $attr_key : $size . $attr_key;
232
-        $this->_feature_image[ $cache_key ] = isset($this->_feature_image[ $cache_key ])
233
-            ? $this->_feature_image[ $cache_key ] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
234
-        return $this->_feature_image[ $cache_key ];
231
+        $cache_key = is_array($size) ? implode('_', $size).$attr_key : $size.$attr_key;
232
+        $this->_feature_image[$cache_key] = isset($this->_feature_image[$cache_key])
233
+            ? $this->_feature_image[$cache_key] : $this->get_model()->get_feature_image($this->ID(), $size, $attr);
234
+        return $this->_feature_image[$cache_key];
235 235
     }
236 236
 
237 237
 
@@ -298,7 +298,7 @@  discard block
 block discarded – undo
298 298
             foreach ($related_obj_names as $related_name) {
299 299
                 // related_obj_name so we're saving a revision on an object related to this object
300 300
                 // do we have $where_query params for this related object?  If we do then we include that.
301
-                $cols_n_values = isset($where_query[ $related_name ]) ? $where_query[ $related_name ] : array();
301
+                $cols_n_values = isset($where_query[$related_name]) ? $where_query[$related_name] : array();
302 302
                 $where_params = ! empty($cols_n_values) ? array($cols_n_values) : array();
303 303
                 $related_objs = $this->get_many_related($related_name, $where_params);
304 304
                 $revision_related_objs = $revision_obj->get_many_related($related_name, $where_params);
@@ -347,7 +347,7 @@  discard block
 block discarded – undo
347 347
      */
348 348
     public function update_post_meta($meta_key, $meta_value, $prev_value = null)
349 349
     {
350
-        if (! $this->ID()) {
350
+        if ( ! $this->ID()) {
351 351
             $this->save();
352 352
         }
353 353
         return update_post_meta($this->ID(), $meta_key, $meta_value, $prev_value);
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
      */
382 382
     public function delete_post_meta($meta_key, $meta_value = '')
383 383
     {
384
-        if (! $this->ID()) {
384
+        if ( ! $this->ID()) {
385 385
             // there are obviously no postmetas for this if it's not saved
386 386
             // so let's just report this as a success
387 387
             return true;
Please login to merge, or discard this patch.
core/db_classes/EE_CSV.class.php 2 patches
Indentation   +669 added lines, -669 removed lines patch added patch discarded remove patch
@@ -16,673 +16,673 @@
 block discarded – undo
16 16
 class EE_CSV
17 17
 {
18 18
 
19
-    // instance of the EE_CSV object
20
-    private static $_instance = null;
21
-
22
-
23
-    // multidimensional array to store update & error messages
24
-    // var $_notices = array( 'updates' => array(), 'errors' => array() );
25
-
26
-
27
-    private $_primary_keys;
28
-
29
-    /**
30
-     *
31
-     * @var EE_Registry
32
-     */
33
-    private $EE;
34
-    /**
35
-     * string used for 1st cell in exports, which indicates that the following 2 rows will be metadata keys and values
36
-     */
37
-    const metadata_header = 'Event Espresso Export Meta Data';
38
-
39
-    /**
40
-     *        private constructor to prevent direct creation
41
-     *
42
-     * @Constructor
43
-     * @access private
44
-     * @return void
45
-     */
46
-    private function __construct()
47
-    {
48
-        global $wpdb;
49
-
50
-        $this->_primary_keys = array(
51
-            $wpdb->prefix . 'esp_answer'                  => array('ANS_ID'),
52
-            $wpdb->prefix . 'esp_attendee'                => array('ATT_ID'),
53
-            $wpdb->prefix . 'esp_datetime'                => array('DTT_ID'),
54
-            $wpdb->prefix . 'esp_event_question_group'    => array('EQG_ID'),
55
-            $wpdb->prefix . 'esp_message_template'        => array('MTP_ID'),
56
-            $wpdb->prefix . 'esp_payment'                 => array('PAY_ID'),
57
-            $wpdb->prefix . 'esp_price'                   => array('PRC_ID'),
58
-            $wpdb->prefix . 'esp_price_type'              => array('PRT_ID'),
59
-            $wpdb->prefix . 'esp_question'                => array('QST_ID'),
60
-            $wpdb->prefix . 'esp_question_group'          => array('QSG_ID'),
61
-            $wpdb->prefix . 'esp_question_group_question' => array('QGQ_ID'),
62
-            $wpdb->prefix . 'esp_question_option'         => array('QSO_ID'),
63
-            $wpdb->prefix . 'esp_registration'            => array('REG_ID'),
64
-            $wpdb->prefix . 'esp_status'                  => array('STS_ID'),
65
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
66
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
67
-            $wpdb->prefix . 'events_detail'               => array('id'),
68
-            $wpdb->prefix . 'events_category_detail'      => array('id'),
69
-            $wpdb->prefix . 'events_category_rel'         => array('id'),
70
-            $wpdb->prefix . 'events_venue'                => array('id'),
71
-            $wpdb->prefix . 'events_venue_rel'            => array('emeta_id'),
72
-            $wpdb->prefix . 'events_locale'               => array('id'),
73
-            $wpdb->prefix . 'events_locale_rel'           => array('id'),
74
-            $wpdb->prefix . 'events_personnel'            => array('id'),
75
-            $wpdb->prefix . 'events_personnel_rel'        => array('id'),
76
-        );
77
-    }
78
-
79
-
80
-    /**
81
-     *        @ singleton method used to instantiate class object
82
-     *        @ access public
83
-     *
84
-     * @return EE_CSV
85
-     */
86
-    public static function instance()
87
-    {
88
-        // check if class object is instantiated
89
-        if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_CSV)) {
90
-            self::$_instance = new self();
91
-        }
92
-        return self::$_instance;
93
-    }
94
-
95
-    /**
96
-     * Opens a unicode or utf file (normal file_get_contents has difficulty readin ga unicode file. @see
97
-     * http://stackoverflow.com/questions/15092764/how-to-read-unicode-text-file-in-php
98
-     *
99
-     * @param string $file_path
100
-     * @return string
101
-     * @throws EE_Error
102
-     */
103
-    private function read_unicode_file($file_path)
104
-    {
105
-        $fc = "";
106
-        $fh = fopen($file_path, "rb");
107
-        if (! $fh) {
108
-            throw new EE_Error(sprintf(esc_html__("Cannot open file for read: %s<br>\n", 'event_espresso'), $file_path));
109
-        }
110
-        $flen = filesize($file_path);
111
-        $bc = fread($fh, $flen);
112
-        for ($i = 0; $i < $flen; $i++) {
113
-            $c = substr($bc, $i, 1);
114
-            if ((ord($c) != 0) && (ord($c) != 13)) {
115
-                $fc = $fc . $c;
116
-            }
117
-        }
118
-        if ((ord(substr($fc, 0, 1)) == 255) && (ord(substr($fc, 1, 1)) == 254)) {
119
-            $fc = substr($fc, 2);
120
-        }
121
-        return ($fc);
122
-    }
123
-
124
-
125
-    /**
126
-     * Generic CSV-functionality to turn an entire CSV file into a single array that's
127
-     * NOT in a specific format to EE. It's just a 2-level array, with top-level arrays
128
-     * representing each row in the CSV file, and the second-level arrays being each column in that row
129
-     *
130
-     * @param string $path_to_file
131
-     * @return array of arrays. Top-level array has rows, second-level array has each item
132
-     */
133
-    public function import_csv_to_multi_dimensional_array($path_to_file)
134
-    {
135
-        // needed to deal with Mac line endings
136
-        ini_set('auto_detect_line_endings', true);
137
-
138
-        // because fgetcsv does not correctly deal with backslashed quotes such as \"
139
-        // we'll read the file into a string
140
-        $file_contents = $this->read_unicode_file($path_to_file);
141
-        // replace backslashed quotes with CSV enclosures
142
-        $file_contents = str_replace('\\"', '"""', $file_contents);
143
-        // HEY YOU! PUT THAT FILE BACK!!!
144
-        file_put_contents($path_to_file, $file_contents);
145
-
146
-        if (($file_handle = fopen($path_to_file, "r")) !== false) {
147
-            # Set the parent multidimensional array key to 0.
148
-            $nn = 0;
149
-            $csvarray = array();
150
-
151
-            // in PHP 5.3 fgetcsv accepts a 5th parameter, but the pre 5.3 versions of fgetcsv choke if passed more than 4 - is that crazy or what?
152
-            if (version_compare(PHP_VERSION, '5.3.0') < 0) {
153
-                //  PHP 5.2- version
154
-                // loop through each row of the file
155
-                while (($data = fgetcsv($file_handle, 0, ',', '"')) !== false) {
156
-                    $csvarray[] = $data;
157
-                }
158
-            } else {
159
-                // loop through each row of the file
160
-                while (($data = fgetcsv($file_handle, 0, ',', '"', '\\')) !== false) {
161
-                    $csvarray[] = $data;
162
-                }
163
-            }
164
-            # Close the File.
165
-            fclose($file_handle);
166
-            return $csvarray;
167
-        } else {
168
-            EE_Error::add_error(
169
-                sprintf(esc_html__("An error occurred - the file: %s could not opened.", "event_espresso"), $path_to_file),
170
-                __FILE__,
171
-                __FUNCTION__,
172
-                __LINE__
173
-            );
174
-            return false;
175
-        }
176
-    }
177
-
178
-
179
-    /**
180
-     * @Import contents of csv file and store values in an array to be manipulated by other functions
181
-     * @access public
182
-     * @param string  $path_to_file         - the csv file to be imported including the path to it's location.
183
-     *                                      If $model_name is provided, assumes that each row in the CSV represents a
184
-     *                                      model object for that model If $model_name ISN'T provided, assumes that
185
-     *                                      before model object data, there is a row where the first entry is simply
186
-     *                                      'MODEL', and next entry is the model's name, (untranslated) like Event, and
187
-     *                                      then maybe a row of headers, and then the model data. Eg.
188
-     *                                      '<br>MODEL,Event,<br>EVT_ID,EVT_name,...<br>1,Monkey
189
-     *                                      Party,...<br>2,Llamarama,...<br>MODEL,Venue,<br>VNU_ID,VNU_name<br>1,The
190
-     *                                      Forest
191
-     * @param string  $model_name           model name if we know what model we're importing
192
-     * @param boolean $first_row_is_headers - whether the first row of data is headers or not - TRUE = headers, FALSE =
193
-     *                                      data
194
-     * @return mixed - array on success - multi dimensional with headers as keys (if headers exist) OR string on fail -
195
-     *               error message like the following array('Event'=>array( array('EVT_ID'=>1,'EVT_name'=>'bob
196
-     *               party',...), array('EVT_ID'=>2,'EVT_name'=>'llamarama',...),
197
-     *                                      ...
198
-     *                                      )
199
-     *                                      'Venue'=>array(
200
-     *                                      array('VNU_ID'=>1,'VNU_name'=>'the shack',...),
201
-     *                                      array('VNU_ID'=>2,'VNU_name'=>'tree house',...),
202
-     *                                      ...
203
-     *                                      )
204
-     *                                      ...
205
-     *                                      )
206
-     */
207
-    public function import_csv_to_model_data_array($path_to_file, $model_name = false, $first_row_is_headers = true)
208
-    {
209
-        $multi_dimensional_array = $this->import_csv_to_multi_dimensional_array($path_to_file);
210
-        if (! $multi_dimensional_array) {
211
-            return false;
212
-        }
213
-        // gotta start somewhere
214
-        $row = 1;
215
-        // array to store csv data in
216
-        $ee_formatted_data = array();
217
-        // array to store headers (column names)
218
-        $headers = array();
219
-        foreach ($multi_dimensional_array as $data) {
220
-            // if first cell is MODEL, then second cell is the MODEL name
221
-            if ($data[0] == 'MODEL') {
222
-                $model_name = $data[1];
223
-                // don't bother looking for model data in this row. The rest of this
224
-                // row should be blank
225
-                // AND pretend this is the first row again
226
-                $row = 1;
227
-                // reset headers
228
-                $headers = array();
229
-                continue;
230
-            }
231
-            if (strpos($data[0], EE_CSV::metadata_header) !== false) {
232
-                $model_name = EE_CSV::metadata_header;
233
-                // store like model data, we just won't try importing it etc.
234
-                $row = 1;
235
-                continue;
236
-            }
237
-
238
-
239
-            // how many columns are there?
240
-            $columns = count($data);
241
-
242
-            $model_entry = array();
243
-            // loop through each column
244
-            for ($i = 0; $i < $columns; $i++) {
245
-                // replace csv_enclosures with backslashed quotes
246
-                $data[ $i ] = str_replace('"""', '\\"', $data[ $i ]);
247
-                // do we need to grab the column names?
248
-                if ($row === 1) {
249
-                    if ($first_row_is_headers) {
250
-                        // store the column names to use for keys
251
-                        $column_name = $data[ $i ];
252
-                        // check it's not blank... sometimes CSV editign programs adda bunch of empty columns onto the end...
253
-                        if (! $column_name) {
254
-                            continue;
255
-                        }
256
-                        $matches = array();
257
-                        if ($model_name == EE_CSV::metadata_header) {
258
-                            $headers[ $i ] = $column_name;
259
-                        } else {
260
-                            // now get the db table name from it (the part between square brackets)
261
-                            $success = preg_match('~(.*)\[(.*)\]~', $column_name, $matches);
262
-                            if (! $success) {
263
-                                EE_Error::add_error(
264
-                                    sprintf(
265
-                                        esc_html__(
266
-                                            "The column titled %s is invalid for importing. It must be be in the format of 'Nice Name[model_field_name]' in row %s",
267
-                                            "event_espresso"
268
-                                        ),
269
-                                        $column_name,
270
-                                        implode(",", $data)
271
-                                    ),
272
-                                    __FILE__,
273
-                                    __FUNCTION__,
274
-                                    __LINE__
275
-                                );
276
-                                return false;
277
-                            }
278
-                            $headers[ $i ] = $matches[2];
279
-                        }
280
-                    } else {
281
-                        // no column names means our final array will just use counters for keys
282
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
283
-                        $headers[ $i ] = $i;
284
-                    }
285
-                    // and we need to store csv data
286
-                } else {
287
-                    // this column isn' ta header, store it if there is a header for it
288
-                    if (isset($headers[ $i ])) {
289
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
290
-                    }
291
-                }
292
-            }
293
-            // save the row's data IF it's a non-header-row
294
-            if (! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
-                $ee_formatted_data[ $model_name ][] = $model_entry;
296
-            }
297
-            // advance to next row
298
-            $row++;
299
-        }
300
-
301
-        // delete the uploaded file
302
-        unlink($path_to_file);
303
-        // echo '<pre style="height:auto;border:2px solid lightblue;">' . print_r( $ee_formatted_data, TRUE ) . '</pre><br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>';
304
-        // die();
305
-
306
-        // it's good to give back
307
-        return $ee_formatted_data;
308
-    }
309
-
310
-
311
-    public function save_csv_to_db($csv_data_array, $model_name = false)
312
-    {
313
-        EE_Error::doing_it_wrong(
314
-            'save_csv_to_db',
315
-            esc_html__(
316
-                'Function moved to EE_Import and renamed to save_csv_data_array_to_db',
317
-                'event_espresso'
318
-            ),
319
-            '4.6.7'
320
-        );
321
-        return EE_Import::instance()->save_csv_data_array_to_db($csv_data_array, $model_name);
322
-    }
323
-
324
-    /**
325
-     * Sends HTTP headers to indicate that the browser should download a file,
326
-     * and starts writing the file to PHP's output. Returns the file handle so other functions can
327
-     * also write to it
328
-     *
329
-     * @param string $new_filename the name of the file that the user will download
330
-     * @return resource, like the results of fopen(), which can be used for fwrite, fputcsv2, etc.
331
-     */
332
-    public function begin_sending_csv($filename)
333
-    {
334
-        // grab file extension
335
-        $ext = substr(strrchr($filename, '.'), 1);
336
-        if ($ext == '.csv' or $ext == '.xls') {
337
-            str_replace($ext, '', $filename);
338
-        }
339
-        $filename .= '.csv';
340
-
341
-        // if somebody's been naughty and already started outputting stuff, trash it
342
-        // and start writing our stuff.
343
-        if (ob_get_length()) {
344
-            @ob_flush();
345
-            @flush();
346
-            @ob_end_flush();
347
-        }
348
-        @ob_start();
349
-        header("Pragma: public");
350
-        header("Expires: 0");
351
-        header("Pragma: no-cache");
352
-        header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
353
-        // header("Content-Type: application/force-download");
354
-        // header("Content-Type: application/octet-stream");
355
-        // header("Content-Type: application/download");
356
-        header('Content-disposition: attachment; filename=' . $filename);
357
-        header("Content-Type: text/csv; charset=utf-8");
358
-        do_action('AHEE__EE_CSV__begin_sending_csv__headers');
359
-        echo apply_filters(
360
-            'FHEE__EE_CSV__begin_sending_csv__start_writing',
361
-            "\xEF\xBB\xBF"
362
-        ); // makes excel open it as UTF-8. UTF-8 BOM, see http://stackoverflow.com/a/4440143/2773835
363
-        $fh = fopen('php://output', 'w');
364
-        return $fh;
365
-    }
366
-
367
-    /**
368
-     * Writes some meta data to the CSV as a bunch of columns. Initially we're only
369
-     * mentioning the version and timezone
370
-     *
371
-     * @param resource $filehandle
372
-     */
373
-    public function write_metadata_to_csv($filehandle)
374
-    {
375
-        $data_row = array(EE_CSV::metadata_header);// do NOT translate because this exact string is used when importing
376
-        $this->fputcsv2($filehandle, $data_row);
377
-        $meta_data = array(
378
-            0 => array(
379
-                'version'        => espresso_version(),
380
-                'timezone'       => EEH_DTT_Helper::get_timezone(),
381
-                'time_of_export' => current_time('mysql'),
382
-                'site_url'       => site_url(),
383
-            ),
384
-        );
385
-        $this->write_data_array_to_csv($filehandle, $meta_data);
386
-    }
387
-
388
-
389
-    /**
390
-     * Writes $data to the csv file open in $filehandle. uses the array indices of $data for column headers
391
-     *
392
-     * @param array   $data                 2D array, first numerically-indexed, and next-level-down preferably indexed
393
-     *                                      by string
394
-     * @param boolean $add_csv_column_names whether or not we should add the keys in the bottom-most array as a row for
395
-     *                                      headers in the CSV. Eg, if $data looked like
396
-     *                                      array(0=>array('EVT_ID'=>1,'EVT_name'=>'monkey'...), 1=>array(...),...))
397
-     *                                      then the first row we'd write to the CSV would be "EVT_ID,EVT_name,..."
398
-     * @return boolean if we successfully wrote to the CSV or not. If there's no $data, we consider that a success
399
-     *                 (because we wrote everything there was...nothing)
400
-     */
401
-    public function write_data_array_to_csv($filehandle, $data)
402
-    {
403
-
404
-
405
-        // determine if $data is actually a 2d array
406
-        if ($data && is_array($data) && is_array(EEH_Array::get_one_item_from_array($data))) {
407
-            // make sure top level is numerically indexed,
408
-
409
-            if (EEH_Array::is_associative_array($data)) {
410
-                throw new EE_Error(
411
-                    sprintf(
412
-                        esc_html__(
413
-                            "top-level array must be numerically indexed. Does these look like numbers to you? %s",
414
-                            "event_espresso"
415
-                        ),
416
-                        implode(",", array_keys($data))
417
-                    )
418
-                );
419
-            }
420
-            $item_in_top_level_array = EEH_Array::get_one_item_from_array($data);
421
-            // now, is the last item in the top-level array of $data an associative or numeric array?
422
-            if (EEH_Array::is_associative_array($item_in_top_level_array)) {
423
-                // its associative, so we want to output its keys as column headers
424
-                $keys = array_keys($item_in_top_level_array);
425
-                echo $this->fputcsv2($filehandle, $keys);
426
-            }
427
-            // start writing data
428
-            foreach ($data as $data_row) {
429
-                echo $this->fputcsv2($filehandle, $data_row);
430
-            }
431
-            return true;
432
-        } else {
433
-            // no data TO write... so we can assume that's a success
434
-            return true;
435
-        }
436
-        // //if 2nd level is indexed by strings, use those as csv column headers (ie, the first row)
437
-        //
438
-        //
439
-        // $no_table = TRUE;
440
-        //
441
-        // // loop through data and add each row to the file/stream as csv
442
-        // foreach ( $data as $model_name => $model_data ) {
443
-        // // test first row to see if it is data or a model name
444
-        // $model = EE_Registry::instance();->load_model($model_name);
445
-        // //if the model really exists,
446
-        // if ( $model ) {
447
-        //
448
-        // // we have a table name
449
-        // $no_table = FALSE;
450
-        //
451
-        // // put the tablename into an array cuz that's how fputcsv rolls
452
-        // $model_name_row = array( 'MODEL', $model_name );
453
-        //
454
-        // // add table name to csv output
455
-        // echo self::fputcsv2($filehandle, $model_name_row);
456
-        //
457
-        // // now get the rest of the data
458
-        // foreach ( $model_data as $row ) {
459
-        // // output the row
460
-        // echo self::fputcsv2($filehandle, $row);
461
-        // }
462
-        //
463
-        // }
464
-        //
465
-        // if ( $no_table ) {
466
-        // // no table so just put the data
467
-        // echo self::fputcsv2($filehandle, $model_data);
468
-        // }
469
-        //
470
-        // } // END OF foreach ( $data )
471
-    }
472
-
473
-    /**
474
-     * Should be called after begin_sending_csv(), and one or more write_data_array_to_csv()s.
475
-     * Calls exit to prevent polluting the CSV file with other junk
476
-     *
477
-     * @param resource $fh filehandle where we're writing the CSV to
478
-     */
479
-    public function end_sending_csv($fh)
480
-    {
481
-        fclose($fh);
482
-        exit(0);
483
-    }
484
-
485
-    /**
486
-     * Given an open file, writes all the model data to it in the format the importer expects.
487
-     * Usually preceded by begin_sending_csv($filename), and followed by end_sending_csv($filehandle).
488
-     *
489
-     * @param resource $filehandle
490
-     * @param array    $model_data_array is assumed to be a 3d array: 1st layer has keys of model names (eg 'Event'),
491
-     *                                   next layer is numerically indexed to represent each model object (eg, each
492
-     *                                   individual event), and the last layer has all the attributes o fthat model
493
-     *                                   object (eg, the event's id, name, etc)
494
-     * @return boolean success
495
-     */
496
-    public function write_model_data_to_csv($filehandle, $model_data_array)
497
-    {
498
-        $this->write_metadata_to_csv($filehandle);
499
-        foreach ($model_data_array as $model_name => $model_instance_arrays) {
500
-            // first: output a special row stating the model
501
-            echo $this->fputcsv2($filehandle, array('MODEL', $model_name));
502
-            // if we have items to put in the CSV, do it normally
503
-
504
-            if (! empty($model_instance_arrays)) {
505
-                $this->write_data_array_to_csv($filehandle, $model_instance_arrays);
506
-            } else {
507
-                // echo "no data to write... so just write the headers";
508
-                // so there's actually NO model objects for that model.
509
-                // probably still want to show the columns
510
-                $model = EE_Registry::instance()->load_model($model_name);
511
-                $column_names = array();
512
-                foreach ($model->field_settings() as $field) {
513
-                    $column_names[ $field->get_nicename() . "[" . $field->get_name() . "]" ] = null;
514
-                }
515
-                $this->write_data_array_to_csv($filehandle, array($column_names));
516
-            }
517
-        }
518
-    }
519
-
520
-    /**
521
-     * Writes the CSV file to the output buffer, with rows corresponding to $model_data_array,
522
-     * and dies (in order to avoid other plugins from messing up the csv output)
523
-     *
524
-     * @param string $filename         the filename you want to give the file
525
-     * @param array  $model_data_array 3d array, as described in EE_CSV::write_model_data_to_csv()
526
-     * @return bool | void writes CSV file to output and dies
527
-     */
528
-    public function export_multiple_model_data_to_csv($filename, $model_data_array)
529
-    {
530
-        $filehandle = $this->begin_sending_csv($filename);
531
-        $this->write_model_data_to_csv($filehandle, $model_data_array);
532
-        $this->end_sending_csv($filehandle);
533
-    }
534
-
535
-    /**
536
-     * @Export contents of an array to csv file
537
-     * @access public
538
-     * @param array  $data     - the array of data to be converted to csv and exported
539
-     * @param string $filename - name for newly created csv file
540
-     * @return TRUE on success, FALSE on fail
541
-     */
542
-    public function export_array_to_csv($data = false, $filename = false)
543
-    {
544
-
545
-        // no data file?? get outta here
546
-        if (! $data or ! is_array($data) or empty($data)) {
547
-            return false;
548
-        }
549
-
550
-        // no filename?? get outta here
551
-        if (! $filename) {
552
-            return false;
553
-        }
554
-
555
-
556
-        // somebody told me i might need this ???
557
-        global $wpdb;
558
-        $prefix = $wpdb->prefix;
559
-
560
-
561
-        $fh = $this->begin_sending_csv($filename);
562
-
563
-
564
-        $this->end_sending_csv($fh);
565
-    }
566
-
567
-
568
-    /**
569
-     * @Determine the maximum upload file size based on php.ini settings
570
-     * @access    public
571
-     * @param int $percent_of_max - desired percentage of the max upload_mb
572
-     * @return int KB
573
-     */
574
-    public function get_max_upload_size($percent_of_max = false)
575
-    {
576
-
577
-        $max_upload = (int) (ini_get('upload_max_filesize'));
578
-        $max_post = (int) (ini_get('post_max_size'));
579
-        $memory_limit = (int) (ini_get('memory_limit'));
580
-
581
-        // determine the smallest of the three values from above
582
-        $upload_mb = min($max_upload, $max_post, $memory_limit);
583
-
584
-        // convert MB to KB
585
-        $upload_mb = $upload_mb * 1024;
586
-
587
-        // don't want the full monty? then reduce the max uplaod size
588
-        if ($percent_of_max) {
589
-            // is percent_of_max like this -> 50 or like this -> 0.50 ?
590
-            if ($percent_of_max > 1) {
591
-                // chnages 50 to 0.50
592
-                $percent_of_max = $percent_of_max / 100;
593
-            }
594
-            // make upload_mb a percentage of the max upload_mb
595
-            $upload_mb = $upload_mb * $percent_of_max;
596
-        }
597
-
598
-        return $upload_mb;
599
-    }
600
-
601
-
602
-    /**
603
-     * @Drop   in replacement for PHP's fputcsv function - but this one works!!!
604
-     * @access private
605
-     * @param resource $fh         - file handle - what we are writing to
606
-     * @param array    $row        - individual row of csv data
607
-     * @param string   $delimiter  - csv delimiter
608
-     * @param string   $enclosure  - csv enclosure
609
-     * @param string   $mysql_null - allows php NULL to be overridden with MySQl's insertable NULL value
610
-     * @return void
611
-     */
612
-    private function fputcsv2($fh, array $row, $delimiter = ',', $enclosure = '"', $mysql_null = false)
613
-    {
614
-        // Allow user to filter the csv delimiter and enclosure for other countries csv standards
615
-        $delimiter = apply_filters('FHEE__EE_CSV__fputcsv2__delimiter', $delimiter);
616
-        $enclosure = apply_filters('FHEE__EE_CSV__fputcsv2__enclosure', $enclosure);
617
-
618
-        $delimiter_esc = preg_quote($delimiter, '/');
619
-        $enclosure_esc = preg_quote($enclosure, '/');
620
-
621
-        $output = array();
622
-        foreach ($row as $field_value) {
623
-            if (is_object($field_value) || is_array($field_value)) {
624
-                $field_value = serialize($field_value);
625
-            }
626
-            if ($field_value === null && $mysql_null) {
627
-                $output[] = 'NULL';
628
-                continue;
629
-            }
630
-
631
-            $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field_value) ?
632
-                ($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field_value) . $enclosure)
633
-                : $field_value;
634
-        }
635
-
636
-        fwrite($fh, join($delimiter, $output) . PHP_EOL);
637
-    }
638
-
639
-
640
-    // /**
641
-    //  * @CSV    Import / Export messages
642
-    //  * @access public
643
-    //  * @return void
644
-    //  */
645
-    // public function csv_admin_notices()
646
-    // {
647
-    //
648
-    //     // We play both kinds of music here! Country AND Western! - err... I mean, cycle through both types of notices
649
-    //     foreach (array('updates', 'errors') as $type) {
650
-    //
651
-    //         // if particular notice type is not empty, then "You've got Mail"
652
-    //         if (! empty($this->_notices[ $type ])) {
653
-    //
654
-    //             // is it an update or an error ?
655
-    //             $msg_class = $type == 'updates' ? 'updated' : 'error';
656
-    //             echo '<div id="message" class="' . $msg_class . '">';
657
-    //             // display each notice, however many that may be
658
-    //             foreach ($this->_notices[ $type ] as $message) {
659
-    //                 echo '<p>' . $message . '</p>';
660
-    //             }
661
-    //             // wrap it up
662
-    //             echo '</div>';
663
-    //         }
664
-    //     }
665
-    // }
666
-
667
-    /**
668
-     * Gets the date format to use in teh csv. filterable
669
-     *
670
-     * @param string $current_format
671
-     * @return string
672
-     */
673
-    public function get_date_format_for_csv($current_format = null)
674
-    {
675
-        return apply_filters('FHEE__EE_CSV__get_date_format_for_csv__format', 'Y-m-d', $current_format);
676
-    }
677
-
678
-    /**
679
-     * Gets the time format we want to use in CSV reports. Filterable
680
-     *
681
-     * @param string $current_format
682
-     * @return string
683
-     */
684
-    public function get_time_format_for_csv($current_format = null)
685
-    {
686
-        return apply_filters('FHEE__EE_CSV__get_time_format_for_csv__format', 'H:i:s', $current_format);
687
-    }
19
+	// instance of the EE_CSV object
20
+	private static $_instance = null;
21
+
22
+
23
+	// multidimensional array to store update & error messages
24
+	// var $_notices = array( 'updates' => array(), 'errors' => array() );
25
+
26
+
27
+	private $_primary_keys;
28
+
29
+	/**
30
+	 *
31
+	 * @var EE_Registry
32
+	 */
33
+	private $EE;
34
+	/**
35
+	 * string used for 1st cell in exports, which indicates that the following 2 rows will be metadata keys and values
36
+	 */
37
+	const metadata_header = 'Event Espresso Export Meta Data';
38
+
39
+	/**
40
+	 *        private constructor to prevent direct creation
41
+	 *
42
+	 * @Constructor
43
+	 * @access private
44
+	 * @return void
45
+	 */
46
+	private function __construct()
47
+	{
48
+		global $wpdb;
49
+
50
+		$this->_primary_keys = array(
51
+			$wpdb->prefix . 'esp_answer'                  => array('ANS_ID'),
52
+			$wpdb->prefix . 'esp_attendee'                => array('ATT_ID'),
53
+			$wpdb->prefix . 'esp_datetime'                => array('DTT_ID'),
54
+			$wpdb->prefix . 'esp_event_question_group'    => array('EQG_ID'),
55
+			$wpdb->prefix . 'esp_message_template'        => array('MTP_ID'),
56
+			$wpdb->prefix . 'esp_payment'                 => array('PAY_ID'),
57
+			$wpdb->prefix . 'esp_price'                   => array('PRC_ID'),
58
+			$wpdb->prefix . 'esp_price_type'              => array('PRT_ID'),
59
+			$wpdb->prefix . 'esp_question'                => array('QST_ID'),
60
+			$wpdb->prefix . 'esp_question_group'          => array('QSG_ID'),
61
+			$wpdb->prefix . 'esp_question_group_question' => array('QGQ_ID'),
62
+			$wpdb->prefix . 'esp_question_option'         => array('QSO_ID'),
63
+			$wpdb->prefix . 'esp_registration'            => array('REG_ID'),
64
+			$wpdb->prefix . 'esp_status'                  => array('STS_ID'),
65
+			$wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
66
+			$wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
67
+			$wpdb->prefix . 'events_detail'               => array('id'),
68
+			$wpdb->prefix . 'events_category_detail'      => array('id'),
69
+			$wpdb->prefix . 'events_category_rel'         => array('id'),
70
+			$wpdb->prefix . 'events_venue'                => array('id'),
71
+			$wpdb->prefix . 'events_venue_rel'            => array('emeta_id'),
72
+			$wpdb->prefix . 'events_locale'               => array('id'),
73
+			$wpdb->prefix . 'events_locale_rel'           => array('id'),
74
+			$wpdb->prefix . 'events_personnel'            => array('id'),
75
+			$wpdb->prefix . 'events_personnel_rel'        => array('id'),
76
+		);
77
+	}
78
+
79
+
80
+	/**
81
+	 *        @ singleton method used to instantiate class object
82
+	 *        @ access public
83
+	 *
84
+	 * @return EE_CSV
85
+	 */
86
+	public static function instance()
87
+	{
88
+		// check if class object is instantiated
89
+		if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_CSV)) {
90
+			self::$_instance = new self();
91
+		}
92
+		return self::$_instance;
93
+	}
94
+
95
+	/**
96
+	 * Opens a unicode or utf file (normal file_get_contents has difficulty readin ga unicode file. @see
97
+	 * http://stackoverflow.com/questions/15092764/how-to-read-unicode-text-file-in-php
98
+	 *
99
+	 * @param string $file_path
100
+	 * @return string
101
+	 * @throws EE_Error
102
+	 */
103
+	private function read_unicode_file($file_path)
104
+	{
105
+		$fc = "";
106
+		$fh = fopen($file_path, "rb");
107
+		if (! $fh) {
108
+			throw new EE_Error(sprintf(esc_html__("Cannot open file for read: %s<br>\n", 'event_espresso'), $file_path));
109
+		}
110
+		$flen = filesize($file_path);
111
+		$bc = fread($fh, $flen);
112
+		for ($i = 0; $i < $flen; $i++) {
113
+			$c = substr($bc, $i, 1);
114
+			if ((ord($c) != 0) && (ord($c) != 13)) {
115
+				$fc = $fc . $c;
116
+			}
117
+		}
118
+		if ((ord(substr($fc, 0, 1)) == 255) && (ord(substr($fc, 1, 1)) == 254)) {
119
+			$fc = substr($fc, 2);
120
+		}
121
+		return ($fc);
122
+	}
123
+
124
+
125
+	/**
126
+	 * Generic CSV-functionality to turn an entire CSV file into a single array that's
127
+	 * NOT in a specific format to EE. It's just a 2-level array, with top-level arrays
128
+	 * representing each row in the CSV file, and the second-level arrays being each column in that row
129
+	 *
130
+	 * @param string $path_to_file
131
+	 * @return array of arrays. Top-level array has rows, second-level array has each item
132
+	 */
133
+	public function import_csv_to_multi_dimensional_array($path_to_file)
134
+	{
135
+		// needed to deal with Mac line endings
136
+		ini_set('auto_detect_line_endings', true);
137
+
138
+		// because fgetcsv does not correctly deal with backslashed quotes such as \"
139
+		// we'll read the file into a string
140
+		$file_contents = $this->read_unicode_file($path_to_file);
141
+		// replace backslashed quotes with CSV enclosures
142
+		$file_contents = str_replace('\\"', '"""', $file_contents);
143
+		// HEY YOU! PUT THAT FILE BACK!!!
144
+		file_put_contents($path_to_file, $file_contents);
145
+
146
+		if (($file_handle = fopen($path_to_file, "r")) !== false) {
147
+			# Set the parent multidimensional array key to 0.
148
+			$nn = 0;
149
+			$csvarray = array();
150
+
151
+			// in PHP 5.3 fgetcsv accepts a 5th parameter, but the pre 5.3 versions of fgetcsv choke if passed more than 4 - is that crazy or what?
152
+			if (version_compare(PHP_VERSION, '5.3.0') < 0) {
153
+				//  PHP 5.2- version
154
+				// loop through each row of the file
155
+				while (($data = fgetcsv($file_handle, 0, ',', '"')) !== false) {
156
+					$csvarray[] = $data;
157
+				}
158
+			} else {
159
+				// loop through each row of the file
160
+				while (($data = fgetcsv($file_handle, 0, ',', '"', '\\')) !== false) {
161
+					$csvarray[] = $data;
162
+				}
163
+			}
164
+			# Close the File.
165
+			fclose($file_handle);
166
+			return $csvarray;
167
+		} else {
168
+			EE_Error::add_error(
169
+				sprintf(esc_html__("An error occurred - the file: %s could not opened.", "event_espresso"), $path_to_file),
170
+				__FILE__,
171
+				__FUNCTION__,
172
+				__LINE__
173
+			);
174
+			return false;
175
+		}
176
+	}
177
+
178
+
179
+	/**
180
+	 * @Import contents of csv file and store values in an array to be manipulated by other functions
181
+	 * @access public
182
+	 * @param string  $path_to_file         - the csv file to be imported including the path to it's location.
183
+	 *                                      If $model_name is provided, assumes that each row in the CSV represents a
184
+	 *                                      model object for that model If $model_name ISN'T provided, assumes that
185
+	 *                                      before model object data, there is a row where the first entry is simply
186
+	 *                                      'MODEL', and next entry is the model's name, (untranslated) like Event, and
187
+	 *                                      then maybe a row of headers, and then the model data. Eg.
188
+	 *                                      '<br>MODEL,Event,<br>EVT_ID,EVT_name,...<br>1,Monkey
189
+	 *                                      Party,...<br>2,Llamarama,...<br>MODEL,Venue,<br>VNU_ID,VNU_name<br>1,The
190
+	 *                                      Forest
191
+	 * @param string  $model_name           model name if we know what model we're importing
192
+	 * @param boolean $first_row_is_headers - whether the first row of data is headers or not - TRUE = headers, FALSE =
193
+	 *                                      data
194
+	 * @return mixed - array on success - multi dimensional with headers as keys (if headers exist) OR string on fail -
195
+	 *               error message like the following array('Event'=>array( array('EVT_ID'=>1,'EVT_name'=>'bob
196
+	 *               party',...), array('EVT_ID'=>2,'EVT_name'=>'llamarama',...),
197
+	 *                                      ...
198
+	 *                                      )
199
+	 *                                      'Venue'=>array(
200
+	 *                                      array('VNU_ID'=>1,'VNU_name'=>'the shack',...),
201
+	 *                                      array('VNU_ID'=>2,'VNU_name'=>'tree house',...),
202
+	 *                                      ...
203
+	 *                                      )
204
+	 *                                      ...
205
+	 *                                      )
206
+	 */
207
+	public function import_csv_to_model_data_array($path_to_file, $model_name = false, $first_row_is_headers = true)
208
+	{
209
+		$multi_dimensional_array = $this->import_csv_to_multi_dimensional_array($path_to_file);
210
+		if (! $multi_dimensional_array) {
211
+			return false;
212
+		}
213
+		// gotta start somewhere
214
+		$row = 1;
215
+		// array to store csv data in
216
+		$ee_formatted_data = array();
217
+		// array to store headers (column names)
218
+		$headers = array();
219
+		foreach ($multi_dimensional_array as $data) {
220
+			// if first cell is MODEL, then second cell is the MODEL name
221
+			if ($data[0] == 'MODEL') {
222
+				$model_name = $data[1];
223
+				// don't bother looking for model data in this row. The rest of this
224
+				// row should be blank
225
+				// AND pretend this is the first row again
226
+				$row = 1;
227
+				// reset headers
228
+				$headers = array();
229
+				continue;
230
+			}
231
+			if (strpos($data[0], EE_CSV::metadata_header) !== false) {
232
+				$model_name = EE_CSV::metadata_header;
233
+				// store like model data, we just won't try importing it etc.
234
+				$row = 1;
235
+				continue;
236
+			}
237
+
238
+
239
+			// how many columns are there?
240
+			$columns = count($data);
241
+
242
+			$model_entry = array();
243
+			// loop through each column
244
+			for ($i = 0; $i < $columns; $i++) {
245
+				// replace csv_enclosures with backslashed quotes
246
+				$data[ $i ] = str_replace('"""', '\\"', $data[ $i ]);
247
+				// do we need to grab the column names?
248
+				if ($row === 1) {
249
+					if ($first_row_is_headers) {
250
+						// store the column names to use for keys
251
+						$column_name = $data[ $i ];
252
+						// check it's not blank... sometimes CSV editign programs adda bunch of empty columns onto the end...
253
+						if (! $column_name) {
254
+							continue;
255
+						}
256
+						$matches = array();
257
+						if ($model_name == EE_CSV::metadata_header) {
258
+							$headers[ $i ] = $column_name;
259
+						} else {
260
+							// now get the db table name from it (the part between square brackets)
261
+							$success = preg_match('~(.*)\[(.*)\]~', $column_name, $matches);
262
+							if (! $success) {
263
+								EE_Error::add_error(
264
+									sprintf(
265
+										esc_html__(
266
+											"The column titled %s is invalid for importing. It must be be in the format of 'Nice Name[model_field_name]' in row %s",
267
+											"event_espresso"
268
+										),
269
+										$column_name,
270
+										implode(",", $data)
271
+									),
272
+									__FILE__,
273
+									__FUNCTION__,
274
+									__LINE__
275
+								);
276
+								return false;
277
+							}
278
+							$headers[ $i ] = $matches[2];
279
+						}
280
+					} else {
281
+						// no column names means our final array will just use counters for keys
282
+						$model_entry[ $headers[ $i ] ] = $data[ $i ];
283
+						$headers[ $i ] = $i;
284
+					}
285
+					// and we need to store csv data
286
+				} else {
287
+					// this column isn' ta header, store it if there is a header for it
288
+					if (isset($headers[ $i ])) {
289
+						$model_entry[ $headers[ $i ] ] = $data[ $i ];
290
+					}
291
+				}
292
+			}
293
+			// save the row's data IF it's a non-header-row
294
+			if (! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
+				$ee_formatted_data[ $model_name ][] = $model_entry;
296
+			}
297
+			// advance to next row
298
+			$row++;
299
+		}
300
+
301
+		// delete the uploaded file
302
+		unlink($path_to_file);
303
+		// echo '<pre style="height:auto;border:2px solid lightblue;">' . print_r( $ee_formatted_data, TRUE ) . '</pre><br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>';
304
+		// die();
305
+
306
+		// it's good to give back
307
+		return $ee_formatted_data;
308
+	}
309
+
310
+
311
+	public function save_csv_to_db($csv_data_array, $model_name = false)
312
+	{
313
+		EE_Error::doing_it_wrong(
314
+			'save_csv_to_db',
315
+			esc_html__(
316
+				'Function moved to EE_Import and renamed to save_csv_data_array_to_db',
317
+				'event_espresso'
318
+			),
319
+			'4.6.7'
320
+		);
321
+		return EE_Import::instance()->save_csv_data_array_to_db($csv_data_array, $model_name);
322
+	}
323
+
324
+	/**
325
+	 * Sends HTTP headers to indicate that the browser should download a file,
326
+	 * and starts writing the file to PHP's output. Returns the file handle so other functions can
327
+	 * also write to it
328
+	 *
329
+	 * @param string $new_filename the name of the file that the user will download
330
+	 * @return resource, like the results of fopen(), which can be used for fwrite, fputcsv2, etc.
331
+	 */
332
+	public function begin_sending_csv($filename)
333
+	{
334
+		// grab file extension
335
+		$ext = substr(strrchr($filename, '.'), 1);
336
+		if ($ext == '.csv' or $ext == '.xls') {
337
+			str_replace($ext, '', $filename);
338
+		}
339
+		$filename .= '.csv';
340
+
341
+		// if somebody's been naughty and already started outputting stuff, trash it
342
+		// and start writing our stuff.
343
+		if (ob_get_length()) {
344
+			@ob_flush();
345
+			@flush();
346
+			@ob_end_flush();
347
+		}
348
+		@ob_start();
349
+		header("Pragma: public");
350
+		header("Expires: 0");
351
+		header("Pragma: no-cache");
352
+		header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
353
+		// header("Content-Type: application/force-download");
354
+		// header("Content-Type: application/octet-stream");
355
+		// header("Content-Type: application/download");
356
+		header('Content-disposition: attachment; filename=' . $filename);
357
+		header("Content-Type: text/csv; charset=utf-8");
358
+		do_action('AHEE__EE_CSV__begin_sending_csv__headers');
359
+		echo apply_filters(
360
+			'FHEE__EE_CSV__begin_sending_csv__start_writing',
361
+			"\xEF\xBB\xBF"
362
+		); // makes excel open it as UTF-8. UTF-8 BOM, see http://stackoverflow.com/a/4440143/2773835
363
+		$fh = fopen('php://output', 'w');
364
+		return $fh;
365
+	}
366
+
367
+	/**
368
+	 * Writes some meta data to the CSV as a bunch of columns. Initially we're only
369
+	 * mentioning the version and timezone
370
+	 *
371
+	 * @param resource $filehandle
372
+	 */
373
+	public function write_metadata_to_csv($filehandle)
374
+	{
375
+		$data_row = array(EE_CSV::metadata_header);// do NOT translate because this exact string is used when importing
376
+		$this->fputcsv2($filehandle, $data_row);
377
+		$meta_data = array(
378
+			0 => array(
379
+				'version'        => espresso_version(),
380
+				'timezone'       => EEH_DTT_Helper::get_timezone(),
381
+				'time_of_export' => current_time('mysql'),
382
+				'site_url'       => site_url(),
383
+			),
384
+		);
385
+		$this->write_data_array_to_csv($filehandle, $meta_data);
386
+	}
387
+
388
+
389
+	/**
390
+	 * Writes $data to the csv file open in $filehandle. uses the array indices of $data for column headers
391
+	 *
392
+	 * @param array   $data                 2D array, first numerically-indexed, and next-level-down preferably indexed
393
+	 *                                      by string
394
+	 * @param boolean $add_csv_column_names whether or not we should add the keys in the bottom-most array as a row for
395
+	 *                                      headers in the CSV. Eg, if $data looked like
396
+	 *                                      array(0=>array('EVT_ID'=>1,'EVT_name'=>'monkey'...), 1=>array(...),...))
397
+	 *                                      then the first row we'd write to the CSV would be "EVT_ID,EVT_name,..."
398
+	 * @return boolean if we successfully wrote to the CSV or not. If there's no $data, we consider that a success
399
+	 *                 (because we wrote everything there was...nothing)
400
+	 */
401
+	public function write_data_array_to_csv($filehandle, $data)
402
+	{
403
+
404
+
405
+		// determine if $data is actually a 2d array
406
+		if ($data && is_array($data) && is_array(EEH_Array::get_one_item_from_array($data))) {
407
+			// make sure top level is numerically indexed,
408
+
409
+			if (EEH_Array::is_associative_array($data)) {
410
+				throw new EE_Error(
411
+					sprintf(
412
+						esc_html__(
413
+							"top-level array must be numerically indexed. Does these look like numbers to you? %s",
414
+							"event_espresso"
415
+						),
416
+						implode(",", array_keys($data))
417
+					)
418
+				);
419
+			}
420
+			$item_in_top_level_array = EEH_Array::get_one_item_from_array($data);
421
+			// now, is the last item in the top-level array of $data an associative or numeric array?
422
+			if (EEH_Array::is_associative_array($item_in_top_level_array)) {
423
+				// its associative, so we want to output its keys as column headers
424
+				$keys = array_keys($item_in_top_level_array);
425
+				echo $this->fputcsv2($filehandle, $keys);
426
+			}
427
+			// start writing data
428
+			foreach ($data as $data_row) {
429
+				echo $this->fputcsv2($filehandle, $data_row);
430
+			}
431
+			return true;
432
+		} else {
433
+			// no data TO write... so we can assume that's a success
434
+			return true;
435
+		}
436
+		// //if 2nd level is indexed by strings, use those as csv column headers (ie, the first row)
437
+		//
438
+		//
439
+		// $no_table = TRUE;
440
+		//
441
+		// // loop through data and add each row to the file/stream as csv
442
+		// foreach ( $data as $model_name => $model_data ) {
443
+		// // test first row to see if it is data or a model name
444
+		// $model = EE_Registry::instance();->load_model($model_name);
445
+		// //if the model really exists,
446
+		// if ( $model ) {
447
+		//
448
+		// // we have a table name
449
+		// $no_table = FALSE;
450
+		//
451
+		// // put the tablename into an array cuz that's how fputcsv rolls
452
+		// $model_name_row = array( 'MODEL', $model_name );
453
+		//
454
+		// // add table name to csv output
455
+		// echo self::fputcsv2($filehandle, $model_name_row);
456
+		//
457
+		// // now get the rest of the data
458
+		// foreach ( $model_data as $row ) {
459
+		// // output the row
460
+		// echo self::fputcsv2($filehandle, $row);
461
+		// }
462
+		//
463
+		// }
464
+		//
465
+		// if ( $no_table ) {
466
+		// // no table so just put the data
467
+		// echo self::fputcsv2($filehandle, $model_data);
468
+		// }
469
+		//
470
+		// } // END OF foreach ( $data )
471
+	}
472
+
473
+	/**
474
+	 * Should be called after begin_sending_csv(), and one or more write_data_array_to_csv()s.
475
+	 * Calls exit to prevent polluting the CSV file with other junk
476
+	 *
477
+	 * @param resource $fh filehandle where we're writing the CSV to
478
+	 */
479
+	public function end_sending_csv($fh)
480
+	{
481
+		fclose($fh);
482
+		exit(0);
483
+	}
484
+
485
+	/**
486
+	 * Given an open file, writes all the model data to it in the format the importer expects.
487
+	 * Usually preceded by begin_sending_csv($filename), and followed by end_sending_csv($filehandle).
488
+	 *
489
+	 * @param resource $filehandle
490
+	 * @param array    $model_data_array is assumed to be a 3d array: 1st layer has keys of model names (eg 'Event'),
491
+	 *                                   next layer is numerically indexed to represent each model object (eg, each
492
+	 *                                   individual event), and the last layer has all the attributes o fthat model
493
+	 *                                   object (eg, the event's id, name, etc)
494
+	 * @return boolean success
495
+	 */
496
+	public function write_model_data_to_csv($filehandle, $model_data_array)
497
+	{
498
+		$this->write_metadata_to_csv($filehandle);
499
+		foreach ($model_data_array as $model_name => $model_instance_arrays) {
500
+			// first: output a special row stating the model
501
+			echo $this->fputcsv2($filehandle, array('MODEL', $model_name));
502
+			// if we have items to put in the CSV, do it normally
503
+
504
+			if (! empty($model_instance_arrays)) {
505
+				$this->write_data_array_to_csv($filehandle, $model_instance_arrays);
506
+			} else {
507
+				// echo "no data to write... so just write the headers";
508
+				// so there's actually NO model objects for that model.
509
+				// probably still want to show the columns
510
+				$model = EE_Registry::instance()->load_model($model_name);
511
+				$column_names = array();
512
+				foreach ($model->field_settings() as $field) {
513
+					$column_names[ $field->get_nicename() . "[" . $field->get_name() . "]" ] = null;
514
+				}
515
+				$this->write_data_array_to_csv($filehandle, array($column_names));
516
+			}
517
+		}
518
+	}
519
+
520
+	/**
521
+	 * Writes the CSV file to the output buffer, with rows corresponding to $model_data_array,
522
+	 * and dies (in order to avoid other plugins from messing up the csv output)
523
+	 *
524
+	 * @param string $filename         the filename you want to give the file
525
+	 * @param array  $model_data_array 3d array, as described in EE_CSV::write_model_data_to_csv()
526
+	 * @return bool | void writes CSV file to output and dies
527
+	 */
528
+	public function export_multiple_model_data_to_csv($filename, $model_data_array)
529
+	{
530
+		$filehandle = $this->begin_sending_csv($filename);
531
+		$this->write_model_data_to_csv($filehandle, $model_data_array);
532
+		$this->end_sending_csv($filehandle);
533
+	}
534
+
535
+	/**
536
+	 * @Export contents of an array to csv file
537
+	 * @access public
538
+	 * @param array  $data     - the array of data to be converted to csv and exported
539
+	 * @param string $filename - name for newly created csv file
540
+	 * @return TRUE on success, FALSE on fail
541
+	 */
542
+	public function export_array_to_csv($data = false, $filename = false)
543
+	{
544
+
545
+		// no data file?? get outta here
546
+		if (! $data or ! is_array($data) or empty($data)) {
547
+			return false;
548
+		}
549
+
550
+		// no filename?? get outta here
551
+		if (! $filename) {
552
+			return false;
553
+		}
554
+
555
+
556
+		// somebody told me i might need this ???
557
+		global $wpdb;
558
+		$prefix = $wpdb->prefix;
559
+
560
+
561
+		$fh = $this->begin_sending_csv($filename);
562
+
563
+
564
+		$this->end_sending_csv($fh);
565
+	}
566
+
567
+
568
+	/**
569
+	 * @Determine the maximum upload file size based on php.ini settings
570
+	 * @access    public
571
+	 * @param int $percent_of_max - desired percentage of the max upload_mb
572
+	 * @return int KB
573
+	 */
574
+	public function get_max_upload_size($percent_of_max = false)
575
+	{
576
+
577
+		$max_upload = (int) (ini_get('upload_max_filesize'));
578
+		$max_post = (int) (ini_get('post_max_size'));
579
+		$memory_limit = (int) (ini_get('memory_limit'));
580
+
581
+		// determine the smallest of the three values from above
582
+		$upload_mb = min($max_upload, $max_post, $memory_limit);
583
+
584
+		// convert MB to KB
585
+		$upload_mb = $upload_mb * 1024;
586
+
587
+		// don't want the full monty? then reduce the max uplaod size
588
+		if ($percent_of_max) {
589
+			// is percent_of_max like this -> 50 or like this -> 0.50 ?
590
+			if ($percent_of_max > 1) {
591
+				// chnages 50 to 0.50
592
+				$percent_of_max = $percent_of_max / 100;
593
+			}
594
+			// make upload_mb a percentage of the max upload_mb
595
+			$upload_mb = $upload_mb * $percent_of_max;
596
+		}
597
+
598
+		return $upload_mb;
599
+	}
600
+
601
+
602
+	/**
603
+	 * @Drop   in replacement for PHP's fputcsv function - but this one works!!!
604
+	 * @access private
605
+	 * @param resource $fh         - file handle - what we are writing to
606
+	 * @param array    $row        - individual row of csv data
607
+	 * @param string   $delimiter  - csv delimiter
608
+	 * @param string   $enclosure  - csv enclosure
609
+	 * @param string   $mysql_null - allows php NULL to be overridden with MySQl's insertable NULL value
610
+	 * @return void
611
+	 */
612
+	private function fputcsv2($fh, array $row, $delimiter = ',', $enclosure = '"', $mysql_null = false)
613
+	{
614
+		// Allow user to filter the csv delimiter and enclosure for other countries csv standards
615
+		$delimiter = apply_filters('FHEE__EE_CSV__fputcsv2__delimiter', $delimiter);
616
+		$enclosure = apply_filters('FHEE__EE_CSV__fputcsv2__enclosure', $enclosure);
617
+
618
+		$delimiter_esc = preg_quote($delimiter, '/');
619
+		$enclosure_esc = preg_quote($enclosure, '/');
620
+
621
+		$output = array();
622
+		foreach ($row as $field_value) {
623
+			if (is_object($field_value) || is_array($field_value)) {
624
+				$field_value = serialize($field_value);
625
+			}
626
+			if ($field_value === null && $mysql_null) {
627
+				$output[] = 'NULL';
628
+				continue;
629
+			}
630
+
631
+			$output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field_value) ?
632
+				($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field_value) . $enclosure)
633
+				: $field_value;
634
+		}
635
+
636
+		fwrite($fh, join($delimiter, $output) . PHP_EOL);
637
+	}
638
+
639
+
640
+	// /**
641
+	//  * @CSV    Import / Export messages
642
+	//  * @access public
643
+	//  * @return void
644
+	//  */
645
+	// public function csv_admin_notices()
646
+	// {
647
+	//
648
+	//     // We play both kinds of music here! Country AND Western! - err... I mean, cycle through both types of notices
649
+	//     foreach (array('updates', 'errors') as $type) {
650
+	//
651
+	//         // if particular notice type is not empty, then "You've got Mail"
652
+	//         if (! empty($this->_notices[ $type ])) {
653
+	//
654
+	//             // is it an update or an error ?
655
+	//             $msg_class = $type == 'updates' ? 'updated' : 'error';
656
+	//             echo '<div id="message" class="' . $msg_class . '">';
657
+	//             // display each notice, however many that may be
658
+	//             foreach ($this->_notices[ $type ] as $message) {
659
+	//                 echo '<p>' . $message . '</p>';
660
+	//             }
661
+	//             // wrap it up
662
+	//             echo '</div>';
663
+	//         }
664
+	//     }
665
+	// }
666
+
667
+	/**
668
+	 * Gets the date format to use in teh csv. filterable
669
+	 *
670
+	 * @param string $current_format
671
+	 * @return string
672
+	 */
673
+	public function get_date_format_for_csv($current_format = null)
674
+	{
675
+		return apply_filters('FHEE__EE_CSV__get_date_format_for_csv__format', 'Y-m-d', $current_format);
676
+	}
677
+
678
+	/**
679
+	 * Gets the time format we want to use in CSV reports. Filterable
680
+	 *
681
+	 * @param string $current_format
682
+	 * @return string
683
+	 */
684
+	public function get_time_format_for_csv($current_format = null)
685
+	{
686
+		return apply_filters('FHEE__EE_CSV__get_time_format_for_csv__format', 'H:i:s', $current_format);
687
+	}
688 688
 }
Please login to merge, or discard this patch.
Spacing   +48 added lines, -48 removed lines patch added patch discarded remove patch
@@ -48,31 +48,31 @@  discard block
 block discarded – undo
48 48
         global $wpdb;
49 49
 
50 50
         $this->_primary_keys = array(
51
-            $wpdb->prefix . 'esp_answer'                  => array('ANS_ID'),
52
-            $wpdb->prefix . 'esp_attendee'                => array('ATT_ID'),
53
-            $wpdb->prefix . 'esp_datetime'                => array('DTT_ID'),
54
-            $wpdb->prefix . 'esp_event_question_group'    => array('EQG_ID'),
55
-            $wpdb->prefix . 'esp_message_template'        => array('MTP_ID'),
56
-            $wpdb->prefix . 'esp_payment'                 => array('PAY_ID'),
57
-            $wpdb->prefix . 'esp_price'                   => array('PRC_ID'),
58
-            $wpdb->prefix . 'esp_price_type'              => array('PRT_ID'),
59
-            $wpdb->prefix . 'esp_question'                => array('QST_ID'),
60
-            $wpdb->prefix . 'esp_question_group'          => array('QSG_ID'),
61
-            $wpdb->prefix . 'esp_question_group_question' => array('QGQ_ID'),
62
-            $wpdb->prefix . 'esp_question_option'         => array('QSO_ID'),
63
-            $wpdb->prefix . 'esp_registration'            => array('REG_ID'),
64
-            $wpdb->prefix . 'esp_status'                  => array('STS_ID'),
65
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
66
-            $wpdb->prefix . 'esp_transaction'             => array('TXN_ID'),
67
-            $wpdb->prefix . 'events_detail'               => array('id'),
68
-            $wpdb->prefix . 'events_category_detail'      => array('id'),
69
-            $wpdb->prefix . 'events_category_rel'         => array('id'),
70
-            $wpdb->prefix . 'events_venue'                => array('id'),
71
-            $wpdb->prefix . 'events_venue_rel'            => array('emeta_id'),
72
-            $wpdb->prefix . 'events_locale'               => array('id'),
73
-            $wpdb->prefix . 'events_locale_rel'           => array('id'),
74
-            $wpdb->prefix . 'events_personnel'            => array('id'),
75
-            $wpdb->prefix . 'events_personnel_rel'        => array('id'),
51
+            $wpdb->prefix.'esp_answer'                  => array('ANS_ID'),
52
+            $wpdb->prefix.'esp_attendee'                => array('ATT_ID'),
53
+            $wpdb->prefix.'esp_datetime'                => array('DTT_ID'),
54
+            $wpdb->prefix.'esp_event_question_group'    => array('EQG_ID'),
55
+            $wpdb->prefix.'esp_message_template'        => array('MTP_ID'),
56
+            $wpdb->prefix.'esp_payment'                 => array('PAY_ID'),
57
+            $wpdb->prefix.'esp_price'                   => array('PRC_ID'),
58
+            $wpdb->prefix.'esp_price_type'              => array('PRT_ID'),
59
+            $wpdb->prefix.'esp_question'                => array('QST_ID'),
60
+            $wpdb->prefix.'esp_question_group'          => array('QSG_ID'),
61
+            $wpdb->prefix.'esp_question_group_question' => array('QGQ_ID'),
62
+            $wpdb->prefix.'esp_question_option'         => array('QSO_ID'),
63
+            $wpdb->prefix.'esp_registration'            => array('REG_ID'),
64
+            $wpdb->prefix.'esp_status'                  => array('STS_ID'),
65
+            $wpdb->prefix.'esp_transaction'             => array('TXN_ID'),
66
+            $wpdb->prefix.'esp_transaction'             => array('TXN_ID'),
67
+            $wpdb->prefix.'events_detail'               => array('id'),
68
+            $wpdb->prefix.'events_category_detail'      => array('id'),
69
+            $wpdb->prefix.'events_category_rel'         => array('id'),
70
+            $wpdb->prefix.'events_venue'                => array('id'),
71
+            $wpdb->prefix.'events_venue_rel'            => array('emeta_id'),
72
+            $wpdb->prefix.'events_locale'               => array('id'),
73
+            $wpdb->prefix.'events_locale_rel'           => array('id'),
74
+            $wpdb->prefix.'events_personnel'            => array('id'),
75
+            $wpdb->prefix.'events_personnel_rel'        => array('id'),
76 76
         );
77 77
     }
78 78
 
@@ -104,7 +104,7 @@  discard block
 block discarded – undo
104 104
     {
105 105
         $fc = "";
106 106
         $fh = fopen($file_path, "rb");
107
-        if (! $fh) {
107
+        if ( ! $fh) {
108 108
             throw new EE_Error(sprintf(esc_html__("Cannot open file for read: %s<br>\n", 'event_espresso'), $file_path));
109 109
         }
110 110
         $flen = filesize($file_path);
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
         for ($i = 0; $i < $flen; $i++) {
113 113
             $c = substr($bc, $i, 1);
114 114
             if ((ord($c) != 0) && (ord($c) != 13)) {
115
-                $fc = $fc . $c;
115
+                $fc = $fc.$c;
116 116
             }
117 117
         }
118 118
         if ((ord(substr($fc, 0, 1)) == 255) && (ord(substr($fc, 1, 1)) == 254)) {
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
     public function import_csv_to_model_data_array($path_to_file, $model_name = false, $first_row_is_headers = true)
208 208
     {
209 209
         $multi_dimensional_array = $this->import_csv_to_multi_dimensional_array($path_to_file);
210
-        if (! $multi_dimensional_array) {
210
+        if ( ! $multi_dimensional_array) {
211 211
             return false;
212 212
         }
213 213
         // gotta start somewhere
@@ -243,23 +243,23 @@  discard block
 block discarded – undo
243 243
             // loop through each column
244 244
             for ($i = 0; $i < $columns; $i++) {
245 245
                 // replace csv_enclosures with backslashed quotes
246
-                $data[ $i ] = str_replace('"""', '\\"', $data[ $i ]);
246
+                $data[$i] = str_replace('"""', '\\"', $data[$i]);
247 247
                 // do we need to grab the column names?
248 248
                 if ($row === 1) {
249 249
                     if ($first_row_is_headers) {
250 250
                         // store the column names to use for keys
251
-                        $column_name = $data[ $i ];
251
+                        $column_name = $data[$i];
252 252
                         // check it's not blank... sometimes CSV editign programs adda bunch of empty columns onto the end...
253
-                        if (! $column_name) {
253
+                        if ( ! $column_name) {
254 254
                             continue;
255 255
                         }
256 256
                         $matches = array();
257 257
                         if ($model_name == EE_CSV::metadata_header) {
258
-                            $headers[ $i ] = $column_name;
258
+                            $headers[$i] = $column_name;
259 259
                         } else {
260 260
                             // now get the db table name from it (the part between square brackets)
261 261
                             $success = preg_match('~(.*)\[(.*)\]~', $column_name, $matches);
262
-                            if (! $success) {
262
+                            if ( ! $success) {
263 263
                                 EE_Error::add_error(
264 264
                                     sprintf(
265 265
                                         esc_html__(
@@ -275,24 +275,24 @@  discard block
 block discarded – undo
275 275
                                 );
276 276
                                 return false;
277 277
                             }
278
-                            $headers[ $i ] = $matches[2];
278
+                            $headers[$i] = $matches[2];
279 279
                         }
280 280
                     } else {
281 281
                         // no column names means our final array will just use counters for keys
282
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
283
-                        $headers[ $i ] = $i;
282
+                        $model_entry[$headers[$i]] = $data[$i];
283
+                        $headers[$i] = $i;
284 284
                     }
285 285
                     // and we need to store csv data
286 286
                 } else {
287 287
                     // this column isn' ta header, store it if there is a header for it
288
-                    if (isset($headers[ $i ])) {
289
-                        $model_entry[ $headers[ $i ] ] = $data[ $i ];
288
+                    if (isset($headers[$i])) {
289
+                        $model_entry[$headers[$i]] = $data[$i];
290 290
                     }
291 291
                 }
292 292
             }
293 293
             // save the row's data IF it's a non-header-row
294
-            if (! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
-                $ee_formatted_data[ $model_name ][] = $model_entry;
294
+            if ( ! $first_row_is_headers || ($first_row_is_headers && $row > 1)) {
295
+                $ee_formatted_data[$model_name][] = $model_entry;
296 296
             }
297 297
             // advance to next row
298 298
             $row++;
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
         // header("Content-Type: application/force-download");
354 354
         // header("Content-Type: application/octet-stream");
355 355
         // header("Content-Type: application/download");
356
-        header('Content-disposition: attachment; filename=' . $filename);
356
+        header('Content-disposition: attachment; filename='.$filename);
357 357
         header("Content-Type: text/csv; charset=utf-8");
358 358
         do_action('AHEE__EE_CSV__begin_sending_csv__headers');
359 359
         echo apply_filters(
@@ -372,7 +372,7 @@  discard block
 block discarded – undo
372 372
      */
373 373
     public function write_metadata_to_csv($filehandle)
374 374
     {
375
-        $data_row = array(EE_CSV::metadata_header);// do NOT translate because this exact string is used when importing
375
+        $data_row = array(EE_CSV::metadata_header); // do NOT translate because this exact string is used when importing
376 376
         $this->fputcsv2($filehandle, $data_row);
377 377
         $meta_data = array(
378 378
             0 => array(
@@ -501,7 +501,7 @@  discard block
 block discarded – undo
501 501
             echo $this->fputcsv2($filehandle, array('MODEL', $model_name));
502 502
             // if we have items to put in the CSV, do it normally
503 503
 
504
-            if (! empty($model_instance_arrays)) {
504
+            if ( ! empty($model_instance_arrays)) {
505 505
                 $this->write_data_array_to_csv($filehandle, $model_instance_arrays);
506 506
             } else {
507 507
                 // echo "no data to write... so just write the headers";
@@ -510,7 +510,7 @@  discard block
 block discarded – undo
510 510
                 $model = EE_Registry::instance()->load_model($model_name);
511 511
                 $column_names = array();
512 512
                 foreach ($model->field_settings() as $field) {
513
-                    $column_names[ $field->get_nicename() . "[" . $field->get_name() . "]" ] = null;
513
+                    $column_names[$field->get_nicename()."[".$field->get_name()."]"] = null;
514 514
                 }
515 515
                 $this->write_data_array_to_csv($filehandle, array($column_names));
516 516
             }
@@ -543,12 +543,12 @@  discard block
 block discarded – undo
543 543
     {
544 544
 
545 545
         // no data file?? get outta here
546
-        if (! $data or ! is_array($data) or empty($data)) {
546
+        if ( ! $data or ! is_array($data) or empty($data)) {
547 547
             return false;
548 548
         }
549 549
 
550 550
         // no filename?? get outta here
551
-        if (! $filename) {
551
+        if ( ! $filename) {
552 552
             return false;
553 553
         }
554 554
 
@@ -629,11 +629,11 @@  discard block
 block discarded – undo
629 629
             }
630 630
 
631 631
             $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field_value) ?
632
-                ($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field_value) . $enclosure)
632
+                ($enclosure.str_replace($enclosure, $enclosure.$enclosure, $field_value).$enclosure)
633 633
                 : $field_value;
634 634
         }
635 635
 
636
-        fwrite($fh, join($delimiter, $output) . PHP_EOL);
636
+        fwrite($fh, join($delimiter, $output).PHP_EOL);
637 637
     }
638 638
 
639 639
 
Please login to merge, or discard this patch.
core/db_classes/EE_Currency.class.php 1 patch
Indentation   +176 added lines, -176 removed lines patch added patch discarded remove patch
@@ -12,180 +12,180 @@
 block discarded – undo
12 12
 class EE_Currency extends EE_Base_Class
13 13
 {
14 14
 
15
-    /** Currency COde @var CUR_code */
16
-    protected $_CUR_code = null;
17
-    /** Currency Name Singular @var CUR_single */
18
-    protected $_CUR_single = null;
19
-    /** Currency Name Plural @var CUR_plural */
20
-    protected $_CUR_plural = null;
21
-    /** Currency Sign @var CUR_sign */
22
-    protected $_CUR_sign = null;
23
-    /** Currency Decimal Places @var CUR_dec_plc */
24
-    protected $_CUR_dec_plc = null;
25
-    /** Active? @var CUR_active */
26
-    protected $_CUR_active = null;
27
-    protected $_Payment_Method;
28
-
29
-    /**
30
-     *
31
-     * @param array  $props_n_values          incoming values
32
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
33
-     *                                        used.)
34
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
35
-     *                                        date_format and the second value is the time format
36
-     * @return EE_Attendee
37
-     */
38
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
39
-    {
40
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
41
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
42
-    }
43
-
44
-
45
-    /**
46
-     * @param array  $props_n_values  incoming values from the database
47
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48
-     *                                the website will be used.
49
-     * @return EE_Attendee
50
-     */
51
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52
-    {
53
-        return new self($props_n_values, true, $timezone);
54
-    }
55
-
56
-    /**
57
-     * Gets code
58
-     *
59
-     * @return string
60
-     */
61
-    public function code()
62
-    {
63
-        return $this->get('CUR_code');
64
-    }
65
-
66
-    /**
67
-     * Sets code
68
-     *
69
-     * @param string $code
70
-     * @return boolean
71
-     */
72
-    public function set_code($code)
73
-    {
74
-        return $this->set('CUR_code', $code);
75
-    }
76
-
77
-    /**
78
-     * Gets active
79
-     *
80
-     * @return boolean
81
-     */
82
-    public function active()
83
-    {
84
-        return $this->get('CUR_active');
85
-    }
86
-
87
-    /**
88
-     * Sets active
89
-     *
90
-     * @param boolean $active
91
-     * @return boolean
92
-     */
93
-    public function set_active($active)
94
-    {
95
-        return $this->set('CUR_active', $active);
96
-    }
97
-
98
-    /**
99
-     * Gets dec_plc
100
-     *
101
-     * @return int
102
-     */
103
-    public function dec_plc()
104
-    {
105
-        return $this->get('CUR_dec_plc');
106
-    }
107
-
108
-    /**
109
-     * Sets dec_plc
110
-     *
111
-     * @param int $dec_plc
112
-     * @return boolean
113
-     */
114
-    public function set_dec_plc($dec_plc)
115
-    {
116
-        return $this->set('CUR_dec_plc', $dec_plc);
117
-    }
118
-
119
-    /**
120
-     * Gets plural
121
-     *
122
-     * @return string
123
-     */
124
-    public function plural_name()
125
-    {
126
-        return $this->get('CUR_plural');
127
-    }
128
-
129
-    /**
130
-     * Sets plural
131
-     *
132
-     * @param string $plural
133
-     * @return boolean
134
-     */
135
-    public function set_plural_name($plural)
136
-    {
137
-        return $this->set('CUR_plural', $plural);
138
-    }
139
-
140
-    /**
141
-     * Gets sign
142
-     *
143
-     * @return string
144
-     */
145
-    public function sign()
146
-    {
147
-        return $this->get('CUR_sign');
148
-    }
149
-
150
-    /**
151
-     * Sets sign
152
-     *
153
-     * @param string $sign
154
-     * @return boolean
155
-     */
156
-    public function set_sign($sign)
157
-    {
158
-        return $this->set('CUR_sign', $sign);
159
-    }
160
-
161
-    /**
162
-     * Gets single
163
-     *
164
-     * @return string
165
-     */
166
-    public function singular_name()
167
-    {
168
-        return $this->get('CUR_single');
169
-    }
170
-
171
-    /**
172
-     * Sets single
173
-     *
174
-     * @param string $single
175
-     * @return boolean
176
-     */
177
-    public function set_singular_name($single)
178
-    {
179
-        return $this->set('CUR_single', $single);
180
-    }
181
-
182
-    /**
183
-     * Gets a prettier name
184
-     *
185
-     * @return string
186
-     */
187
-    public function name()
188
-    {
189
-        return sprintf(esc_html__("%s (%s)", "event_espresso"), $this->code(), $this->plural_name());
190
-    }
15
+	/** Currency COde @var CUR_code */
16
+	protected $_CUR_code = null;
17
+	/** Currency Name Singular @var CUR_single */
18
+	protected $_CUR_single = null;
19
+	/** Currency Name Plural @var CUR_plural */
20
+	protected $_CUR_plural = null;
21
+	/** Currency Sign @var CUR_sign */
22
+	protected $_CUR_sign = null;
23
+	/** Currency Decimal Places @var CUR_dec_plc */
24
+	protected $_CUR_dec_plc = null;
25
+	/** Active? @var CUR_active */
26
+	protected $_CUR_active = null;
27
+	protected $_Payment_Method;
28
+
29
+	/**
30
+	 *
31
+	 * @param array  $props_n_values          incoming values
32
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
33
+	 *                                        used.)
34
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
35
+	 *                                        date_format and the second value is the time format
36
+	 * @return EE_Attendee
37
+	 */
38
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
39
+	{
40
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
41
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
42
+	}
43
+
44
+
45
+	/**
46
+	 * @param array  $props_n_values  incoming values from the database
47
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
48
+	 *                                the website will be used.
49
+	 * @return EE_Attendee
50
+	 */
51
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
52
+	{
53
+		return new self($props_n_values, true, $timezone);
54
+	}
55
+
56
+	/**
57
+	 * Gets code
58
+	 *
59
+	 * @return string
60
+	 */
61
+	public function code()
62
+	{
63
+		return $this->get('CUR_code');
64
+	}
65
+
66
+	/**
67
+	 * Sets code
68
+	 *
69
+	 * @param string $code
70
+	 * @return boolean
71
+	 */
72
+	public function set_code($code)
73
+	{
74
+		return $this->set('CUR_code', $code);
75
+	}
76
+
77
+	/**
78
+	 * Gets active
79
+	 *
80
+	 * @return boolean
81
+	 */
82
+	public function active()
83
+	{
84
+		return $this->get('CUR_active');
85
+	}
86
+
87
+	/**
88
+	 * Sets active
89
+	 *
90
+	 * @param boolean $active
91
+	 * @return boolean
92
+	 */
93
+	public function set_active($active)
94
+	{
95
+		return $this->set('CUR_active', $active);
96
+	}
97
+
98
+	/**
99
+	 * Gets dec_plc
100
+	 *
101
+	 * @return int
102
+	 */
103
+	public function dec_plc()
104
+	{
105
+		return $this->get('CUR_dec_plc');
106
+	}
107
+
108
+	/**
109
+	 * Sets dec_plc
110
+	 *
111
+	 * @param int $dec_plc
112
+	 * @return boolean
113
+	 */
114
+	public function set_dec_plc($dec_plc)
115
+	{
116
+		return $this->set('CUR_dec_plc', $dec_plc);
117
+	}
118
+
119
+	/**
120
+	 * Gets plural
121
+	 *
122
+	 * @return string
123
+	 */
124
+	public function plural_name()
125
+	{
126
+		return $this->get('CUR_plural');
127
+	}
128
+
129
+	/**
130
+	 * Sets plural
131
+	 *
132
+	 * @param string $plural
133
+	 * @return boolean
134
+	 */
135
+	public function set_plural_name($plural)
136
+	{
137
+		return $this->set('CUR_plural', $plural);
138
+	}
139
+
140
+	/**
141
+	 * Gets sign
142
+	 *
143
+	 * @return string
144
+	 */
145
+	public function sign()
146
+	{
147
+		return $this->get('CUR_sign');
148
+	}
149
+
150
+	/**
151
+	 * Sets sign
152
+	 *
153
+	 * @param string $sign
154
+	 * @return boolean
155
+	 */
156
+	public function set_sign($sign)
157
+	{
158
+		return $this->set('CUR_sign', $sign);
159
+	}
160
+
161
+	/**
162
+	 * Gets single
163
+	 *
164
+	 * @return string
165
+	 */
166
+	public function singular_name()
167
+	{
168
+		return $this->get('CUR_single');
169
+	}
170
+
171
+	/**
172
+	 * Sets single
173
+	 *
174
+	 * @param string $single
175
+	 * @return boolean
176
+	 */
177
+	public function set_singular_name($single)
178
+	{
179
+		return $this->set('CUR_single', $single);
180
+	}
181
+
182
+	/**
183
+	 * Gets a prettier name
184
+	 *
185
+	 * @return string
186
+	 */
187
+	public function name()
188
+	{
189
+		return sprintf(esc_html__("%s (%s)", "event_espresso"), $this->code(), $this->plural_name());
190
+	}
191 191
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Message.class.php 2 patches
Indentation   +867 added lines, -867 removed lines patch added patch discarded remove patch
@@ -10,875 +10,875 @@
 block discarded – undo
10 10
 class EE_Message extends EE_Base_Class implements EEI_Admin_Links
11 11
 {
12 12
 
13
-    /**
14
-     * @deprecated 4.9.0  Added for backward compat with add-on's
15
-     * @type null
16
-     */
17
-    public $template_pack;
18
-
19
-    /**
20
-     * @deprecated 4.9.0 Added for backward compat with add-on's
21
-     * @type null
22
-     */
23
-    public $template_variation;
24
-
25
-    /**
26
-     * @deprecated 4.9.0 Added for backward compat with add-on's
27
-     * @type string
28
-     */
29
-    public $content = '';
30
-
31
-
32
-    /**
33
-     * @type EE_messenger $_messenger
34
-     */
35
-    protected $_messenger = null;
36
-
37
-    /**
38
-     * @type EE_message_type $_message_type
39
-     */
40
-    protected $_message_type = null;
41
-
42
-
43
-    /**
44
-     * @param array  $props_n_values
45
-     * @param string $timezone
46
-     * @param array  $date_formats incoming date formats in an array.  First value is the date_format, second is time
47
-     *                             format.
48
-     * @return EE_Message
49
-     */
50
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
51
-    {
52
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
53
-        // if object doesn't exist, let's generate a unique token on instantiation so that its available even before saving to db.
54
-        if (! $has_object) {
55
-            EE_Registry::instance()->load_helper('URL');
56
-            $props_n_values['MSG_token'] = EEH_URL::generate_unique_token();
57
-        }
58
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
59
-    }
60
-
61
-
62
-    /**
63
-     * @param array  $props_n_values
64
-     * @param string $timezone
65
-     * @return EE_Message
66
-     */
67
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
68
-    {
69
-        return new self($props_n_values, true, $timezone);
70
-    }
71
-
72
-
73
-    /**
74
-     * Gets MSG_token
75
-     *
76
-     * @return int
77
-     */
78
-    public function MSG_token()
79
-    {
80
-        return $this->get('MSG_token');
81
-    }
82
-
83
-
84
-    /**
85
-     * Sets MSG_token
86
-     *
87
-     * @param int $MSG_token
88
-     */
89
-    public function set_MSG_token($MSG_token)
90
-    {
91
-        $this->set('MSG_token', $MSG_token);
92
-    }
93
-
94
-
95
-    /**
96
-     * Gets GRP_ID
97
-     *
98
-     * @return int
99
-     */
100
-    public function GRP_ID()
101
-    {
102
-        return $this->get('GRP_ID');
103
-    }
104
-
105
-
106
-    /**
107
-     * Sets GRP_ID
108
-     *
109
-     * @param int $GRP_ID
110
-     */
111
-    public function set_GRP_ID($GRP_ID)
112
-    {
113
-        $this->set('GRP_ID', $GRP_ID);
114
-    }
115
-
116
-
117
-    /**
118
-     * Gets TXN_ID
119
-     *
120
-     * @return int
121
-     */
122
-    public function TXN_ID()
123
-    {
124
-        return $this->get('TXN_ID');
125
-    }
126
-
127
-
128
-    /**
129
-     * Sets TXN_ID
130
-     *
131
-     * @param int $TXN_ID
132
-     */
133
-    public function set_TXN_ID($TXN_ID)
134
-    {
135
-        $this->set('TXN_ID', $TXN_ID);
136
-    }
137
-
138
-
139
-    /**
140
-     * Gets messenger
141
-     *
142
-     * @return string
143
-     */
144
-    public function messenger()
145
-    {
146
-        return $this->get('MSG_messenger');
147
-    }
148
-
149
-
150
-    /**
151
-     * Sets messenger
152
-     *
153
-     * @param string $messenger
154
-     */
155
-    public function set_messenger($messenger)
156
-    {
157
-        $this->set('MSG_messenger', $messenger);
158
-    }
159
-
160
-
161
-    /**
162
-     * Returns corresponding messenger object for the set messenger on this message
163
-     *
164
-     * @return EE_messenger | null
165
-     */
166
-    public function messenger_object()
167
-    {
168
-        return $this->_messenger;
169
-    }
170
-
171
-
172
-    /**
173
-     * Sets messenger
174
-     *
175
-     * @param EE_messenger $messenger
176
-     */
177
-    public function set_messenger_object(EE_messenger $messenger)
178
-    {
179
-        $this->_messenger = $messenger;
180
-    }
181
-
182
-
183
-    /**
184
-     * validates messenger
185
-     *
186
-     * @param bool $throw_exceptions
187
-     * @return bool
188
-     * @throws \EE_Error
189
-     */
190
-    public function valid_messenger($throw_exceptions = false)
191
-    {
192
-        if ($this->_messenger instanceof EE_messenger) {
193
-            return true;
194
-        }
195
-        if ($throw_exceptions) {
196
-            throw new EE_Error(
197
-                sprintf(
198
-                    esc_html__(
199
-                        'The "%1$s" messenger set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
200
-                        'event_espresso'
201
-                    ),
202
-                    $this->messenger()
203
-                )
204
-            );
205
-        }
206
-        return false;
207
-    }
208
-
209
-
210
-    /**
211
-     * This returns the set localized label for the messenger on this message.
212
-     * Note, if unable to retrieve the EE_messenger object then will just return the messenger slug saved
213
-     * with this message.
214
-     *
215
-     * @param   bool $plural whether to return the plural label or not.
216
-     * @return string
217
-     */
218
-    public function messenger_label($plural = false)
219
-    {
220
-        $label_type = $plural ? 'plural' : 'singular';
221
-        $messenger = $this->messenger_object();
222
-        return $messenger instanceof EE_messenger ? $messenger->label[ $label_type ] : $this->messenger();
223
-    }
224
-
225
-
226
-    /**
227
-     * Gets message_type
228
-     *
229
-     * @return string
230
-     */
231
-    public function message_type()
232
-    {
233
-        return $this->get('MSG_message_type');
234
-    }
235
-
236
-
237
-    /**
238
-     * Sets message_type
239
-     *
240
-     * @param string $message_type
241
-     */
242
-    public function set_message_type($message_type)
243
-    {
244
-        $this->set('MSG_message_type', $message_type);
245
-    }
246
-
247
-
248
-    /**
249
-     * Returns the message type object for the set message type on this message
250
-     *
251
-     * @return EE_message_type | null
252
-     */
253
-    public function message_type_object()
254
-    {
255
-        return $this->_message_type;
256
-    }
257
-
258
-
259
-    /**
260
-     * Sets message_type
261
-     *
262
-     * @param EE_message_type $message_type
263
-     * @param bool            $set_priority   This indicates whether to set the priority to whatever the priority is on
264
-     *                                        the message type or not.
265
-     */
266
-    public function set_message_type_object(EE_message_type $message_type, $set_priority = false)
267
-    {
268
-        $this->_message_type = $message_type;
269
-        if ($set_priority) {
270
-            $this->set_priority($this->_message_type->get_priority());
271
-        }
272
-    }
273
-
274
-
275
-    /**
276
-     * validates message_type
277
-     *
278
-     * @param bool $throw_exceptions
279
-     * @return bool
280
-     * @throws \EE_Error
281
-     */
282
-    public function valid_message_type($throw_exceptions = false)
283
-    {
284
-        if ($this->_message_type instanceof EE_message_type) {
285
-            return true;
286
-        }
287
-        if ($throw_exceptions) {
288
-            throw new EE_Error(
289
-                sprintf(
290
-                    esc_html__(
291
-                        'The %1$s message type set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
292
-                        'event_espresso'
293
-                    ),
294
-                    $this->message_type()
295
-                )
296
-            );
297
-        }
298
-        return false;
299
-    }
300
-
301
-
302
-    /**
303
-     * validates messenger and message_type (that they are valid EE_messenger and EE_message_type objects).
304
-     *
305
-     * @param bool $throw_exceptions
306
-     * @return bool
307
-     * @throws \EE_Error
308
-     */
309
-    public function is_valid($throw_exceptions = false)
310
-    {
311
-        if ($this->valid_messenger($throw_exceptions) && $this->valid_message_type($throw_exceptions)) {
312
-            return true;
313
-        }
314
-        return false;
315
-    }
316
-
317
-
318
-    /**
319
-     * This validates whether the internal messenger and message type objects are valid for sending.
320
-     * Three checks are done:
321
-     * 1. There is a valid messenger object.
322
-     * 2. There is a valid message type object.
323
-     * 3. The message type object is active for the messenger.
324
-     *
325
-     * @throws EE_Error  But only if $throw_exceptions is set to true.
326
-     * @param bool $throw_exceptions
327
-     * @return bool
328
-     */
329
-    public function is_valid_for_sending_or_generation($throw_exceptions = false)
330
-    {
331
-        $valid = false;
332
-        if ($this->is_valid($throw_exceptions)) {
333
-            /** @var EE_Message_Resource_Manager $message_resource_manager */
334
-            $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
335
-            $valid = $message_resource_manager->is_message_type_active_for_messenger(
336
-                $this->messenger(),
337
-                $this->message_type()
338
-            );
339
-            if (! $valid && $throw_exceptions) {
340
-                throw new EE_Error(
341
-                    sprintf(
342
-                        esc_html__(
343
-                            'The %1$s message type is not a valid message type for the %2$s messenger so it will not be sent.',
344
-                            'event_espresso'
345
-                        ),
346
-                        $this->message_type(),
347
-                        $this->messenger()
348
-                    )
349
-                );
350
-            }
351
-        }
352
-        return $valid;
353
-    }
354
-
355
-
356
-    /**
357
-     * This returns the set localized label for the message type on this message.
358
-     * Note, if unable to retrieve the EE_message_type object then will just return the message type slug saved
359
-     * with this message.
360
-     *
361
-     * @param   bool $plural whether to return the plural label or not.
362
-     * @return string
363
-     */
364
-    public function message_type_label($plural = false)
365
-    {
366
-        $label_type = $plural ? 'plural' : 'singular';
367
-        $message_type = $this->message_type_object();
368
-        return $message_type instanceof EE_message_type
369
-            ? $message_type->label[ $label_type ]
370
-            : str_replace(
371
-                '_',
372
-                ' ',
373
-                $this->message_type()
374
-            );
375
-    }
376
-
377
-
378
-    /**
379
-     * Gets context
380
-     *
381
-     * @return string
382
-     */
383
-    public function context()
384
-    {
385
-        return $this->get('MSG_context');
386
-    }
387
-
388
-
389
-    /**
390
-     * This returns the corresponding localized label for the given context slug, if possible from installed message
391
-     * types. Otherwise, this will just return the set context slug on this object.
392
-     *
393
-     * @return string
394
-     */
395
-    public function context_label()
396
-    {
397
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
398
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
399
-        $contexts = $message_resource_manager->get_all_contexts();
400
-        return isset($contexts[ $this->context() ]) ? $contexts[ $this->context() ] : $this->context();
401
-    }
402
-
403
-
404
-    /**
405
-     * Sets context
406
-     *
407
-     * @param string $context
408
-     */
409
-    public function set_context($context)
410
-    {
411
-        $this->set('MSG_context', $context);
412
-    }
413
-
414
-
415
-    /**
416
-     * Gets recipient_ID
417
-     *
418
-     * @return int
419
-     */
420
-    public function recipient_ID()
421
-    {
422
-        return $this->get('MSG_recipient_ID');
423
-    }
424
-
425
-
426
-    /**
427
-     * Sets recipient_ID
428
-     *
429
-     * @param string $recipient_ID
430
-     */
431
-    public function set_recipient_ID($recipient_ID)
432
-    {
433
-        $this->set('MSG_recipient_ID', $recipient_ID);
434
-    }
435
-
436
-
437
-    /**
438
-     * Gets recipient_type
439
-     *
440
-     * @return string
441
-     */
442
-    public function recipient_type()
443
-    {
444
-        return $this->get('MSG_recipient_type');
445
-    }
446
-
447
-
448
-    /**
449
-     * Return the related object matching the recipient type and ID.
450
-     *
451
-     * @return EE_Base_Class | null
452
-     */
453
-    public function recipient_object()
454
-    {
455
-        if (! $this->recipient_type() || ! $this->recipient_ID()) {
456
-            return null;
457
-        }
458
-
459
-        return $this->get_first_related($this->recipient_type());
460
-    }
461
-
462
-
463
-    /**
464
-     * Sets recipient_type
465
-     *
466
-     * @param string $recipient_type
467
-     */
468
-    public function set_recipient_type($recipient_type)
469
-    {
470
-        $this->set('MSG_recipient_type', $recipient_type);
471
-    }
472
-
473
-
474
-    /**
475
-     * Gets content
476
-     *
477
-     * @return string
478
-     */
479
-    public function content()
480
-    {
481
-        return $this->get('MSG_content');
482
-    }
483
-
484
-
485
-    /**
486
-     * Sets content
487
-     *
488
-     * @param string $content
489
-     */
490
-    public function set_content($content)
491
-    {
492
-        $this->set('MSG_content', $content);
493
-    }
494
-
495
-
496
-    /**
497
-     * Gets subject
498
-     *
499
-     * @return string
500
-     */
501
-    public function subject()
502
-    {
503
-        return $this->get('MSG_subject');
504
-    }
505
-
506
-
507
-    /**
508
-     * Sets subject
509
-     *
510
-     * @param string $subject
511
-     */
512
-    public function set_subject($subject)
513
-    {
514
-        $this->set('MSG_subject', $subject);
515
-    }
516
-
517
-
518
-    /**
519
-     * Gets to
520
-     *
521
-     * @return string
522
-     */
523
-    public function to()
524
-    {
525
-        $to = $this->get('MSG_to');
526
-        return empty($to) ? esc_html__('No recipient', 'event_espresso') : $to;
527
-    }
528
-
529
-
530
-    /**
531
-     * Sets to
532
-     *
533
-     * @param string $to
534
-     */
535
-    public function set_to($to)
536
-    {
537
-        $this->set('MSG_to', $to);
538
-    }
539
-
540
-
541
-    /**
542
-     * Gets from
543
-     *
544
-     * @return string
545
-     */
546
-    public function from()
547
-    {
548
-        return $this->get('MSG_from');
549
-    }
550
-
551
-
552
-    /**
553
-     * Sets from
554
-     *
555
-     * @param string $from
556
-     */
557
-    public function set_from($from)
558
-    {
559
-        $this->set('MSG_from', $from);
560
-    }
561
-
562
-
563
-    /**
564
-     * Gets priority
565
-     *
566
-     * @return int
567
-     */
568
-    public function priority()
569
-    {
570
-        return $this->get('MSG_priority');
571
-    }
572
-
573
-
574
-    /**
575
-     * Sets priority
576
-     * Note.  Send Now Messengers always override any priority that may be set on a Message.  So
577
-     * this method calls the send_now method to verify that.
578
-     *
579
-     * @param int $priority
580
-     */
581
-    public function set_priority($priority)
582
-    {
583
-        $priority = $this->send_now() ? EEM_Message::priority_high : $priority;
584
-        parent::set('MSG_priority', $priority);
585
-    }
586
-
587
-
588
-    /**
589
-     * Overrides parent::set method so we can capture any sets for priority.
590
-     *
591
-     * @see parent::set() for phpdocs
592
-     * @param string $field_name
593
-     * @param mixed  $field_value
594
-     * @param bool   $use_default
595
-     * @throws EE_Error
596
-     */
597
-    public function set($field_name, $field_value, $use_default = false)
598
-    {
599
-        if ($field_name === 'MSG_priority') {
600
-            $this->set_priority($field_value);
601
-        }
602
-        parent::set($field_name, $field_value, $use_default);
603
-    }
604
-
605
-
606
-    /**
607
-     * @return bool
608
-     * @throws \EE_Error
609
-     */
610
-    public function send_now()
611
-    {
612
-        $send_now = $this->valid_messenger() && $this->messenger_object()->send_now() ? EEM_Message::priority_high
613
-            : $this->priority();
614
-        return $send_now === EEM_Message::priority_high ? true : false;
615
-    }
616
-
617
-
618
-    /**
619
-     * Gets STS_ID
620
-     *
621
-     * @return string
622
-     */
623
-    public function STS_ID()
624
-    {
625
-        return $this->get('STS_ID');
626
-    }
627
-
628
-
629
-    /**
630
-     * Sets STS_ID
631
-     *
632
-     * @param string $STS_ID
633
-     */
634
-    public function set_STS_ID($STS_ID)
635
-    {
636
-        $this->set('STS_ID', $STS_ID);
637
-    }
638
-
639
-
640
-    /**
641
-     * Gets created
642
-     *
643
-     * @return string
644
-     */
645
-    public function created()
646
-    {
647
-        return $this->get('MSG_created');
648
-    }
649
-
650
-
651
-    /**
652
-     * Sets created
653
-     *
654
-     * @param string $created
655
-     */
656
-    public function set_created($created)
657
-    {
658
-        $this->set('MSG_created', $created);
659
-    }
660
-
661
-
662
-    /**
663
-     * Gets modified
664
-     *
665
-     * @return string
666
-     */
667
-    public function modified()
668
-    {
669
-        return $this->get('MSG_modified');
670
-    }
671
-
672
-
673
-    /**
674
-     * Sets modified
675
-     *
676
-     * @param string $modified
677
-     */
678
-    public function set_modified($modified)
679
-    {
680
-        $this->set('MSG_modified', $modified);
681
-    }
682
-
683
-
684
-    /**
685
-     * Sets generation data for this message.
686
-     *
687
-     * @param mixed $data
688
-     */
689
-    public function set_generation_data($data)
690
-    {
691
-        $this->set_field_or_extra_meta('MSG_generation_data', $data);
692
-    }
693
-
694
-
695
-    /**
696
-     * Returns any set generation data for this message.
697
-     *
698
-     * @return mixed|null
699
-     */
700
-    public function get_generation_data()
701
-    {
702
-        return $this->get_field_or_extra_meta('MSG_generation_data');
703
-    }
704
-
705
-
706
-    /**
707
-     * Gets any error message.
708
-     *
709
-     * @return mixed|null
710
-     */
711
-    public function error_message()
712
-    {
713
-        return $this->get_field_or_extra_meta('MSG_error');
714
-    }
715
-
716
-
717
-    /**
718
-     * Sets an error message.
719
-     *
720
-     * @param $message
721
-     * @return bool|int
722
-     */
723
-    public function set_error_message($message)
724
-    {
725
-        return $this->set_field_or_extra_meta('MSG_error', $message);
726
-    }
727
-
728
-
729
-    /**
730
-     * This retrieves the associated template pack with this message.
731
-     *
732
-     * @return EE_Messages_Template_Pack | null
733
-     */
734
-    public function get_template_pack()
735
-    {
736
-        /**
737
-         * This is deprecated functionality that will be removed eventually but included here now for backward compat.
738
-         */
739
-        if (! empty($this->template_pack)) {
740
-            return $this->template_pack;
741
-        }
742
-        /** @type EE_Message_Template_Group $grp */
743
-        $grp = $this->get_first_related('Message_Template_Group');
744
-        // if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
745
-        if (! $grp instanceof EE_Message_Template_Group) {
746
-            $grp = EEM_Message_Template_Group::instance()->get_one(
747
-                array(
748
-                    array(
749
-                        'MTP_messenger'    => $this->messenger(),
750
-                        'MTP_message_type' => $this->message_type(),
751
-                        'MTP_is_global'    => true,
752
-                    ),
753
-                )
754
-            );
755
-        }
756
-
757
-        return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack() : null;
758
-    }
759
-
760
-
761
-    /**
762
-     * Retrieves the variation used for generating this message.
763
-     *
764
-     * @return string
765
-     */
766
-    public function get_template_pack_variation()
767
-    {
768
-        /**
769
-         * This is deprecated functionality that will be removed eventually but included here now for backward compat.
770
-         */
771
-        if (! empty($this->template_variation)) {
772
-            return $this->template_variation;
773
-        }
774
-
775
-        /** @type EE_Message_Template_Group $grp */
776
-        $grp = $this->get_first_related('Message_Template_Group');
777
-
778
-        // if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
779
-        if (! $grp instanceof EE_Message_Template_Group) {
780
-            $grp = EEM_Message_Template_Group::instance()->get_one(
781
-                array(
782
-                    array(
783
-                        'MTP_messenger'    => $this->messenger(),
784
-                        'MTP_message_type' => $this->message_type(),
785
-                        'MTP_is_global'    => true,
786
-                    ),
787
-                )
788
-            );
789
-        }
790
-
791
-        return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack_variation() : '';
792
-    }
793
-
794
-    /**
795
-     * Return the link to the admin details for the object.
796
-     *
797
-     * @return string
798
-     */
799
-    public function get_admin_details_link()
800
-    {
801
-        EE_Registry::instance()->load_helper('URL');
802
-        EE_Registry::instance()->load_helper('MSG_Template');
803
-        switch ($this->STS_ID()) {
804
-            case EEM_Message::status_failed:
805
-            case EEM_Message::status_debug_only:
806
-                return EEH_MSG_Template::generate_error_display_trigger($this);
807
-                break;
808
-
809
-            case EEM_Message::status_sent:
810
-                return EEH_MSG_Template::generate_browser_trigger($this);
811
-                break;
812
-
813
-            default:
814
-                return '';
815
-        }
816
-    }
817
-
818
-    /**
819
-     * Returns the link to the editor for the object.  Sometimes this is the same as the details.
820
-     *
821
-     * @return string
822
-     */
823
-    public function get_admin_edit_link()
824
-    {
825
-        return $this->get_admin_details_link();
826
-    }
827
-
828
-    /**
829
-     * Returns the link to a settings page for the object.
830
-     *
831
-     * @return string
832
-     */
833
-    public function get_admin_settings_link()
834
-    {
835
-        EE_Registry::instance()->load_helper('URL');
836
-        return EEH_URL::add_query_args_and_nonce(
837
-            array(
838
-                'page'   => 'espresso_messages',
839
-                'action' => 'settings',
840
-            ),
841
-            admin_url('admin.php')
842
-        );
843
-    }
844
-
845
-    /**
846
-     * Returns the link to the "overview" for the object (typically the "list table" view).
847
-     *
848
-     * @return string
849
-     */
850
-    public function get_admin_overview_link()
851
-    {
852
-        EE_Registry::instance()->load_helper('URL');
853
-        return EEH_URL::add_query_args_and_nonce(
854
-            array(
855
-                'page'   => 'espresso_messages',
856
-                'action' => 'default',
857
-            ),
858
-            admin_url('admin.php')
859
-        );
860
-    }
861
-
862
-
863
-    /**
864
-     * This sets the EEM_Message::status_messenger_executing class on the message and the appropriate error message for
865
-     * it.
866
-     * Note this also SAVES the current message object to the db because it adds an error message to accompany the
867
-     * status.
868
-     *
869
-     */
870
-    public function set_messenger_is_executing()
871
-    {
872
-        $this->set_STS_ID(EEM_Message::status_messenger_executing);
873
-        $this->set_error_message(
874
-            esc_html__(
875
-                'A message with this status indicates that there was a problem that occurred while the message was being
13
+	/**
14
+	 * @deprecated 4.9.0  Added for backward compat with add-on's
15
+	 * @type null
16
+	 */
17
+	public $template_pack;
18
+
19
+	/**
20
+	 * @deprecated 4.9.0 Added for backward compat with add-on's
21
+	 * @type null
22
+	 */
23
+	public $template_variation;
24
+
25
+	/**
26
+	 * @deprecated 4.9.0 Added for backward compat with add-on's
27
+	 * @type string
28
+	 */
29
+	public $content = '';
30
+
31
+
32
+	/**
33
+	 * @type EE_messenger $_messenger
34
+	 */
35
+	protected $_messenger = null;
36
+
37
+	/**
38
+	 * @type EE_message_type $_message_type
39
+	 */
40
+	protected $_message_type = null;
41
+
42
+
43
+	/**
44
+	 * @param array  $props_n_values
45
+	 * @param string $timezone
46
+	 * @param array  $date_formats incoming date formats in an array.  First value is the date_format, second is time
47
+	 *                             format.
48
+	 * @return EE_Message
49
+	 */
50
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
51
+	{
52
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
53
+		// if object doesn't exist, let's generate a unique token on instantiation so that its available even before saving to db.
54
+		if (! $has_object) {
55
+			EE_Registry::instance()->load_helper('URL');
56
+			$props_n_values['MSG_token'] = EEH_URL::generate_unique_token();
57
+		}
58
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
59
+	}
60
+
61
+
62
+	/**
63
+	 * @param array  $props_n_values
64
+	 * @param string $timezone
65
+	 * @return EE_Message
66
+	 */
67
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
68
+	{
69
+		return new self($props_n_values, true, $timezone);
70
+	}
71
+
72
+
73
+	/**
74
+	 * Gets MSG_token
75
+	 *
76
+	 * @return int
77
+	 */
78
+	public function MSG_token()
79
+	{
80
+		return $this->get('MSG_token');
81
+	}
82
+
83
+
84
+	/**
85
+	 * Sets MSG_token
86
+	 *
87
+	 * @param int $MSG_token
88
+	 */
89
+	public function set_MSG_token($MSG_token)
90
+	{
91
+		$this->set('MSG_token', $MSG_token);
92
+	}
93
+
94
+
95
+	/**
96
+	 * Gets GRP_ID
97
+	 *
98
+	 * @return int
99
+	 */
100
+	public function GRP_ID()
101
+	{
102
+		return $this->get('GRP_ID');
103
+	}
104
+
105
+
106
+	/**
107
+	 * Sets GRP_ID
108
+	 *
109
+	 * @param int $GRP_ID
110
+	 */
111
+	public function set_GRP_ID($GRP_ID)
112
+	{
113
+		$this->set('GRP_ID', $GRP_ID);
114
+	}
115
+
116
+
117
+	/**
118
+	 * Gets TXN_ID
119
+	 *
120
+	 * @return int
121
+	 */
122
+	public function TXN_ID()
123
+	{
124
+		return $this->get('TXN_ID');
125
+	}
126
+
127
+
128
+	/**
129
+	 * Sets TXN_ID
130
+	 *
131
+	 * @param int $TXN_ID
132
+	 */
133
+	public function set_TXN_ID($TXN_ID)
134
+	{
135
+		$this->set('TXN_ID', $TXN_ID);
136
+	}
137
+
138
+
139
+	/**
140
+	 * Gets messenger
141
+	 *
142
+	 * @return string
143
+	 */
144
+	public function messenger()
145
+	{
146
+		return $this->get('MSG_messenger');
147
+	}
148
+
149
+
150
+	/**
151
+	 * Sets messenger
152
+	 *
153
+	 * @param string $messenger
154
+	 */
155
+	public function set_messenger($messenger)
156
+	{
157
+		$this->set('MSG_messenger', $messenger);
158
+	}
159
+
160
+
161
+	/**
162
+	 * Returns corresponding messenger object for the set messenger on this message
163
+	 *
164
+	 * @return EE_messenger | null
165
+	 */
166
+	public function messenger_object()
167
+	{
168
+		return $this->_messenger;
169
+	}
170
+
171
+
172
+	/**
173
+	 * Sets messenger
174
+	 *
175
+	 * @param EE_messenger $messenger
176
+	 */
177
+	public function set_messenger_object(EE_messenger $messenger)
178
+	{
179
+		$this->_messenger = $messenger;
180
+	}
181
+
182
+
183
+	/**
184
+	 * validates messenger
185
+	 *
186
+	 * @param bool $throw_exceptions
187
+	 * @return bool
188
+	 * @throws \EE_Error
189
+	 */
190
+	public function valid_messenger($throw_exceptions = false)
191
+	{
192
+		if ($this->_messenger instanceof EE_messenger) {
193
+			return true;
194
+		}
195
+		if ($throw_exceptions) {
196
+			throw new EE_Error(
197
+				sprintf(
198
+					esc_html__(
199
+						'The "%1$s" messenger set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
200
+						'event_espresso'
201
+					),
202
+					$this->messenger()
203
+				)
204
+			);
205
+		}
206
+		return false;
207
+	}
208
+
209
+
210
+	/**
211
+	 * This returns the set localized label for the messenger on this message.
212
+	 * Note, if unable to retrieve the EE_messenger object then will just return the messenger slug saved
213
+	 * with this message.
214
+	 *
215
+	 * @param   bool $plural whether to return the plural label or not.
216
+	 * @return string
217
+	 */
218
+	public function messenger_label($plural = false)
219
+	{
220
+		$label_type = $plural ? 'plural' : 'singular';
221
+		$messenger = $this->messenger_object();
222
+		return $messenger instanceof EE_messenger ? $messenger->label[ $label_type ] : $this->messenger();
223
+	}
224
+
225
+
226
+	/**
227
+	 * Gets message_type
228
+	 *
229
+	 * @return string
230
+	 */
231
+	public function message_type()
232
+	{
233
+		return $this->get('MSG_message_type');
234
+	}
235
+
236
+
237
+	/**
238
+	 * Sets message_type
239
+	 *
240
+	 * @param string $message_type
241
+	 */
242
+	public function set_message_type($message_type)
243
+	{
244
+		$this->set('MSG_message_type', $message_type);
245
+	}
246
+
247
+
248
+	/**
249
+	 * Returns the message type object for the set message type on this message
250
+	 *
251
+	 * @return EE_message_type | null
252
+	 */
253
+	public function message_type_object()
254
+	{
255
+		return $this->_message_type;
256
+	}
257
+
258
+
259
+	/**
260
+	 * Sets message_type
261
+	 *
262
+	 * @param EE_message_type $message_type
263
+	 * @param bool            $set_priority   This indicates whether to set the priority to whatever the priority is on
264
+	 *                                        the message type or not.
265
+	 */
266
+	public function set_message_type_object(EE_message_type $message_type, $set_priority = false)
267
+	{
268
+		$this->_message_type = $message_type;
269
+		if ($set_priority) {
270
+			$this->set_priority($this->_message_type->get_priority());
271
+		}
272
+	}
273
+
274
+
275
+	/**
276
+	 * validates message_type
277
+	 *
278
+	 * @param bool $throw_exceptions
279
+	 * @return bool
280
+	 * @throws \EE_Error
281
+	 */
282
+	public function valid_message_type($throw_exceptions = false)
283
+	{
284
+		if ($this->_message_type instanceof EE_message_type) {
285
+			return true;
286
+		}
287
+		if ($throw_exceptions) {
288
+			throw new EE_Error(
289
+				sprintf(
290
+					esc_html__(
291
+						'The %1$s message type set for this message is missing or invalid. Please double-check the spelling and verify that the correct files exist.',
292
+						'event_espresso'
293
+					),
294
+					$this->message_type()
295
+				)
296
+			);
297
+		}
298
+		return false;
299
+	}
300
+
301
+
302
+	/**
303
+	 * validates messenger and message_type (that they are valid EE_messenger and EE_message_type objects).
304
+	 *
305
+	 * @param bool $throw_exceptions
306
+	 * @return bool
307
+	 * @throws \EE_Error
308
+	 */
309
+	public function is_valid($throw_exceptions = false)
310
+	{
311
+		if ($this->valid_messenger($throw_exceptions) && $this->valid_message_type($throw_exceptions)) {
312
+			return true;
313
+		}
314
+		return false;
315
+	}
316
+
317
+
318
+	/**
319
+	 * This validates whether the internal messenger and message type objects are valid for sending.
320
+	 * Three checks are done:
321
+	 * 1. There is a valid messenger object.
322
+	 * 2. There is a valid message type object.
323
+	 * 3. The message type object is active for the messenger.
324
+	 *
325
+	 * @throws EE_Error  But only if $throw_exceptions is set to true.
326
+	 * @param bool $throw_exceptions
327
+	 * @return bool
328
+	 */
329
+	public function is_valid_for_sending_or_generation($throw_exceptions = false)
330
+	{
331
+		$valid = false;
332
+		if ($this->is_valid($throw_exceptions)) {
333
+			/** @var EE_Message_Resource_Manager $message_resource_manager */
334
+			$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
335
+			$valid = $message_resource_manager->is_message_type_active_for_messenger(
336
+				$this->messenger(),
337
+				$this->message_type()
338
+			);
339
+			if (! $valid && $throw_exceptions) {
340
+				throw new EE_Error(
341
+					sprintf(
342
+						esc_html__(
343
+							'The %1$s message type is not a valid message type for the %2$s messenger so it will not be sent.',
344
+							'event_espresso'
345
+						),
346
+						$this->message_type(),
347
+						$this->messenger()
348
+					)
349
+				);
350
+			}
351
+		}
352
+		return $valid;
353
+	}
354
+
355
+
356
+	/**
357
+	 * This returns the set localized label for the message type on this message.
358
+	 * Note, if unable to retrieve the EE_message_type object then will just return the message type slug saved
359
+	 * with this message.
360
+	 *
361
+	 * @param   bool $plural whether to return the plural label or not.
362
+	 * @return string
363
+	 */
364
+	public function message_type_label($plural = false)
365
+	{
366
+		$label_type = $plural ? 'plural' : 'singular';
367
+		$message_type = $this->message_type_object();
368
+		return $message_type instanceof EE_message_type
369
+			? $message_type->label[ $label_type ]
370
+			: str_replace(
371
+				'_',
372
+				' ',
373
+				$this->message_type()
374
+			);
375
+	}
376
+
377
+
378
+	/**
379
+	 * Gets context
380
+	 *
381
+	 * @return string
382
+	 */
383
+	public function context()
384
+	{
385
+		return $this->get('MSG_context');
386
+	}
387
+
388
+
389
+	/**
390
+	 * This returns the corresponding localized label for the given context slug, if possible from installed message
391
+	 * types. Otherwise, this will just return the set context slug on this object.
392
+	 *
393
+	 * @return string
394
+	 */
395
+	public function context_label()
396
+	{
397
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
398
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
399
+		$contexts = $message_resource_manager->get_all_contexts();
400
+		return isset($contexts[ $this->context() ]) ? $contexts[ $this->context() ] : $this->context();
401
+	}
402
+
403
+
404
+	/**
405
+	 * Sets context
406
+	 *
407
+	 * @param string $context
408
+	 */
409
+	public function set_context($context)
410
+	{
411
+		$this->set('MSG_context', $context);
412
+	}
413
+
414
+
415
+	/**
416
+	 * Gets recipient_ID
417
+	 *
418
+	 * @return int
419
+	 */
420
+	public function recipient_ID()
421
+	{
422
+		return $this->get('MSG_recipient_ID');
423
+	}
424
+
425
+
426
+	/**
427
+	 * Sets recipient_ID
428
+	 *
429
+	 * @param string $recipient_ID
430
+	 */
431
+	public function set_recipient_ID($recipient_ID)
432
+	{
433
+		$this->set('MSG_recipient_ID', $recipient_ID);
434
+	}
435
+
436
+
437
+	/**
438
+	 * Gets recipient_type
439
+	 *
440
+	 * @return string
441
+	 */
442
+	public function recipient_type()
443
+	{
444
+		return $this->get('MSG_recipient_type');
445
+	}
446
+
447
+
448
+	/**
449
+	 * Return the related object matching the recipient type and ID.
450
+	 *
451
+	 * @return EE_Base_Class | null
452
+	 */
453
+	public function recipient_object()
454
+	{
455
+		if (! $this->recipient_type() || ! $this->recipient_ID()) {
456
+			return null;
457
+		}
458
+
459
+		return $this->get_first_related($this->recipient_type());
460
+	}
461
+
462
+
463
+	/**
464
+	 * Sets recipient_type
465
+	 *
466
+	 * @param string $recipient_type
467
+	 */
468
+	public function set_recipient_type($recipient_type)
469
+	{
470
+		$this->set('MSG_recipient_type', $recipient_type);
471
+	}
472
+
473
+
474
+	/**
475
+	 * Gets content
476
+	 *
477
+	 * @return string
478
+	 */
479
+	public function content()
480
+	{
481
+		return $this->get('MSG_content');
482
+	}
483
+
484
+
485
+	/**
486
+	 * Sets content
487
+	 *
488
+	 * @param string $content
489
+	 */
490
+	public function set_content($content)
491
+	{
492
+		$this->set('MSG_content', $content);
493
+	}
494
+
495
+
496
+	/**
497
+	 * Gets subject
498
+	 *
499
+	 * @return string
500
+	 */
501
+	public function subject()
502
+	{
503
+		return $this->get('MSG_subject');
504
+	}
505
+
506
+
507
+	/**
508
+	 * Sets subject
509
+	 *
510
+	 * @param string $subject
511
+	 */
512
+	public function set_subject($subject)
513
+	{
514
+		$this->set('MSG_subject', $subject);
515
+	}
516
+
517
+
518
+	/**
519
+	 * Gets to
520
+	 *
521
+	 * @return string
522
+	 */
523
+	public function to()
524
+	{
525
+		$to = $this->get('MSG_to');
526
+		return empty($to) ? esc_html__('No recipient', 'event_espresso') : $to;
527
+	}
528
+
529
+
530
+	/**
531
+	 * Sets to
532
+	 *
533
+	 * @param string $to
534
+	 */
535
+	public function set_to($to)
536
+	{
537
+		$this->set('MSG_to', $to);
538
+	}
539
+
540
+
541
+	/**
542
+	 * Gets from
543
+	 *
544
+	 * @return string
545
+	 */
546
+	public function from()
547
+	{
548
+		return $this->get('MSG_from');
549
+	}
550
+
551
+
552
+	/**
553
+	 * Sets from
554
+	 *
555
+	 * @param string $from
556
+	 */
557
+	public function set_from($from)
558
+	{
559
+		$this->set('MSG_from', $from);
560
+	}
561
+
562
+
563
+	/**
564
+	 * Gets priority
565
+	 *
566
+	 * @return int
567
+	 */
568
+	public function priority()
569
+	{
570
+		return $this->get('MSG_priority');
571
+	}
572
+
573
+
574
+	/**
575
+	 * Sets priority
576
+	 * Note.  Send Now Messengers always override any priority that may be set on a Message.  So
577
+	 * this method calls the send_now method to verify that.
578
+	 *
579
+	 * @param int $priority
580
+	 */
581
+	public function set_priority($priority)
582
+	{
583
+		$priority = $this->send_now() ? EEM_Message::priority_high : $priority;
584
+		parent::set('MSG_priority', $priority);
585
+	}
586
+
587
+
588
+	/**
589
+	 * Overrides parent::set method so we can capture any sets for priority.
590
+	 *
591
+	 * @see parent::set() for phpdocs
592
+	 * @param string $field_name
593
+	 * @param mixed  $field_value
594
+	 * @param bool   $use_default
595
+	 * @throws EE_Error
596
+	 */
597
+	public function set($field_name, $field_value, $use_default = false)
598
+	{
599
+		if ($field_name === 'MSG_priority') {
600
+			$this->set_priority($field_value);
601
+		}
602
+		parent::set($field_name, $field_value, $use_default);
603
+	}
604
+
605
+
606
+	/**
607
+	 * @return bool
608
+	 * @throws \EE_Error
609
+	 */
610
+	public function send_now()
611
+	{
612
+		$send_now = $this->valid_messenger() && $this->messenger_object()->send_now() ? EEM_Message::priority_high
613
+			: $this->priority();
614
+		return $send_now === EEM_Message::priority_high ? true : false;
615
+	}
616
+
617
+
618
+	/**
619
+	 * Gets STS_ID
620
+	 *
621
+	 * @return string
622
+	 */
623
+	public function STS_ID()
624
+	{
625
+		return $this->get('STS_ID');
626
+	}
627
+
628
+
629
+	/**
630
+	 * Sets STS_ID
631
+	 *
632
+	 * @param string $STS_ID
633
+	 */
634
+	public function set_STS_ID($STS_ID)
635
+	{
636
+		$this->set('STS_ID', $STS_ID);
637
+	}
638
+
639
+
640
+	/**
641
+	 * Gets created
642
+	 *
643
+	 * @return string
644
+	 */
645
+	public function created()
646
+	{
647
+		return $this->get('MSG_created');
648
+	}
649
+
650
+
651
+	/**
652
+	 * Sets created
653
+	 *
654
+	 * @param string $created
655
+	 */
656
+	public function set_created($created)
657
+	{
658
+		$this->set('MSG_created', $created);
659
+	}
660
+
661
+
662
+	/**
663
+	 * Gets modified
664
+	 *
665
+	 * @return string
666
+	 */
667
+	public function modified()
668
+	{
669
+		return $this->get('MSG_modified');
670
+	}
671
+
672
+
673
+	/**
674
+	 * Sets modified
675
+	 *
676
+	 * @param string $modified
677
+	 */
678
+	public function set_modified($modified)
679
+	{
680
+		$this->set('MSG_modified', $modified);
681
+	}
682
+
683
+
684
+	/**
685
+	 * Sets generation data for this message.
686
+	 *
687
+	 * @param mixed $data
688
+	 */
689
+	public function set_generation_data($data)
690
+	{
691
+		$this->set_field_or_extra_meta('MSG_generation_data', $data);
692
+	}
693
+
694
+
695
+	/**
696
+	 * Returns any set generation data for this message.
697
+	 *
698
+	 * @return mixed|null
699
+	 */
700
+	public function get_generation_data()
701
+	{
702
+		return $this->get_field_or_extra_meta('MSG_generation_data');
703
+	}
704
+
705
+
706
+	/**
707
+	 * Gets any error message.
708
+	 *
709
+	 * @return mixed|null
710
+	 */
711
+	public function error_message()
712
+	{
713
+		return $this->get_field_or_extra_meta('MSG_error');
714
+	}
715
+
716
+
717
+	/**
718
+	 * Sets an error message.
719
+	 *
720
+	 * @param $message
721
+	 * @return bool|int
722
+	 */
723
+	public function set_error_message($message)
724
+	{
725
+		return $this->set_field_or_extra_meta('MSG_error', $message);
726
+	}
727
+
728
+
729
+	/**
730
+	 * This retrieves the associated template pack with this message.
731
+	 *
732
+	 * @return EE_Messages_Template_Pack | null
733
+	 */
734
+	public function get_template_pack()
735
+	{
736
+		/**
737
+		 * This is deprecated functionality that will be removed eventually but included here now for backward compat.
738
+		 */
739
+		if (! empty($this->template_pack)) {
740
+			return $this->template_pack;
741
+		}
742
+		/** @type EE_Message_Template_Group $grp */
743
+		$grp = $this->get_first_related('Message_Template_Group');
744
+		// if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
745
+		if (! $grp instanceof EE_Message_Template_Group) {
746
+			$grp = EEM_Message_Template_Group::instance()->get_one(
747
+				array(
748
+					array(
749
+						'MTP_messenger'    => $this->messenger(),
750
+						'MTP_message_type' => $this->message_type(),
751
+						'MTP_is_global'    => true,
752
+					),
753
+				)
754
+			);
755
+		}
756
+
757
+		return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack() : null;
758
+	}
759
+
760
+
761
+	/**
762
+	 * Retrieves the variation used for generating this message.
763
+	 *
764
+	 * @return string
765
+	 */
766
+	public function get_template_pack_variation()
767
+	{
768
+		/**
769
+		 * This is deprecated functionality that will be removed eventually but included here now for backward compat.
770
+		 */
771
+		if (! empty($this->template_variation)) {
772
+			return $this->template_variation;
773
+		}
774
+
775
+		/** @type EE_Message_Template_Group $grp */
776
+		$grp = $this->get_first_related('Message_Template_Group');
777
+
778
+		// if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
779
+		if (! $grp instanceof EE_Message_Template_Group) {
780
+			$grp = EEM_Message_Template_Group::instance()->get_one(
781
+				array(
782
+					array(
783
+						'MTP_messenger'    => $this->messenger(),
784
+						'MTP_message_type' => $this->message_type(),
785
+						'MTP_is_global'    => true,
786
+					),
787
+				)
788
+			);
789
+		}
790
+
791
+		return $grp instanceof EE_Message_Template_Group ? $grp->get_template_pack_variation() : '';
792
+	}
793
+
794
+	/**
795
+	 * Return the link to the admin details for the object.
796
+	 *
797
+	 * @return string
798
+	 */
799
+	public function get_admin_details_link()
800
+	{
801
+		EE_Registry::instance()->load_helper('URL');
802
+		EE_Registry::instance()->load_helper('MSG_Template');
803
+		switch ($this->STS_ID()) {
804
+			case EEM_Message::status_failed:
805
+			case EEM_Message::status_debug_only:
806
+				return EEH_MSG_Template::generate_error_display_trigger($this);
807
+				break;
808
+
809
+			case EEM_Message::status_sent:
810
+				return EEH_MSG_Template::generate_browser_trigger($this);
811
+				break;
812
+
813
+			default:
814
+				return '';
815
+		}
816
+	}
817
+
818
+	/**
819
+	 * Returns the link to the editor for the object.  Sometimes this is the same as the details.
820
+	 *
821
+	 * @return string
822
+	 */
823
+	public function get_admin_edit_link()
824
+	{
825
+		return $this->get_admin_details_link();
826
+	}
827
+
828
+	/**
829
+	 * Returns the link to a settings page for the object.
830
+	 *
831
+	 * @return string
832
+	 */
833
+	public function get_admin_settings_link()
834
+	{
835
+		EE_Registry::instance()->load_helper('URL');
836
+		return EEH_URL::add_query_args_and_nonce(
837
+			array(
838
+				'page'   => 'espresso_messages',
839
+				'action' => 'settings',
840
+			),
841
+			admin_url('admin.php')
842
+		);
843
+	}
844
+
845
+	/**
846
+	 * Returns the link to the "overview" for the object (typically the "list table" view).
847
+	 *
848
+	 * @return string
849
+	 */
850
+	public function get_admin_overview_link()
851
+	{
852
+		EE_Registry::instance()->load_helper('URL');
853
+		return EEH_URL::add_query_args_and_nonce(
854
+			array(
855
+				'page'   => 'espresso_messages',
856
+				'action' => 'default',
857
+			),
858
+			admin_url('admin.php')
859
+		);
860
+	}
861
+
862
+
863
+	/**
864
+	 * This sets the EEM_Message::status_messenger_executing class on the message and the appropriate error message for
865
+	 * it.
866
+	 * Note this also SAVES the current message object to the db because it adds an error message to accompany the
867
+	 * status.
868
+	 *
869
+	 */
870
+	public function set_messenger_is_executing()
871
+	{
872
+		$this->set_STS_ID(EEM_Message::status_messenger_executing);
873
+		$this->set_error_message(
874
+			esc_html__(
875
+				'A message with this status indicates that there was a problem that occurred while the message was being
876 876
                 processed by the messenger.  It is still possible that the message was sent successfully, but at some
877 877
                 point during the processing there was a failure.  This usually is indicative of a timeout issue with PHP 
878 878
                 or memory limits being reached.  If you see this repeatedly you may want to consider upgrading the memory 
879 879
                 available to PHP on your server.',
880
-                'event_espresso'
881
-            )
882
-        );
883
-    }
880
+				'event_espresso'
881
+			)
882
+		);
883
+	}
884 884
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -51,7 +51,7 @@  discard block
 block discarded – undo
51 51
     {
52 52
         $has_object = parent::_check_for_object($props_n_values, __CLASS__);
53 53
         // if object doesn't exist, let's generate a unique token on instantiation so that its available even before saving to db.
54
-        if (! $has_object) {
54
+        if ( ! $has_object) {
55 55
             EE_Registry::instance()->load_helper('URL');
56 56
             $props_n_values['MSG_token'] = EEH_URL::generate_unique_token();
57 57
         }
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
     {
220 220
         $label_type = $plural ? 'plural' : 'singular';
221 221
         $messenger = $this->messenger_object();
222
-        return $messenger instanceof EE_messenger ? $messenger->label[ $label_type ] : $this->messenger();
222
+        return $messenger instanceof EE_messenger ? $messenger->label[$label_type] : $this->messenger();
223 223
     }
224 224
 
225 225
 
@@ -336,7 +336,7 @@  discard block
 block discarded – undo
336 336
                 $this->messenger(),
337 337
                 $this->message_type()
338 338
             );
339
-            if (! $valid && $throw_exceptions) {
339
+            if ( ! $valid && $throw_exceptions) {
340 340
                 throw new EE_Error(
341 341
                     sprintf(
342 342
                         esc_html__(
@@ -366,7 +366,7 @@  discard block
 block discarded – undo
366 366
         $label_type = $plural ? 'plural' : 'singular';
367 367
         $message_type = $this->message_type_object();
368 368
         return $message_type instanceof EE_message_type
369
-            ? $message_type->label[ $label_type ]
369
+            ? $message_type->label[$label_type]
370 370
             : str_replace(
371 371
                 '_',
372 372
                 ' ',
@@ -397,7 +397,7 @@  discard block
 block discarded – undo
397 397
         /** @type EE_Message_Resource_Manager $message_resource_manager */
398 398
         $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
399 399
         $contexts = $message_resource_manager->get_all_contexts();
400
-        return isset($contexts[ $this->context() ]) ? $contexts[ $this->context() ] : $this->context();
400
+        return isset($contexts[$this->context()]) ? $contexts[$this->context()] : $this->context();
401 401
     }
402 402
 
403 403
 
@@ -452,7 +452,7 @@  discard block
 block discarded – undo
452 452
      */
453 453
     public function recipient_object()
454 454
     {
455
-        if (! $this->recipient_type() || ! $this->recipient_ID()) {
455
+        if ( ! $this->recipient_type() || ! $this->recipient_ID()) {
456 456
             return null;
457 457
         }
458 458
 
@@ -736,13 +736,13 @@  discard block
 block discarded – undo
736 736
         /**
737 737
          * This is deprecated functionality that will be removed eventually but included here now for backward compat.
738 738
          */
739
-        if (! empty($this->template_pack)) {
739
+        if ( ! empty($this->template_pack)) {
740 740
             return $this->template_pack;
741 741
         }
742 742
         /** @type EE_Message_Template_Group $grp */
743 743
         $grp = $this->get_first_related('Message_Template_Group');
744 744
         // if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
745
-        if (! $grp instanceof EE_Message_Template_Group) {
745
+        if ( ! $grp instanceof EE_Message_Template_Group) {
746 746
             $grp = EEM_Message_Template_Group::instance()->get_one(
747 747
                 array(
748 748
                     array(
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
         /**
769 769
          * This is deprecated functionality that will be removed eventually but included here now for backward compat.
770 770
          */
771
-        if (! empty($this->template_variation)) {
771
+        if ( ! empty($this->template_variation)) {
772 772
             return $this->template_variation;
773 773
         }
774 774
 
@@ -776,7 +776,7 @@  discard block
 block discarded – undo
776 776
         $grp = $this->get_first_related('Message_Template_Group');
777 777
 
778 778
         // if no group then let's try to get the first related group by internal messenger and message type (will use global grp).
779
-        if (! $grp instanceof EE_Message_Template_Group) {
779
+        if ( ! $grp instanceof EE_Message_Template_Group) {
780 780
             $grp = EEM_Message_Template_Group::instance()->get_one(
781 781
                 array(
782 782
                     array(
Please login to merge, or discard this patch.