Completed
Branch FET-10766-extract-activation-d... (99f7dd)
by
unknown
134:15 queued 121:56
created
shortcodes/espresso_events/EES_Espresso_Events.shortcode.php 1 patch
Indentation   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -10,15 +10,15 @@  discard block
 block discarded – undo
10 10
 class EES_Espresso_Events  extends EES_Shortcode {
11 11
 
12 12
 	/**
13
-     * @deprecated 4.9.27
14
-     *  @return 	void
13
+	 * @deprecated 4.9.27
14
+	 *  @return 	void
15 15
 	 */
16 16
 	public static function set_hooks() {
17 17
 	}
18 18
 
19 19
 	/**
20
-     * @deprecated 4.9.27
21
-     *  @return 	void
20
+	 * @deprecated 4.9.27
21
+	 *  @return 	void
22 22
 	 */
23 23
 	public static function set_hooks_admin() {
24 24
 	}
@@ -26,8 +26,8 @@  discard block
 block discarded – undo
26 26
 
27 27
 
28 28
 	/**
29
-     * @deprecated 4.9.27
30
-     * @param WP $WP
29
+	 * @deprecated 4.9.27
30
+	 * @param WP $WP
31 31
 	 * @return    void
32 32
 	 */
33 33
 	public function run( WP $WP ) {
@@ -36,21 +36,21 @@  discard block
 block discarded – undo
36 36
 
37 37
 
38 38
 	/**
39
-     * @deprecated 4.9.27
40
-     *  @param 	array 	$attributes
39
+	 * @deprecated 4.9.27
40
+	 *  @param 	array 	$attributes
41 41
 	 *  @return 	string
42 42
 	 */
43 43
 	public function process_shortcode( $attributes = array() ) {
44
-        \EE_Error::doing_it_wrong(
45
-            __METHOD__,
46
-            __(
47
-                'Usage is deprecated. Please use \EventEspresso\core\domain\entities\shortcodes\EspressoEvents instead.',
48
-                'event_espresso'
49
-            ),
50
-            '4.9.27'
51
-        );
52
-        return '';
53
-    }
44
+		\EE_Error::doing_it_wrong(
45
+			__METHOD__,
46
+			__(
47
+				'Usage is deprecated. Please use \EventEspresso\core\domain\entities\shortcodes\EspressoEvents instead.',
48
+				'event_espresso'
49
+			),
50
+			'4.9.27'
51
+		);
52
+		return '';
53
+	}
54 54
 
55 55
 
56 56
 
Please login to merge, or discard this patch.
admin/new/pricing/templates/event_tickets_datetime_ticket_row.template.php 1 patch
Braces   +40 added lines, -16 removed lines patch added patch discarded remove patch
@@ -6,24 +6,33 @@  discard block
 block discarded – undo
6 6
 		<?php if ( $disabled ) : ?>
7 7
 			<input type="hidden" id="edit-ticket-TKT_start_date-<?php echo $tkt_row; ?>"  name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_start_date]" class="edit-ticket-TKT_start_date ee-text-inp" value="<?php echo $TKT_start_date; ?>" >
8 8
 			<input type="text" name="archived_ticket[TKT_start_date]" class="edit-ticket-TKT_start_date ee-text-inp" value="<?php echo $TKT_start_date; ?>" disabled>
9
-		<?php else : ?>
10
-			<input id="edit-ticket-TKT_start_date-<?php echo $tkt_row; ?>" type="text" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_start_date]" class="edit-ticket-TKT_start_date ee-text-inp ee-datepicker" value="<?php echo $TKT_start_date; ?>" data-context="start-ticket" data-date-field-context="#display-ticketrow-<?php echo $tkt_row; ?>" data-related-field=".edit-ticket-TKT_end_date" data-next-field=".edit-ticket-TKT_end_date">
9
+		<?php else {
10
+	: ?>
11
+			<input id="edit-ticket-TKT_start_date-<?php echo $tkt_row;
12
+}
13
+?>" type="text" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_start_date]" class="edit-ticket-TKT_start_date ee-text-inp ee-datepicker" value="<?php echo $TKT_start_date; ?>" data-context="start-ticket" data-date-field-context="#display-ticketrow-<?php echo $tkt_row; ?>" data-related-field=".edit-ticket-TKT_end_date" data-next-field=".edit-ticket-TKT_end_date">
11 14
 		<?php endif; ?>
12 15
 	</td>
13 16
 	<td>
14 17
 		<?php if ( $disabled ) : ?>
15 18
 			<input type="hidden" id="edit-ticket-TKT_end_date-<?php echo $tkt_row; ?>"  name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_end_date]" class="edit-ticket-TKT_end_date ee-text-inp" value="<?php echo $TKT_end_date; ?>" >
16 19
 			<input type="text" name="archived_ticket[TKT_end_date]" class="edit-ticket-TKT_end_date ee-text-inp" value="<?php echo $TKT_end_date; ?>" disabled>
17
-		<?php else : ?>
18
-			<input id="edit-ticket-TKT_end_date-<?php echo $tkt_row; ?>" type="text" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_end_date]" class="edit-ticket-TKT_end_date ee-text-inp ee-datepicker" value="<?php echo $TKT_end_date; ?>" data-context="end-ticket" data-date-field-context="#display-ticketrow-<?php echo $tkt_row; ?>" data-related-field=".edit-ticket-TKT_start_date" data-next-field=".edit-ticket-TKT_qty">
20
+		<?php else {
21
+	: ?>
22
+			<input id="edit-ticket-TKT_end_date-<?php echo $tkt_row;
23
+}
24
+?>" type="text" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_end_date]" class="edit-ticket-TKT_end_date ee-text-inp ee-datepicker" value="<?php echo $TKT_end_date; ?>" data-context="end-ticket" data-date-field-context="#display-ticketrow-<?php echo $tkt_row; ?>" data-related-field=".edit-ticket-TKT_start_date" data-next-field=".edit-ticket-TKT_qty">
19 25
 		<?php endif; ?>
20 26
 	</td>
21 27
 	<td>
22 28
 		<?php if ( $disabled ) : ?>
23 29
 			<input id="edit-ticket-TKT_base_price-<?php echo $tkt_row; ?>" type="hidden" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_base_price]" class="edit-ticket-TKT_base_price ee-small-text-inp edit-price-PRC_amount ee-numeric" value="<?php echo $TKT_base_price; ?>">
24 30
 			<input type="text" name="archived_ticket[<?php echo $tkt_row; ?>][TKT_base_price]" class="edit-ticket-TKT_base_price ee-small-text-inp edit-price-PRC_amount ee-numeric" value="<?php echo $TKT_base_price; ?>" disabled>
25
-		<?php else : ?>
26
-			<input id="edit-ticket-TKT_base_price-<?php echo $tkt_row; ?>" type="text" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_base_price]" class="edit-ticket-TKT_base_price ee-small-text-inp edit-price-PRC_amount ee-numeric" value="<?php echo $TKT_base_price; ?>">
31
+		<?php else {
32
+	: ?>
33
+			<input id="edit-ticket-TKT_base_price-<?php echo $tkt_row;
34
+}
35
+?>" type="text" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_base_price]" class="edit-ticket-TKT_base_price ee-small-text-inp edit-price-PRC_amount ee-numeric" value="<?php echo $TKT_base_price; ?>">
27 36
 		<?php endif; ?>
28 37
 		<input type="hidden" id="edit-ticket-TKT_base_price_ID-<?php echo $tkt_row; ?>" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_base_price_ID]" value="<?php echo $TKT_base_price_ID; ?>">
29 38
 	</td>
@@ -31,8 +40,11 @@  discard block
 block discarded – undo
31 40
 		<?php if ( $disabled ) : ?>
32 41
 			<input type="hidden" class="edit-ticket-TKT_qty ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_qty]" value="<?php echo $TKT_qty_for_input; ?>">
33 42
 			<input type="text" class="edit-ticket-TKT_qty ee-small-text-inp ee-numeric" name="archived_ticket[<?php echo $tkt_row; ?>][TKT_qty]" value="<?php echo $TKT_qty_for_input; ?>" disabled>
34
-		<?php else : ?>
35
-			<input type="text" id="edit-ticket-TKT_qty-<?php echo $tkt_row; ?>" class="edit-ticket-TKT_qty ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_qty]" value="<?php echo $TKT_qty_for_input; ?>">
43
+		<?php else {
44
+	: ?>
45
+			<input type="text" id="edit-ticket-TKT_qty-<?php echo $tkt_row;
46
+}
47
+?>" class="edit-ticket-TKT_qty ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_qty]" value="<?php echo $TKT_qty_for_input; ?>">
36 48
 		<?php endif; ?>
37 49
 	</td>
38 50
 	<!--<td><span class="ticket-display-row-TKT_price"><?php //echo $TKT_price; ?></span></td>-->
@@ -78,24 +90,33 @@  discard block
 block discarded – undo
78 90
 								<?php if ( $disabled ) : ?>
79 91
 									<input type="hidden" class="edit-ticket-TKT_uses ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_uses]" value="<?php echo $TKT_uses; ?>">
80 92
 									<input type="text" class="edit-ticket-TKT_uses ee-small-text-inp ee-numeric" name="archived_ticket[<?php echo $tkt_row; ?>][TKT_uses]" value="<?php echo $TKT_uses; ?>" disabled>
81
-								<?php else : ?>
82
-									<input type="text" class="edit-ticket-TKT_uses ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_uses]" value="<?php echo $TKT_uses; ?>">
93
+								<?php else {
94
+	: ?>
95
+									<input type="text" class="edit-ticket-TKT_uses ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name;
96
+}
97
+?>[<?php echo $tkt_row; ?>][TKT_uses]" value="<?php echo $TKT_uses; ?>">
83 98
 								<?php endif; ?>
84 99
 							</td>
85 100
 							<td>
86 101
 								<?php if ( $disabled ) : ?>
87 102
 									<input type="hidden" class="edit-ticket-TKT_min ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_min]" value="<?php echo $TKT_min; ?>">
88 103
 									<input type="text" class="edit-ticket-TKT_min ee-small-text-inp ee-numeric" name="archived_ticket[<?php echo $tkt_row; ?>][TKT_min]" value="<?php echo $TKT_min; ?>" disabled>
89
-								<?php else: ?>
90
-									<input type="text" class="edit-ticket-TKT_min ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_min]" value="<?php echo $TKT_min; ?>">
104
+								<?php else {
105
+	: ?>
106
+									<input type="text" class="edit-ticket-TKT_min ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name;
107
+}
108
+?>[<?php echo $tkt_row; ?>][TKT_min]" value="<?php echo $TKT_min; ?>">
91 109
 								<?php endif; ?>
92 110
 							</td>
93 111
 							<td>
94 112
 								<?php if ( $disabled ) : ?>
95 113
 									<input type="hidden" class="edit-ticket-TKT_max ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_max]" value="<?php echo $TKT_max; ?>">
96 114
 									<input type="text" class="edit-ticket-TKT_max ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_max]" value="<?php echo $TKT_max; ?>" disabled>
97
-								<?php else : ?>
98
-									<input type="text" class="edit-ticket-TKT_max ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name; ?>[<?php echo $tkt_row; ?>][TKT_max]" value="<?php echo $TKT_max; ?>">
115
+								<?php else {
116
+	: ?>
117
+									<input type="text" class="edit-ticket-TKT_max ee-small-text-inp ee-numeric" name="<?php echo $edit_tickets_name;
118
+}
119
+?>[<?php echo $tkt_row; ?>][TKT_max]" value="<?php echo $TKT_max; ?>">
99 120
 								<?php endif; ?>
100 121
 							</td>
101 122
 						</tr>
@@ -116,8 +137,11 @@  discard block
 block discarded – undo
116 137
 							?>
117 138
 							<input class="TKT-taxable-checkbox" type="hidden" name="<?php echo $edit_tickets_name;?>[<?php echo $tkt_row; ?>][TKT_taxable]" value="<?php echo $tax_value; ?>">
118 139
 							<input class="TKT-taxable-checkbox" id="edit-ticket-TKT_taxable-<?php echo $tkt_row; ?>" type="checkbox" name="archived_ticket[<?php echo $tkt_row; ?>][TKT_taxable]" value="1"<?php echo $TKT_taxable; ?> disabled>
119
-						<?php else : ?>
120
-							<input class="TKT-taxable-checkbox" id="edit-ticket-TKT_taxable-<?php echo $tkt_row; ?>" type="checkbox" name="<?php echo $edit_tickets_name;?>[<?php echo $tkt_row; ?>][TKT_taxable]" value="1"<?php echo $TKT_taxable; ?>>
140
+						<?php else {
141
+	: ?>
142
+							<input class="TKT-taxable-checkbox" id="edit-ticket-TKT_taxable-<?php echo $tkt_row;
143
+}
144
+?>" type="checkbox" name="<?php echo $edit_tickets_name;?>[<?php echo $tkt_row; ?>][TKT_taxable]" value="1"<?php echo $TKT_taxable; ?>>
121 145
 						<?php endif; ?>
122 146
 						<label for="edit-ticket-TKT_taxable-<?php echo $tkt_row; ?>"> <?php esc_html_e('This ticket is taxable.', 'event_espresso'); ?>
123 147
 					<?php } //end tax_rows check ?>
Please login to merge, or discard this patch.
acceptance_tests/Page/EventsAdmin.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -120,7 +120,7 @@
 block discarded – undo
120 120
 
121 121
     /**
122 122
      * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
123
-     * @param     $field_name
123
+     * @param     string $field_name
124 124
      * @param int $row_number
125 125
      * @return string
126 126
      */
Please login to merge, or discard this patch.
Indentation   +177 added lines, -177 removed lines patch added patch discarded remove patch
@@ -14,181 +14,181 @@
 block discarded – undo
14 14
 class EventsAdmin extends CoreAdmin
15 15
 {
16 16
 
17
-    /**
18
-     * Selector for the Add new Event button in the admin.
19
-     * @var string
20
-     */
21
-    const ADD_NEW_EVENT_BUTTON_SELECTOR = '#add-new-event';
22
-
23
-
24
-    /**
25
-     * Selector for the Event Title field in the event editor
26
-     * @var string
27
-     */
28
-    const EVENT_EDITOR_TITLE_FIELD_SELECTOR = "//input[@id='title']";
29
-
30
-    /**
31
-     * Selector for the publish submit button in the event editor.
32
-     * @var string
33
-     */
34
-    const EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR = "#publish";
35
-
36
-
37
-    /**
38
-     * @var string
39
-     */
40
-    const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
41
-
42
-    /**
43
-     * Selector for the view link after publishing an event.
44
-     * @var string
45
-     */
46
-    const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
47
-
48
-
49
-    /**
50
-     * Selector for the ID of the event in the event editor
51
-     * @var string
52
-     */
53
-    const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
54
-
55
-
56
-    /**
57
-     * Selector for the search input on the event list table page.
58
-     * @var string
59
-     */
60
-    const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
61
-
62
-
63
-
64
-
65
-    /**
66
-     * @param string $additional_params
67
-     * @return string
68
-     */
69
-    public static function defaultEventsListTableUrl($additional_params = '')
70
-    {
71
-        return self::adminUrl('espresso_events', 'default', $additional_params);
72
-    }
73
-
74
-
75
-    /**
76
-     * The selector for the DTTname field for the given row in the event editor.
77
-     * @param int $row_number
78
-     * @return string
79
-     */
80
-    public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
81
-    {
82
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
83
-    }
84
-
85
-
86
-    /**
87
-     * The selector for the DTT_EVT_start field for the given row in the event editor.d
88
-     * @param int $row_number
89
-     * @return string
90
-     */
91
-    public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
92
-    {
93
-        return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
94
-    }
95
-
96
-
97
-    /**
98
-     * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
99
-     *
100
-     * @param string $field_name
101
-     * @param int    $row_number
102
-     * @return string
103
-     */
104
-    public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
105
-    {
106
-        return "//input[@id='event-datetime-$field_name-$row_number']";
107
-    }
108
-
109
-
110
-    /**
111
-     * The selector for the TKT_name field for the given display row in the event editor.
112
-     * @param int $row_number
113
-     * @return string
114
-     */
115
-    public static function eventEditorTicketNameFieldSelector($row_number = 1)
116
-    {
117
-        return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
118
-    }
119
-
120
-
121
-    /**
122
-     * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
123
-     * @param     $field_name
124
-     * @param int $row_number
125
-     * @return string
126
-     */
127
-    public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
128
-    {
129
-        return "//tr[@id='display-ticketrow-$row_number']"
130
-               . "/td[2]/input[@class='edit-ticket-$field_name ee-large-text-inp']";
131
-    }
132
-
133
-
134
-    /**
135
-     * Returns the selector for the event title edit link in the events list table for the given Event Title.
136
-     * @param string $event_title
137
-     * @return string
138
-     */
139
-    public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
140
-    {
141
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
142
-    }
143
-
144
-
145
-    /**
146
-     * Locator for for the ID column in the event list table for a given event title.
147
-     * @param string $event_title
148
-     * @return string
149
-     */
150
-    public static function eventListTableEventIdSelectorForTitle($event_title)
151
-    {
152
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
153
-               . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
154
-    }
155
-
156
-
157
-    /**
158
-     * Locator for the view link in the row of an event list table for the given event title.
159
-     * @param string $event_title
160
-     * @return string
161
-     */
162
-    public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
163
-    {
164
-        return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
165
-               . "//ancestor::td//span[@class='view']/a";
166
-    }
167
-
168
-
169
-    /**
170
-     * Locator for the messenger tab in the Notifications metabox in the event editor.
171
-     * @param string $messenger_slug  The slug for the messenger (it's reference slug).
172
-     * @return string
173
-     */
174
-    public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
175
-    {
176
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
177
-               . "//a[@rel='ee-tab-$messenger_slug']";
178
-    }
179
-
180
-
181
-    /**
182
-     * Locator for the select input within the notifications metabox.
183
-     * Note, this assumes the tab content for the related messenger is already visible.
184
-     * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
185
-     * @return string
186
-     */
187
-    public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
188
-    {
189
-        return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
190
-               . "//table[@class='messages-custom-template-switcher']"
191
-               . "//tr/td[contains(.,'Registration Approved')]"
192
-               . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
193
-    }
17
+	/**
18
+	 * Selector for the Add new Event button in the admin.
19
+	 * @var string
20
+	 */
21
+	const ADD_NEW_EVENT_BUTTON_SELECTOR = '#add-new-event';
22
+
23
+
24
+	/**
25
+	 * Selector for the Event Title field in the event editor
26
+	 * @var string
27
+	 */
28
+	const EVENT_EDITOR_TITLE_FIELD_SELECTOR = "//input[@id='title']";
29
+
30
+	/**
31
+	 * Selector for the publish submit button in the event editor.
32
+	 * @var string
33
+	 */
34
+	const EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR = "#publish";
35
+
36
+
37
+	/**
38
+	 * @var string
39
+	 */
40
+	const EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR = '#EVT_default_registration_status';
41
+
42
+	/**
43
+	 * Selector for the view link after publishing an event.
44
+	 * @var string
45
+	 */
46
+	const EVENT_EDITOR_VIEW_LINK_AFTER_PUBLISH_SELECTOR = "//div[@id='message']/p/a";
47
+
48
+
49
+	/**
50
+	 * Selector for the ID of the event in the event editor
51
+	 * @var string
52
+	 */
53
+	const EVENT_EDITOR_EVT_ID_SELECTOR = "//input[@id='post_ID']";
54
+
55
+
56
+	/**
57
+	 * Selector for the search input on the event list table page.
58
+	 * @var string
59
+	 */
60
+	const EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR = '#toplevel_page_espresso_events-search-input';
61
+
62
+
63
+
64
+
65
+	/**
66
+	 * @param string $additional_params
67
+	 * @return string
68
+	 */
69
+	public static function defaultEventsListTableUrl($additional_params = '')
70
+	{
71
+		return self::adminUrl('espresso_events', 'default', $additional_params);
72
+	}
73
+
74
+
75
+	/**
76
+	 * The selector for the DTTname field for the given row in the event editor.
77
+	 * @param int $row_number
78
+	 * @return string
79
+	 */
80
+	public static function eventEditorDatetimeNameFieldSelector($row_number = 1)
81
+	{
82
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_name', $row_number);
83
+	}
84
+
85
+
86
+	/**
87
+	 * The selector for the DTT_EVT_start field for the given row in the event editor.d
88
+	 * @param int $row_number
89
+	 * @return string
90
+	 */
91
+	public static function eventEditorDatetimeStartDateFieldSelector($row_number = 1)
92
+	{
93
+		return self::eventEditorDatetimeFieldSelectorForField('DTT_EVT_start', $row_number);
94
+	}
95
+
96
+
97
+	/**
98
+	 * Wrapper for getting the selector for a given field and given row of a datetime in the event editor.
99
+	 *
100
+	 * @param string $field_name
101
+	 * @param int    $row_number
102
+	 * @return string
103
+	 */
104
+	public static function eventEditorDatetimeFieldSelectorForField($field_name, $row_number = 1)
105
+	{
106
+		return "//input[@id='event-datetime-$field_name-$row_number']";
107
+	}
108
+
109
+
110
+	/**
111
+	 * The selector for the TKT_name field for the given display row in the event editor.
112
+	 * @param int $row_number
113
+	 * @return string
114
+	 */
115
+	public static function eventEditorTicketNameFieldSelector($row_number = 1)
116
+	{
117
+		return self::eventEditorTicketFieldSelectorForFieldInDisplayRow('TKT_name', $row_number);
118
+	}
119
+
120
+
121
+	/**
122
+	 * Wrapper for getting the selector for a given field and given display row of a ticket in the event editor.
123
+	 * @param     $field_name
124
+	 * @param int $row_number
125
+	 * @return string
126
+	 */
127
+	public static function eventEditorTicketFieldSelectorForFieldInDisplayRow($field_name, $row_number = 1)
128
+	{
129
+		return "//tr[@id='display-ticketrow-$row_number']"
130
+			   . "/td[2]/input[@class='edit-ticket-$field_name ee-large-text-inp']";
131
+	}
132
+
133
+
134
+	/**
135
+	 * Returns the selector for the event title edit link in the events list table for the given Event Title.
136
+	 * @param string $event_title
137
+	 * @return string
138
+	 */
139
+	public static function eventListTableEventTitleEditLinkSelectorForTitle($event_title)
140
+	{
141
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']";
142
+	}
143
+
144
+
145
+	/**
146
+	 * Locator for for the ID column in the event list table for a given event title.
147
+	 * @param string $event_title
148
+	 * @return string
149
+	 */
150
+	public static function eventListTableEventIdSelectorForTitle($event_title)
151
+	{
152
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
153
+			   . "//ancestor::tr/th[contains(@class, 'check-column')]/input";
154
+	}
155
+
156
+
157
+	/**
158
+	 * Locator for the view link in the row of an event list table for the given event title.
159
+	 * @param string $event_title
160
+	 * @return string
161
+	 */
162
+	public static function eventListTableEventTitleViewLinkSelectorForTitle($event_title)
163
+	{
164
+		return "//td[contains(@class, 'column-name')]/strong/a[text()='$event_title']"
165
+			   . "//ancestor::td//span[@class='view']/a";
166
+	}
167
+
168
+
169
+	/**
170
+	 * Locator for the messenger tab in the Notifications metabox in the event editor.
171
+	 * @param string $messenger_slug  The slug for the messenger (it's reference slug).
172
+	 * @return string
173
+	 */
174
+	public static function eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug)
175
+	{
176
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
177
+			   . "//a[@rel='ee-tab-$messenger_slug']";
178
+	}
179
+
180
+
181
+	/**
182
+	 * Locator for the select input within the notifications metabox.
183
+	 * Note, this assumes the tab content for the related messenger is already visible.
184
+	 * @param string $message_type_label The message type label (visible string in the table) you want the selector for.
185
+	 * @return string
186
+	 */
187
+	public static function eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label)
188
+	{
189
+		return "//div[@id='espresso_events_Messages_Hooks_Extend_messages_metabox_metabox']"
190
+			   . "//table[@class='messages-custom-template-switcher']"
191
+			   . "//tr/td[contains(.,'Registration Approved')]"
192
+			   . "//ancestor::tr//select[contains(@class,'message-template-selector')]";
193
+	}
194 194
 }
Please login to merge, or discard this patch.
acceptance_tests/Helpers/BaseCoreAdmin.php 1 patch
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -13,58 +13,58 @@
 block discarded – undo
13 13
 trait BaseCoreAdmin
14 14
 {
15 15
 
16
-    /**
17
-     * Core method for going to an Event Espresso Admin page.
18
-     * @param string $page
19
-     * @param string $action
20
-     * @param string $additional_params
21
-     */
22
-    public function amOnEventEspressoAdminPage($page = '', $action = '', $additional_params = '')
23
-    {
24
-        $this->actor()->amOnAdminPage(CoreAdmin::adminUrl($page, $action, $additional_params));
25
-    }
16
+	/**
17
+	 * Core method for going to an Event Espresso Admin page.
18
+	 * @param string $page
19
+	 * @param string $action
20
+	 * @param string $additional_params
21
+	 */
22
+	public function amOnEventEspressoAdminPage($page = '', $action = '', $additional_params = '')
23
+	{
24
+		$this->actor()->amOnAdminPage(CoreAdmin::adminUrl($page, $action, $additional_params));
25
+	}
26 26
 
27 27
 
28
-    /**
29
-     * Helper method for returning an instance of the Actor.  Intended to help with IDE fill out of methods.
30
-     * @return \EventEspressoAcceptanceTester;
31
-     */
32
-    protected function actor()
33
-    {
34
-        /** @var \EventEspressoAcceptanceTester $this */
35
-        return $this;
36
-    }
28
+	/**
29
+	 * Helper method for returning an instance of the Actor.  Intended to help with IDE fill out of methods.
30
+	 * @return \EventEspressoAcceptanceTester;
31
+	 */
32
+	protected function actor()
33
+	{
34
+		/** @var \EventEspressoAcceptanceTester $this */
35
+		return $this;
36
+	}
37 37
 
38 38
 
39
-    /**
40
-     * Use this to set the per page option for a list table page.
41
-     * Assumes you are on a page that has this field exposed.
42
-     *
43
-     * @param int|string $per_page_value
44
-     * @throws \Codeception\Exception\TestRuntimeException
45
-     */
46
-    public function setPerPageOptionForScreen($per_page_value)
47
-    {
48
-        $this->actor()->click(CoreAdmin::WP_SCREEN_SETTINGS_LINK_SELECTOR);
49
-        $this->actor()->fillField(CoreAdmin::WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR, $per_page_value);
50
-        $this->actor()->click(CoreAdmin::WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR);
51
-        $this->actor()->wait(8);
52
-    }
39
+	/**
40
+	 * Use this to set the per page option for a list table page.
41
+	 * Assumes you are on a page that has this field exposed.
42
+	 *
43
+	 * @param int|string $per_page_value
44
+	 * @throws \Codeception\Exception\TestRuntimeException
45
+	 */
46
+	public function setPerPageOptionForScreen($per_page_value)
47
+	{
48
+		$this->actor()->click(CoreAdmin::WP_SCREEN_SETTINGS_LINK_SELECTOR);
49
+		$this->actor()->fillField(CoreAdmin::WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR, $per_page_value);
50
+		$this->actor()->click(CoreAdmin::WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR);
51
+		$this->actor()->wait(8);
52
+	}
53 53
 
54 54
 
55 55
 
56
-    /**
57
-     * Use this to append a given value to a wpEditor instance.
58
-     * How it works is it first switched the instance to the text (or html) view so that the textarea is exposed and
59
-     * the value is added to the text area.
60
-     *
61
-     * @param $field_reference
62
-     * @param $value
63
-     * @throws \Codeception\Exception\ElementNotFound
64
-     */
65
-    public function appendToWPEditorField($field_reference, $value)
66
-    {
67
-        $this->actor()->click(CoreAdmin::wpEditorTextTabSelector($field_reference));
68
-        $this->actor()->appendField(CoreAdmin::wpEditorTextAreaSelector($field_reference), $value);
69
-    }
56
+	/**
57
+	 * Use this to append a given value to a wpEditor instance.
58
+	 * How it works is it first switched the instance to the text (or html) view so that the textarea is exposed and
59
+	 * the value is added to the text area.
60
+	 *
61
+	 * @param $field_reference
62
+	 * @param $value
63
+	 * @throws \Codeception\Exception\ElementNotFound
64
+	 */
65
+	public function appendToWPEditorField($field_reference, $value)
66
+	{
67
+		$this->actor()->click(CoreAdmin::wpEditorTextTabSelector($field_reference));
68
+		$this->actor()->appendField(CoreAdmin::wpEditorTextAreaSelector($field_reference), $value);
69
+	}
70 70
 }
Please login to merge, or discard this patch.
acceptance_tests/Helpers/MessagesAdmin.php 1 patch
Indentation   +224 added lines, -224 removed lines patch added patch discarded remove patch
@@ -10,228 +10,228 @@
 block discarded – undo
10 10
  */
11 11
 trait MessagesAdmin
12 12
 {
13
-    /**
14
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
15
-     *                                  a string.
16
-     */
17
-    public function amOnMessagesActivityListTablePage($additional_params = '')
18
-    {
19
-        $this->actor()->amOnAdminPage(MessagesPage::messageActivityListTableUrl($additional_params));
20
-    }
21
-
22
-    /**
23
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
24
-     *                                  a string.
25
-     */
26
-    public function amOnDefaultMessageTemplateListTablePage($additional_params = '')
27
-    {
28
-        $this->actor()->amOnAdminPage(MessagesPage::defaultMessageTemplateListTableUrl($additional_params));
29
-    }
30
-
31
-
32
-    /**
33
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
34
-     *                                  a string.
35
-     */
36
-    public function amOnCustomMessageTemplateListTablePage($additional_params = '')
37
-    {
38
-        $this->actor()->amOnAdminPage(MessagesPage::customMessageTemplateListTableUrl($additional_params));
39
-    }
40
-
41
-
42
-    /**
43
-     * Directs to message settings page
44
-     */
45
-    public function amOnMessageSettingsPage()
46
-    {
47
-        $this->actor()->amOnAdminPage(MessagesPage::messageSettingsUrl());
48
-    }
49
-
50
-
51
-    public function activateMessageTypeForMessenger($message_type_slug, $messenger_slug = 'email')
52
-    {
53
-        $this->actor()->dragAndDrop(
54
-            MessagesPage::draggableSettingsBoxSelectorForMessageTypeAndMessenger($message_type_slug, $messenger_slug),
55
-            MessagesPage::MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR
56
-        );
57
-    }
58
-
59
-
60
-    /**
61
-     * Assumes you are already on the list table page that has the ui for editing the template.
62
-     * @param string $message_type_slug
63
-     * @param string $context [optional] if you want to click directly to the given context in the editor
64
-     */
65
-    public function clickToEditMessageTemplateByMessageType($message_type_slug, $context = '')
66
-    {
67
-        $this->actor()->click(MessagesPage::editMessageTemplateClassByMessageType($message_type_slug, $context));
68
-    }
69
-
70
-
71
-    /**
72
-     * Use this action to verify that the count for the given text in the specified field is as expected.  For example
73
-     * filling the condition of, "There should only be 1 instance of `[email protected]` in all the 'to' column.
74
-     *
75
-     * @param int    $expected_occurence_count
76
-     * @param string $text_to_check_for
77
-     * @param string $field
78
-     * @param string $message_type_label
79
-     * @param string $message_status
80
-     * @param string $messenger
81
-     * @param string $context
82
-     */
83
-    public function verifyMatchingCountofTextInMessageActivityListTableFor(
84
-        $expected_occurence_count,
85
-        $text_to_check_for,
86
-        $field,
87
-        $message_type_label,
88
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
89
-        $messenger = 'Email',
90
-        $context = 'Event Admin'
91
-    ) {
92
-        $elements = $this->actor()->grabMultiple(MessagesPage::messagesActivityListTableCellSelectorFor(
93
-            $field,
94
-            $message_type_label,
95
-            $message_status,
96
-            $messenger,
97
-            $context,
98
-            $text_to_check_for,
99
-            0
100
-        ));
101
-        $actual_count = count($elements);
102
-        $this->actor()->assertEquals(
103
-            $expected_occurence_count,
104
-            $actual_count,
105
-            sprintf(
106
-                'Expected %s of the %s text for the %s field but there were actually %s counted.',
107
-                $expected_occurence_count,
108
-                $text_to_check_for,
109
-                $field,
110
-                $actual_count
111
-            )
112
-        );
113
-    }
114
-
115
-
116
-    /**
117
-     * This will create a custom message template for the given messenger and message type from the context of the
118
-     * default (global) message template list table.
119
-     * Also takes care of verifying the template was created.
120
-     * @param string $message_type_label
121
-     * @param string $messenger_label
122
-     */
123
-    public function createCustomMessageTemplateFromDefaultFor($message_type_label, $messenger_label)
124
-    {
125
-        $this->amOnDefaultMessageTemplateListTablePage();
126
-        $this->actor()->click(
127
-            MessagesPage::createCustomButtonForMessageTypeAndMessenger(
128
-                $message_type_label,
129
-                $messenger_label
130
-            )
131
-        );
132
-        $this->actor()->seeInField('#title', 'New Custom Template');
133
-    }
134
-
135
-
136
-    /**
137
-     * This switches the context of the current messages template to the given reference.
138
-     * @param string $context_reference  This should be the visible label for the option.
139
-     */
140
-    public function switchContextTo($context_reference)
141
-    {
142
-        $this->actor()->selectOption(MessagesPage::MESSAGES_CONTEXT_SWITCHER_SELECTOR, $context_reference);
143
-        $this->actor()->click(MessagesPage::MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR);
144
-        $this->actor()->waitForText($context_reference, 10, 'h1');
145
-    }
146
-
147
-
148
-    /**
149
-     * This takes care of clicking the View Message icon for the given parameters.
150
-     * Assumes you are already viewing the messages activity list table.
151
-     * @param        $message_type_label
152
-     * @param        $message_status
153
-     * @param string $messenger
154
-     * @param string $context
155
-     * @param int    $number_in_set
156
-     */
157
-    public function viewMessageInMessagesListTableFor(
158
-        $message_type_label,
159
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
160
-        $messenger = 'Email',
161
-        $context = 'Event Admin',
162
-        $number_in_set = 1
163
-    ) {
164
-        $this->actor()->click(MessagesPage::messagesActivityListTableViewButtonSelectorFor(
165
-            $message_type_label,
166
-            $message_status,
167
-            $messenger,
168
-            $context,
169
-            $number_in_set
170
-        ));
171
-    }
172
-
173
-
174
-    /**
175
-     * Takes care of deleting a message matching the given parameters via the message activity list table.
176
-     * Assumes you are already viewing the messages activity list table.
177
-     * @param        $message_type_label
178
-     * @param        $message_status
179
-     * @param string $messenger
180
-     * @param string $context
181
-     * @param int    $number_in_set
182
-     */
183
-    public function deleteMessageInMessagesListTableFor(
184
-        $message_type_label,
185
-        $message_status = MessagesPage::MESSAGE_STATUS_SENT,
186
-        $messenger = 'Email',
187
-        $context = 'Event Admin',
188
-        $number_in_set = 1
189
-    ) {
190
-        $this->actor()->moveMouseOver(
191
-            MessagesPage::messagesActivityListTableCellSelectorFor(
192
-                'to',
193
-                $message_type_label,
194
-                $message_status,
195
-                $messenger,
196
-                $context,
197
-                '',
198
-                $number_in_set
199
-            )
200
-        );
201
-        $this->actor()->click(
202
-            MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
203
-                $message_type_label,
204
-                $message_status,
205
-                $messenger,
206
-                $context,
207
-                $number_in_set
208
-            )
209
-        );
210
-        $this->actor()->waitForText('successfully deleted');
211
-    }
212
-
213
-
214
-    /**
215
-     * Assuming you have already triggered the view modal for a single message from the context of the message activity
216
-     * list table, this will take care of validating the given text is in that window.
217
-     * @param string $text_to_view
218
-     */
219
-    public function seeTextInViewMessageModal($text_to_view, $should_not_see = false)
220
-    {
221
-        $this->actor()->waitForElementVisible('.ee-admin-dialog-container-inner-content');
222
-        $this->actor()->switchToIframe('message-view-window');
223
-        $should_not_see ? $this->actor()->dontSee($text_to_view) : $this->actor()->see($text_to_view);
224
-        $this->actor()->switchToIframe();
225
-    }
226
-
227
-
228
-    /**
229
-     * Assuming you have already triggered the view modal for a single message from the context of the message activity
230
-     * list table, this will take care of validating the given text is NOT that window.
231
-     * @param string $text_to_view
232
-     */
233
-    public function dontSeeTextInViewMessageModal($text_to_view)
234
-    {
235
-        $this->seeTextInViewMessageModal($text_to_view, true);
236
-    }
13
+	/**
14
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
15
+	 *                                  a string.
16
+	 */
17
+	public function amOnMessagesActivityListTablePage($additional_params = '')
18
+	{
19
+		$this->actor()->amOnAdminPage(MessagesPage::messageActivityListTableUrl($additional_params));
20
+	}
21
+
22
+	/**
23
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
24
+	 *                                  a string.
25
+	 */
26
+	public function amOnDefaultMessageTemplateListTablePage($additional_params = '')
27
+	{
28
+		$this->actor()->amOnAdminPage(MessagesPage::defaultMessageTemplateListTableUrl($additional_params));
29
+	}
30
+
31
+
32
+	/**
33
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
34
+	 *                                  a string.
35
+	 */
36
+	public function amOnCustomMessageTemplateListTablePage($additional_params = '')
37
+	{
38
+		$this->actor()->amOnAdminPage(MessagesPage::customMessageTemplateListTableUrl($additional_params));
39
+	}
40
+
41
+
42
+	/**
43
+	 * Directs to message settings page
44
+	 */
45
+	public function amOnMessageSettingsPage()
46
+	{
47
+		$this->actor()->amOnAdminPage(MessagesPage::messageSettingsUrl());
48
+	}
49
+
50
+
51
+	public function activateMessageTypeForMessenger($message_type_slug, $messenger_slug = 'email')
52
+	{
53
+		$this->actor()->dragAndDrop(
54
+			MessagesPage::draggableSettingsBoxSelectorForMessageTypeAndMessenger($message_type_slug, $messenger_slug),
55
+			MessagesPage::MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR
56
+		);
57
+	}
58
+
59
+
60
+	/**
61
+	 * Assumes you are already on the list table page that has the ui for editing the template.
62
+	 * @param string $message_type_slug
63
+	 * @param string $context [optional] if you want to click directly to the given context in the editor
64
+	 */
65
+	public function clickToEditMessageTemplateByMessageType($message_type_slug, $context = '')
66
+	{
67
+		$this->actor()->click(MessagesPage::editMessageTemplateClassByMessageType($message_type_slug, $context));
68
+	}
69
+
70
+
71
+	/**
72
+	 * Use this action to verify that the count for the given text in the specified field is as expected.  For example
73
+	 * filling the condition of, "There should only be 1 instance of `[email protected]` in all the 'to' column.
74
+	 *
75
+	 * @param int    $expected_occurence_count
76
+	 * @param string $text_to_check_for
77
+	 * @param string $field
78
+	 * @param string $message_type_label
79
+	 * @param string $message_status
80
+	 * @param string $messenger
81
+	 * @param string $context
82
+	 */
83
+	public function verifyMatchingCountofTextInMessageActivityListTableFor(
84
+		$expected_occurence_count,
85
+		$text_to_check_for,
86
+		$field,
87
+		$message_type_label,
88
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
89
+		$messenger = 'Email',
90
+		$context = 'Event Admin'
91
+	) {
92
+		$elements = $this->actor()->grabMultiple(MessagesPage::messagesActivityListTableCellSelectorFor(
93
+			$field,
94
+			$message_type_label,
95
+			$message_status,
96
+			$messenger,
97
+			$context,
98
+			$text_to_check_for,
99
+			0
100
+		));
101
+		$actual_count = count($elements);
102
+		$this->actor()->assertEquals(
103
+			$expected_occurence_count,
104
+			$actual_count,
105
+			sprintf(
106
+				'Expected %s of the %s text for the %s field but there were actually %s counted.',
107
+				$expected_occurence_count,
108
+				$text_to_check_for,
109
+				$field,
110
+				$actual_count
111
+			)
112
+		);
113
+	}
114
+
115
+
116
+	/**
117
+	 * This will create a custom message template for the given messenger and message type from the context of the
118
+	 * default (global) message template list table.
119
+	 * Also takes care of verifying the template was created.
120
+	 * @param string $message_type_label
121
+	 * @param string $messenger_label
122
+	 */
123
+	public function createCustomMessageTemplateFromDefaultFor($message_type_label, $messenger_label)
124
+	{
125
+		$this->amOnDefaultMessageTemplateListTablePage();
126
+		$this->actor()->click(
127
+			MessagesPage::createCustomButtonForMessageTypeAndMessenger(
128
+				$message_type_label,
129
+				$messenger_label
130
+			)
131
+		);
132
+		$this->actor()->seeInField('#title', 'New Custom Template');
133
+	}
134
+
135
+
136
+	/**
137
+	 * This switches the context of the current messages template to the given reference.
138
+	 * @param string $context_reference  This should be the visible label for the option.
139
+	 */
140
+	public function switchContextTo($context_reference)
141
+	{
142
+		$this->actor()->selectOption(MessagesPage::MESSAGES_CONTEXT_SWITCHER_SELECTOR, $context_reference);
143
+		$this->actor()->click(MessagesPage::MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR);
144
+		$this->actor()->waitForText($context_reference, 10, 'h1');
145
+	}
146
+
147
+
148
+	/**
149
+	 * This takes care of clicking the View Message icon for the given parameters.
150
+	 * Assumes you are already viewing the messages activity list table.
151
+	 * @param        $message_type_label
152
+	 * @param        $message_status
153
+	 * @param string $messenger
154
+	 * @param string $context
155
+	 * @param int    $number_in_set
156
+	 */
157
+	public function viewMessageInMessagesListTableFor(
158
+		$message_type_label,
159
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
160
+		$messenger = 'Email',
161
+		$context = 'Event Admin',
162
+		$number_in_set = 1
163
+	) {
164
+		$this->actor()->click(MessagesPage::messagesActivityListTableViewButtonSelectorFor(
165
+			$message_type_label,
166
+			$message_status,
167
+			$messenger,
168
+			$context,
169
+			$number_in_set
170
+		));
171
+	}
172
+
173
+
174
+	/**
175
+	 * Takes care of deleting a message matching the given parameters via the message activity list table.
176
+	 * Assumes you are already viewing the messages activity list table.
177
+	 * @param        $message_type_label
178
+	 * @param        $message_status
179
+	 * @param string $messenger
180
+	 * @param string $context
181
+	 * @param int    $number_in_set
182
+	 */
183
+	public function deleteMessageInMessagesListTableFor(
184
+		$message_type_label,
185
+		$message_status = MessagesPage::MESSAGE_STATUS_SENT,
186
+		$messenger = 'Email',
187
+		$context = 'Event Admin',
188
+		$number_in_set = 1
189
+	) {
190
+		$this->actor()->moveMouseOver(
191
+			MessagesPage::messagesActivityListTableCellSelectorFor(
192
+				'to',
193
+				$message_type_label,
194
+				$message_status,
195
+				$messenger,
196
+				$context,
197
+				'',
198
+				$number_in_set
199
+			)
200
+		);
201
+		$this->actor()->click(
202
+			MessagesPage::messagesActivityListTableDeleteActionSelectorFor(
203
+				$message_type_label,
204
+				$message_status,
205
+				$messenger,
206
+				$context,
207
+				$number_in_set
208
+			)
209
+		);
210
+		$this->actor()->waitForText('successfully deleted');
211
+	}
212
+
213
+
214
+	/**
215
+	 * Assuming you have already triggered the view modal for a single message from the context of the message activity
216
+	 * list table, this will take care of validating the given text is in that window.
217
+	 * @param string $text_to_view
218
+	 */
219
+	public function seeTextInViewMessageModal($text_to_view, $should_not_see = false)
220
+	{
221
+		$this->actor()->waitForElementVisible('.ee-admin-dialog-container-inner-content');
222
+		$this->actor()->switchToIframe('message-view-window');
223
+		$should_not_see ? $this->actor()->dontSee($text_to_view) : $this->actor()->see($text_to_view);
224
+		$this->actor()->switchToIframe();
225
+	}
226
+
227
+
228
+	/**
229
+	 * Assuming you have already triggered the view modal for a single message from the context of the message activity
230
+	 * list table, this will take care of validating the given text is NOT that window.
231
+	 * @param string $text_to_view
232
+	 */
233
+	public function dontSeeTextInViewMessageModal($text_to_view)
234
+	{
235
+		$this->seeTextInViewMessageModal($text_to_view, true);
236
+	}
237 237
 }
Please login to merge, or discard this patch.
acceptance_tests/Helpers/EventsAdmin.php 1 patch
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -14,84 +14,84 @@
 block discarded – undo
14 14
 trait EventsAdmin
15 15
 {
16 16
 
17
-    /**
18
-     * @param string $additional_params
19
-     */
20
-    public function amOnDefaultEventsListTablePage($additional_params = '')
21
-    {
22
-        $this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
-    }
17
+	/**
18
+	 * @param string $additional_params
19
+	 */
20
+	public function amOnDefaultEventsListTablePage($additional_params = '')
21
+	{
22
+		$this->actor()->amOnAdminPage(EventsPage::defaultEventsListTableUrl($additional_params));
23
+	}
24 24
 
25 25
 
26
-    /**
27
-     * Triggers the publishing of the Event.
28
-     */
29
-    public function publishEvent()
30
-    {
31
-        $this->actor()->click(EventsPage::EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR);
32
-    }
26
+	/**
27
+	 * Triggers the publishing of the Event.
28
+	 */
29
+	public function publishEvent()
30
+	{
31
+		$this->actor()->click(EventsPage::EVENT_EDITOR_PUBLISH_BUTTON_SELECTOR);
32
+	}
33 33
 
34 34
 
35
-    /**
36
-     * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
37
-     * First this will search using the given title and then attempt to edit from the results of the search.
38
-     *
39
-     * Assumes actor is already logged in.
40
-     * @param $event_title
41
-     */
42
-    public function amEditingTheEventWithTitle($event_title)
43
-    {
44
-        $this->amOnDefaultEventsListTablePage();
45
-        $this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
46
-        $this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
47
-        $this->actor()->waitForText('Displaying search results for');
48
-        $this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
49
-    }
35
+	/**
36
+	 * Navigates the actor to the event list table page and will attempt to edit the event for the given title.
37
+	 * First this will search using the given title and then attempt to edit from the results of the search.
38
+	 *
39
+	 * Assumes actor is already logged in.
40
+	 * @param $event_title
41
+	 */
42
+	public function amEditingTheEventWithTitle($event_title)
43
+	{
44
+		$this->amOnDefaultEventsListTablePage();
45
+		$this->actor()->fillField(EventsPage::EVENT_LIST_TABLE_SEARCH_INPUT_SELECTOR, $event_title);
46
+		$this->actor()->click(CoreAdmin::LIST_TABLE_SEARCH_SUBMIT_SELECTOR);
47
+		$this->actor()->waitForText('Displaying search results for');
48
+		$this->actor()->click(EventsPage::eventListTableEventTitleEditLink($event_title));
49
+	}
50 50
 
51 51
 
52
-    /**
53
-     * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
54
-     * link for the event in the event list table.
55
-     * Assumes the actor is already logged in and on the Event list table page.
56
-     *
57
-     * @param string $event_title
58
-     */
59
-    public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
60
-    {
61
-        $this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
62
-        $this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
63
-    }
52
+	/**
53
+	 * Navigates the user to the single event page (frontend view) for the given event title via clicking the "View"
54
+	 * link for the event in the event list table.
55
+	 * Assumes the actor is already logged in and on the Event list table page.
56
+	 *
57
+	 * @param string $event_title
58
+	 */
59
+	public function amOnEventPageAfterClickingViewLinkInListTableForEvent($event_title)
60
+	{
61
+		$this->actor()->moveMouseOver(EventsPage::eventListTableEventTitleEditLinkSelectorForTitle($event_title));
62
+		$this->actor()->click(EventsPage::eventListTableEventTitleViewLinkSelectorForTitle($event_title));
63
+	}
64 64
 
65 65
 
66
-    /**
67
-     * Use to change the default registration status for the event.
68
-     * Assumes the view is already on the event editor.
69
-     * @param $registration_status
70
-     */
71
-    public function changeDefaultRegistrationStatusTo($registration_status)
72
-    {
73
-        $this->actor()->selectOption(
74
-            EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
75
-            $registration_status
76
-        );
77
-    }
66
+	/**
67
+	 * Use to change the default registration status for the event.
68
+	 * Assumes the view is already on the event editor.
69
+	 * @param $registration_status
70
+	 */
71
+	public function changeDefaultRegistrationStatusTo($registration_status)
72
+	{
73
+		$this->actor()->selectOption(
74
+			EventsPage::EVENT_EDITOR_DEFAULT_REGISTRATION_STATUS_FIELD_SELECTOR,
75
+			$registration_status
76
+		);
77
+	}
78 78
 
79 79
 
80
-    /**
81
-     * Use this from the context of the event editor to select the given custom template for a given message type and
82
-     * messenger.
83
-     *
84
-     * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
85
-     * @param string $messenger_slug      The slug for the messenger (eg 'email')
86
-     * @param string $custom_template_label The visible label in the select input for the custom template you want
87
-     *                                      selected.
88
-     */
89
-    public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
90
-    {
91
-        $this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
92
-        $this->actor()->selectOption(
93
-            EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
94
-            $custom_template_label
95
-        );
96
-    }
80
+	/**
81
+	 * Use this from the context of the event editor to select the given custom template for a given message type and
82
+	 * messenger.
83
+	 *
84
+	 * @param string $message_type_label  The visible label for the message type (eg Registration Approved)
85
+	 * @param string $messenger_slug      The slug for the messenger (eg 'email')
86
+	 * @param string $custom_template_label The visible label in the select input for the custom template you want
87
+	 *                                      selected.
88
+	 */
89
+	public function selectCustomTemplateFor($message_type_label, $messenger_slug, $custom_template_label)
90
+	{
91
+		$this->actor()->click(EventsPage::eventEditorNotificationsMetaBoxMessengerTabSelector($messenger_slug));
92
+		$this->actor()->selectOption(
93
+			EventsPage::eventEditorNotificationsMetaBoxSelectSelectorForMessageType($message_type_label),
94
+			$custom_template_label
95
+		);
96
+	}
97 97
 }
98 98
\ No newline at end of file
Please login to merge, or discard this patch.
acceptance_tests/Page/CoreAdmin.php 2 patches
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -13,84 +13,84 @@
 block discarded – undo
13 13
 class CoreAdmin
14 14
 {
15 15
 
16
-    /**
17
-     * @var string
18
-     */
19
-    const URL_PREFIX = 'admin.php?page=';
20
-
21
-
22
-    /**
23
-     * This is the selector for the next page button on list tables.
24
-     * @var string
25
-     */
26
-    const ADMIN_LIST_TABLE_NEXT_PAGE_CLASS = '.next-page';
27
-
28
-
29
-    /**
30
-     * The selector for the search input submit button on list table pages
31
-     * @var string
32
-     */
33
-    const LIST_TABLE_SEARCH_SUBMIT_SELECTOR = '#search-submit';
34
-
35
-
36
-    /**
37
-     * Selector for the screen options dropdown.
38
-     * @var string
39
-     */
40
-    const WP_SCREEN_SETTINGS_LINK_SELECTOR = '#show-settings-link';
41
-
42
-
43
-    /**
44
-     * Selector for the per page field setting selector (found within screen options dropdown)
45
-     * @var string
46
-     */
47
-    const WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR = '.screen-per-page';
48
-
49
-
50
-    /**
51
-     * Selector for apply screen options settings.
52
-     * @var string
53
-     */
54
-    const WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR = '#screen-options-apply';
55
-
56
-
57
-    /**
58
-     * Get the EE admin url for the given properties.
59
-     * Note, this is JUST the endpoint for the admin route.  It is expected that the actor/test would be calling this
60
-     * with `amOnAdminPage` action.
61
-     *
62
-     * @param string $page
63
-     * @param string $action
64
-     * @param string $additional_params
65
-     * @return string
66
-     */
67
-    public static function adminUrl($page = 'espresso_events', $action = 'default', $additional_params = '')
68
-    {
69
-        $url = self::URL_PREFIX . $page;
70
-        $url .= $action ? '&action=' . $action : '';
71
-        $url .= $additional_params ? '&' . ltrim('&', ltrim('?', $additional_params)) : '';
72
-        return $url;
73
-    }
74
-
75
-
76
-    /**
77
-     * Returns the selector for the text tab switcher for a wp-editor instance.
78
-     * @param $field_reference
79
-     * @return string
80
-     */
81
-    public static function wpEditorTextTabSelector($field_reference)
82
-    {
83
-        return '#content-' . $field_reference . '-content-html';
84
-    }
85
-
86
-
87
-    /**
88
-     * Returns the selector for the textarea exposed when clicing the text tab switcher for a wp-editor instance.
89
-     * @param $field_reference
90
-     * @return string
91
-     */
92
-    public static function wpEditorTextAreaSelector($field_reference)
93
-    {
94
-        return '#content-' . $field_reference . '-content';
95
-    }
16
+	/**
17
+	 * @var string
18
+	 */
19
+	const URL_PREFIX = 'admin.php?page=';
20
+
21
+
22
+	/**
23
+	 * This is the selector for the next page button on list tables.
24
+	 * @var string
25
+	 */
26
+	const ADMIN_LIST_TABLE_NEXT_PAGE_CLASS = '.next-page';
27
+
28
+
29
+	/**
30
+	 * The selector for the search input submit button on list table pages
31
+	 * @var string
32
+	 */
33
+	const LIST_TABLE_SEARCH_SUBMIT_SELECTOR = '#search-submit';
34
+
35
+
36
+	/**
37
+	 * Selector for the screen options dropdown.
38
+	 * @var string
39
+	 */
40
+	const WP_SCREEN_SETTINGS_LINK_SELECTOR = '#show-settings-link';
41
+
42
+
43
+	/**
44
+	 * Selector for the per page field setting selector (found within screen options dropdown)
45
+	 * @var string
46
+	 */
47
+	const WP_SCREEN_SETTINGS_PER_PAGE_FIELD_SELECTOR = '.screen-per-page';
48
+
49
+
50
+	/**
51
+	 * Selector for apply screen options settings.
52
+	 * @var string
53
+	 */
54
+	const WP_SCREEN_OPTIONS_APPLY_SETTINGS_BUTTON_SELECTOR = '#screen-options-apply';
55
+
56
+
57
+	/**
58
+	 * Get the EE admin url for the given properties.
59
+	 * Note, this is JUST the endpoint for the admin route.  It is expected that the actor/test would be calling this
60
+	 * with `amOnAdminPage` action.
61
+	 *
62
+	 * @param string $page
63
+	 * @param string $action
64
+	 * @param string $additional_params
65
+	 * @return string
66
+	 */
67
+	public static function adminUrl($page = 'espresso_events', $action = 'default', $additional_params = '')
68
+	{
69
+		$url = self::URL_PREFIX . $page;
70
+		$url .= $action ? '&action=' . $action : '';
71
+		$url .= $additional_params ? '&' . ltrim('&', ltrim('?', $additional_params)) : '';
72
+		return $url;
73
+	}
74
+
75
+
76
+	/**
77
+	 * Returns the selector for the text tab switcher for a wp-editor instance.
78
+	 * @param $field_reference
79
+	 * @return string
80
+	 */
81
+	public static function wpEditorTextTabSelector($field_reference)
82
+	{
83
+		return '#content-' . $field_reference . '-content-html';
84
+	}
85
+
86
+
87
+	/**
88
+	 * Returns the selector for the textarea exposed when clicing the text tab switcher for a wp-editor instance.
89
+	 * @param $field_reference
90
+	 * @return string
91
+	 */
92
+	public static function wpEditorTextAreaSelector($field_reference)
93
+	{
94
+		return '#content-' . $field_reference . '-content';
95
+	}
96 96
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -66,9 +66,9 @@  discard block
 block discarded – undo
66 66
      */
67 67
     public static function adminUrl($page = 'espresso_events', $action = 'default', $additional_params = '')
68 68
     {
69
-        $url = self::URL_PREFIX . $page;
70
-        $url .= $action ? '&action=' . $action : '';
71
-        $url .= $additional_params ? '&' . ltrim('&', ltrim('?', $additional_params)) : '';
69
+        $url = self::URL_PREFIX.$page;
70
+        $url .= $action ? '&action='.$action : '';
71
+        $url .= $additional_params ? '&'.ltrim('&', ltrim('?', $additional_params)) : '';
72 72
         return $url;
73 73
     }
74 74
 
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
      */
81 81
     public static function wpEditorTextTabSelector($field_reference)
82 82
     {
83
-        return '#content-' . $field_reference . '-content-html';
83
+        return '#content-'.$field_reference.'-content-html';
84 84
     }
85 85
 
86 86
 
@@ -91,6 +91,6 @@  discard block
 block discarded – undo
91 91
      */
92 92
     public static function wpEditorTextAreaSelector($field_reference)
93 93
     {
94
-        return '#content-' . $field_reference . '-content';
94
+        return '#content-'.$field_reference.'-content';
95 95
     }
96 96
 }
Please login to merge, or discard this patch.
acceptance_tests/Page/MessagesAdmin.php 1 patch
Indentation   +243 added lines, -243 removed lines patch added patch discarded remove patch
@@ -12,255 +12,255 @@
 block discarded – undo
12 12
 class MessagesAdmin extends CoreAdmin
13 13
 {
14 14
 
15
-    /**
16
-     * Context slug for the admin messages context.
17
-     * @var string
18
-     */
19
-    const ADMIN_CONTEXT_SLUG = 'admin';
15
+	/**
16
+	 * Context slug for the admin messages context.
17
+	 * @var string
18
+	 */
19
+	const ADMIN_CONTEXT_SLUG = 'admin';
20 20
 
21
-    /**
22
-     * Context slug for the primary attendee messages context
23
-     * @var string
24
-     */
25
-    const PRIMARY_ATTENDEE_CONTEXT_SLUG = 'primary_attendee';
21
+	/**
22
+	 * Context slug for the primary attendee messages context
23
+	 * @var string
24
+	 */
25
+	const PRIMARY_ATTENDEE_CONTEXT_SLUG = 'primary_attendee';
26 26
 
27 27
 
28
-    /**
29
-     * Status reference for the EEM_Message::status_sent status.
30
-     * @var string
31
-     */
32
-    const MESSAGE_STATUS_SENT = 'MSN';
28
+	/**
29
+	 * Status reference for the EEM_Message::status_sent status.
30
+	 * @var string
31
+	 */
32
+	const MESSAGE_STATUS_SENT = 'MSN';
33 33
 
34 34
 
35
-    /**
36
-     * Message type slug for the Payment Failed message type
37
-     */
38
-    const PAYMENT_FAILED_MESSAGE_TYPE_SLUG = 'payment_failed';
35
+	/**
36
+	 * Message type slug for the Payment Failed message type
37
+	 */
38
+	const PAYMENT_FAILED_MESSAGE_TYPE_SLUG = 'payment_failed';
39 39
 
40 40
 
41
-    /**
42
-     * Selector for the Global Messages "Send on same request" field in the Messages Settings tab.
43
-     * @var string
44
-     */
45
-    const GLOBAL_MESSAGES_SETTINGS_ON_REQUEST_SELECTION_SELECTOR =
46
-        '#global_messages_settings-do-messages-on-same-request';
47
-
41
+	/**
42
+	 * Selector for the Global Messages "Send on same request" field in the Messages Settings tab.
43
+	 * @var string
44
+	 */
45
+	const GLOBAL_MESSAGES_SETTINGS_ON_REQUEST_SELECTION_SELECTOR =
46
+		'#global_messages_settings-do-messages-on-same-request';
47
+
48 48
 
49
-    /**
50
-     * Selector for the Global Messages Settings submit button in the Messages Settings tab.
51
-     * @var string
52
-     */
53
-    const GLOBAL_MESSAGES_SETTINGS_SUBMIT_SELECTOR = '#global_messages_settings-update-settings-submit';
54
-
55
-
56
-    /**
57
-     * This is the container where active message types for a messenger are found/dragged to.
58
-     * @var string
59
-     */
60
-    const MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR = '#active-message-types';
61
-
62
-
63
-    /**
64
-     * Locator for the context switcher selector on the Message Template Editor page.
65
-     * @var string
66
-     */
67
-    const MESSAGES_CONTEXT_SWITCHER_SELECTOR = "//form[@id='ee-msg-context-switcher-frm']/select";
68
-
69
-
70
-    /**
71
-     * Locator for the context switcher submit button in the Message Template Editor page.
72
-     * @var string
73
-     */
74
-    const MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR = "#submit-msg-context-switcher-sbmt";
75
-
76
-
77
-    /**
78
-     * Locator for the dialog container used for housing viewed messages in the message activity list table.
79
-     * @var string
80
-     */
81
-    const MESSAGES_LIST_TABLE_VIEW_MESSAGE_DIALOG_CONTAINER_SELECTOR = '.ee-admin-dialog-container-inner-content';
82
-
83
-
84
-
85
-    /**
86
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
87
-     *                                  a string.
88
-     * @return string
89
-     */
90
-    public static function messageActivityListTableUrl($additional_params = '')
91
-    {
92
-        return self::adminUrl('espresso_messages', 'default', $additional_params);
93
-    }
94
-
95
-
96
-    /**
97
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
98
-     *                                  a string.
99
-     * @return string
100
-     */
101
-    public static function defaultMessageTemplateListTableUrl($additional_params = '')
102
-    {
103
-        return self::adminUrl('espresso_messages', 'global_mtps', $additional_params);
104
-    }
105
-
106
-
107
-    /**
108
-     * @param string $additional_params Any additional request parameters for the generated url should be included as
109
-     *                                  a string.
110
-     * @return string
111
-     */
112
-    public static function customMessageTemplateListTableUrl($additional_params = '')
113
-    {
114
-        return self::adminUrl('espresso_messages', 'custom_mtps', $additional_params);
115
-    }
116
-
117
-
118
-    /**
119
-     * @return string
120
-     */
121
-    public static function messageSettingsUrl()
122
-    {
123
-        return self::adminUrl('espresso_messages', 'settings');
124
-    }
125
-
126
-
127
-
128
-    public static function draggableSettingsBoxSelectorForMessageTypeAndMessenger(
129
-        $message_type_slug,
130
-        $messenger_slug = 'email'
131
-    ) {
132
-        return "#$message_type_slug-messagetype-$messenger_slug";
133
-    }
134
-
135
-
136
-    /**
137
-     * @param string $message_type_slug
138
-     * @param string $context
139
-     * @return string
140
-     */
141
-    public static function editMessageTemplateClassByMessageType($message_type_slug, $context = '')
142
-    {
143
-        return $context
144
-            ? '.' . $message_type_slug . '-' . $context . '-edit-link'
145
-            : '.' . $message_type_slug . '-edit-link';
146
-    }
147
-
148
-
149
-    /**
150
-     * Selector for (a) specific table cell(s) in the Messages Activity list table for the given parameters.
151
-     *
152
-     * @param        $field
153
-     * @param        $message_type_label
154
-     * @param string $message_status
155
-     * @param string $messenger
156
-     * @param string $context
157
-     * @param string $table_cell_content_for_field
158
-     * @param int    $number_in_set   It's possible that the given parameters could match multiple items in the view.
159
-     *                                This allows you to indicate which item from the set to match.  If this is set to 0
160
-     *                                then all matches for the locator will be returned.
161
-     * @return string
162
-     */
163
-    public static function messagesActivityListTableCellSelectorFor(
164
-        $field,
165
-        $message_type_label,
166
-        $message_status = self::MESSAGE_STATUS_SENT,
167
-        $messenger = 'Email',
168
-        $context = 'Event Admin',
169
-        $table_cell_content_for_field = '',
170
-        $number_in_set = 1
171
-    ) {
172
-        $selector = $number_in_set > 0 ? '(' : '';
173
-        $selector .= "//tr[contains(@class, 'msg-status-$message_status')]"
174
-                     . "//td[contains(@class, 'message_type') and text()='$message_type_label']";
175
-        if ($messenger) {
176
-            $selector .= "/ancestor::tr/td[contains(@class, 'messenger') and text()='$messenger']";
177
-        }
178
-        $selector .= "/ancestor::tr/td[contains(@class, 'column-context') and text()='$context']";
179
-        $selector .= $table_cell_content_for_field
180
-            ? "/ancestor::tr/td[contains(@class, 'column-$field') and text()='$table_cell_content_for_field']"
181
-            : "/ancestor::tr/td[contains(@class, 'column-$field')]";
182
-        $selector .= $number_in_set > 0 ? ")[$number_in_set]" : '';
183
-        return $selector;
184
-    }
185
-
186
-
187
-    /**
188
-     * Selector for the Create Custom button found in the message template list table.
189
-     * @param string $message_type_label
190
-     * @param string $messenger_label
191
-     * @return string
192
-     */
193
-    public static function createCustomButtonForMessageTypeAndMessenger($message_type_label, $messenger_label)
194
-    {
195
-        $selector = "//tr/td[contains(@class, 'message_type') and text()='$message_type_label']"
196
-                    . "//ancestor::tr/td[contains(@class, 'messenger') and contains(., '$messenger_label')]"
197
-                    . "//ancestor::tr/td/a[@class='button button-small']";
198
-        return $selector;
199
-    }
200
-
201
-
202
-    /**
203
-     * Note, this could potentially match multiple buttons in the view so the selector is intentionally restricted to
204
-     * the FIRST match (which will be the latest message sent if the table is default sorted).
205
-     *
206
-     * @param string $message_type_label    The visible message type label for the row you want to match
207
-     * @param string $message_status        The status of the message for the row you want to match.
208
-     * @param string $messenger             The visible messenger label for the row you want to match.
209
-     * @param string $context               The visible context label for the row you want to match.
210
-     * @param int    $number_in_set         It's possible that the given parameters could match multiple items in the
211
-     *                                      view. This allows you to indicate which item from the set to match.
212
-     * @return string
213
-     */
214
-    public static function messagesActivityListTableViewButtonSelectorFor(
215
-        $message_type_label,
216
-        $message_status = self::MESSAGE_STATUS_SENT,
217
-        $messenger = 'Email',
218
-        $context = 'Event Admin',
219
-        $number_in_set = 1
220
-    ) {
221
-        $selector = self::messagesActivityListTableCellSelectorFor(
222
-            'action',
223
-            $message_type_label,
224
-            $message_status,
225
-            $messenger,
226
-            $context,
227
-            '',
228
-            $number_in_set
229
-        );
230
-        $selector .= "/a/span[contains(@class, 'ee-message-action-link-view')"
231
-                     . " and not(contains(@class, 'ee-message-action-link-view_transaction'))]";
232
-        return $selector;
233
-    }
234
-
235
-
236
-
237
-    /**
238
-     * Locator for the delete action link for a message item in the message activity list table.
239
-     * Note: The link is not visible by default, so the column would need hovered over for the link to appear.
240
-     * @param        $message_type_label
241
-     * @param string $message_status
242
-     * @param string $messenger
243
-     * @param string $context
244
-     * @param int    $number_in_set
245
-     * @return string
246
-     */
247
-    public static function messagesActivityListTableDeleteActionSelectorFor(
248
-        $message_type_label,
249
-        $message_status = self::MESSAGE_STATUS_SENT,
250
-        $messenger = 'Email',
251
-        $context = 'Event Admin',
252
-        $number_in_set = 1
253
-    ) {
254
-        $selector = self::messagesActivityListTableCellSelectorFor(
255
-            'to',
256
-            $message_type_label,
257
-            $message_status,
258
-            $messenger,
259
-            $context,
260
-            '',
261
-            $number_in_set
262
-        );
263
-        $selector .= "/div/span[@class='delete']/a";
264
-        return $selector;
265
-    }
49
+	/**
50
+	 * Selector for the Global Messages Settings submit button in the Messages Settings tab.
51
+	 * @var string
52
+	 */
53
+	const GLOBAL_MESSAGES_SETTINGS_SUBMIT_SELECTOR = '#global_messages_settings-update-settings-submit';
54
+
55
+
56
+	/**
57
+	 * This is the container where active message types for a messenger are found/dragged to.
58
+	 * @var string
59
+	 */
60
+	const MESSAGES_SETTINGS_ACTIVE_MESSAGE_TYPES_CONTAINER_SELECTOR = '#active-message-types';
61
+
62
+
63
+	/**
64
+	 * Locator for the context switcher selector on the Message Template Editor page.
65
+	 * @var string
66
+	 */
67
+	const MESSAGES_CONTEXT_SWITCHER_SELECTOR = "//form[@id='ee-msg-context-switcher-frm']/select";
68
+
69
+
70
+	/**
71
+	 * Locator for the context switcher submit button in the Message Template Editor page.
72
+	 * @var string
73
+	 */
74
+	const MESSAGES_CONTEXT_SWITCHER_BUTTON_SELECTOR = "#submit-msg-context-switcher-sbmt";
75
+
76
+
77
+	/**
78
+	 * Locator for the dialog container used for housing viewed messages in the message activity list table.
79
+	 * @var string
80
+	 */
81
+	const MESSAGES_LIST_TABLE_VIEW_MESSAGE_DIALOG_CONTAINER_SELECTOR = '.ee-admin-dialog-container-inner-content';
82
+
83
+
84
+
85
+	/**
86
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
87
+	 *                                  a string.
88
+	 * @return string
89
+	 */
90
+	public static function messageActivityListTableUrl($additional_params = '')
91
+	{
92
+		return self::adminUrl('espresso_messages', 'default', $additional_params);
93
+	}
94
+
95
+
96
+	/**
97
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
98
+	 *                                  a string.
99
+	 * @return string
100
+	 */
101
+	public static function defaultMessageTemplateListTableUrl($additional_params = '')
102
+	{
103
+		return self::adminUrl('espresso_messages', 'global_mtps', $additional_params);
104
+	}
105
+
106
+
107
+	/**
108
+	 * @param string $additional_params Any additional request parameters for the generated url should be included as
109
+	 *                                  a string.
110
+	 * @return string
111
+	 */
112
+	public static function customMessageTemplateListTableUrl($additional_params = '')
113
+	{
114
+		return self::adminUrl('espresso_messages', 'custom_mtps', $additional_params);
115
+	}
116
+
117
+
118
+	/**
119
+	 * @return string
120
+	 */
121
+	public static function messageSettingsUrl()
122
+	{
123
+		return self::adminUrl('espresso_messages', 'settings');
124
+	}
125
+
126
+
127
+
128
+	public static function draggableSettingsBoxSelectorForMessageTypeAndMessenger(
129
+		$message_type_slug,
130
+		$messenger_slug = 'email'
131
+	) {
132
+		return "#$message_type_slug-messagetype-$messenger_slug";
133
+	}
134
+
135
+
136
+	/**
137
+	 * @param string $message_type_slug
138
+	 * @param string $context
139
+	 * @return string
140
+	 */
141
+	public static function editMessageTemplateClassByMessageType($message_type_slug, $context = '')
142
+	{
143
+		return $context
144
+			? '.' . $message_type_slug . '-' . $context . '-edit-link'
145
+			: '.' . $message_type_slug . '-edit-link';
146
+	}
147
+
148
+
149
+	/**
150
+	 * Selector for (a) specific table cell(s) in the Messages Activity list table for the given parameters.
151
+	 *
152
+	 * @param        $field
153
+	 * @param        $message_type_label
154
+	 * @param string $message_status
155
+	 * @param string $messenger
156
+	 * @param string $context
157
+	 * @param string $table_cell_content_for_field
158
+	 * @param int    $number_in_set   It's possible that the given parameters could match multiple items in the view.
159
+	 *                                This allows you to indicate which item from the set to match.  If this is set to 0
160
+	 *                                then all matches for the locator will be returned.
161
+	 * @return string
162
+	 */
163
+	public static function messagesActivityListTableCellSelectorFor(
164
+		$field,
165
+		$message_type_label,
166
+		$message_status = self::MESSAGE_STATUS_SENT,
167
+		$messenger = 'Email',
168
+		$context = 'Event Admin',
169
+		$table_cell_content_for_field = '',
170
+		$number_in_set = 1
171
+	) {
172
+		$selector = $number_in_set > 0 ? '(' : '';
173
+		$selector .= "//tr[contains(@class, 'msg-status-$message_status')]"
174
+					 . "//td[contains(@class, 'message_type') and text()='$message_type_label']";
175
+		if ($messenger) {
176
+			$selector .= "/ancestor::tr/td[contains(@class, 'messenger') and text()='$messenger']";
177
+		}
178
+		$selector .= "/ancestor::tr/td[contains(@class, 'column-context') and text()='$context']";
179
+		$selector .= $table_cell_content_for_field
180
+			? "/ancestor::tr/td[contains(@class, 'column-$field') and text()='$table_cell_content_for_field']"
181
+			: "/ancestor::tr/td[contains(@class, 'column-$field')]";
182
+		$selector .= $number_in_set > 0 ? ")[$number_in_set]" : '';
183
+		return $selector;
184
+	}
185
+
186
+
187
+	/**
188
+	 * Selector for the Create Custom button found in the message template list table.
189
+	 * @param string $message_type_label
190
+	 * @param string $messenger_label
191
+	 * @return string
192
+	 */
193
+	public static function createCustomButtonForMessageTypeAndMessenger($message_type_label, $messenger_label)
194
+	{
195
+		$selector = "//tr/td[contains(@class, 'message_type') and text()='$message_type_label']"
196
+					. "//ancestor::tr/td[contains(@class, 'messenger') and contains(., '$messenger_label')]"
197
+					. "//ancestor::tr/td/a[@class='button button-small']";
198
+		return $selector;
199
+	}
200
+
201
+
202
+	/**
203
+	 * Note, this could potentially match multiple buttons in the view so the selector is intentionally restricted to
204
+	 * the FIRST match (which will be the latest message sent if the table is default sorted).
205
+	 *
206
+	 * @param string $message_type_label    The visible message type label for the row you want to match
207
+	 * @param string $message_status        The status of the message for the row you want to match.
208
+	 * @param string $messenger             The visible messenger label for the row you want to match.
209
+	 * @param string $context               The visible context label for the row you want to match.
210
+	 * @param int    $number_in_set         It's possible that the given parameters could match multiple items in the
211
+	 *                                      view. This allows you to indicate which item from the set to match.
212
+	 * @return string
213
+	 */
214
+	public static function messagesActivityListTableViewButtonSelectorFor(
215
+		$message_type_label,
216
+		$message_status = self::MESSAGE_STATUS_SENT,
217
+		$messenger = 'Email',
218
+		$context = 'Event Admin',
219
+		$number_in_set = 1
220
+	) {
221
+		$selector = self::messagesActivityListTableCellSelectorFor(
222
+			'action',
223
+			$message_type_label,
224
+			$message_status,
225
+			$messenger,
226
+			$context,
227
+			'',
228
+			$number_in_set
229
+		);
230
+		$selector .= "/a/span[contains(@class, 'ee-message-action-link-view')"
231
+					 . " and not(contains(@class, 'ee-message-action-link-view_transaction'))]";
232
+		return $selector;
233
+	}
234
+
235
+
236
+
237
+	/**
238
+	 * Locator for the delete action link for a message item in the message activity list table.
239
+	 * Note: The link is not visible by default, so the column would need hovered over for the link to appear.
240
+	 * @param        $message_type_label
241
+	 * @param string $message_status
242
+	 * @param string $messenger
243
+	 * @param string $context
244
+	 * @param int    $number_in_set
245
+	 * @return string
246
+	 */
247
+	public static function messagesActivityListTableDeleteActionSelectorFor(
248
+		$message_type_label,
249
+		$message_status = self::MESSAGE_STATUS_SENT,
250
+		$messenger = 'Email',
251
+		$context = 'Event Admin',
252
+		$number_in_set = 1
253
+	) {
254
+		$selector = self::messagesActivityListTableCellSelectorFor(
255
+			'to',
256
+			$message_type_label,
257
+			$message_status,
258
+			$messenger,
259
+			$context,
260
+			'',
261
+			$number_in_set
262
+		);
263
+		$selector .= "/div/span[@class='delete']/a";
264
+		return $selector;
265
+	}
266 266
 }
267 267
\ No newline at end of file
Please login to merge, or discard this patch.
core/libraries/messages/EE_Messages_Generator.lib.php 3 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
      * there's a single shared message template group among all the events.  Otherwise it returns null.
444 444
      *
445 445
      * @param array $event_ids
446
-     * @return EE_Message_Template_Group|null
446
+     * @return null|EE_Base_Class
447 447
      * @throws EE_Error
448 448
      */
449 449
     protected function _get_shared_message_template_for_events(array $event_ids)
@@ -476,7 +476,7 @@  discard block
 block discarded – undo
476 476
     /**
477 477
      * Retrieves the global message template group for the current messenger and message type.
478 478
      *
479
-     * @return EE_Message_Template_Group|null
479
+     * @return null|EE_Base_Class
480 480
      * @throws EE_Error
481 481
      */
482 482
     protected function _get_global_message_template_group_for_current_messenger_and_message_type()
@@ -617,7 +617,7 @@  discard block
 block discarded – undo
617 617
      * @param EE_Messages_Addressee     $recipient
618 618
      * @param array                     $templates formatted array of templates used for parsing data.
619 619
      * @param EE_Message_Template_Group $message_template_group
620
-     * @return bool|EE_Message
620
+     * @return EE_Message
621 621
      * @throws EE_Error
622 622
      */
623 623
     protected function _setup_message_object(
Please login to merge, or discard this patch.
Indentation   +931 added lines, -931 removed lines patch added patch discarded remove patch
@@ -13,935 +13,935 @@
 block discarded – undo
13 13
 {
14 14
 
15 15
 
16
-    /**
17
-     * @type EE_Messages_Data_Handler_Collection
18
-     */
19
-    protected $_data_handler_collection;
20
-
21
-    /**
22
-     * @type  EE_Message_Template_Group_Collection
23
-     */
24
-    protected $_template_collection;
25
-
26
-    /**
27
-     * This will hold the data handler for the current EE_Message being generated.
28
-     *
29
-     * @type EE_Messages_incoming_data
30
-     */
31
-    protected $_current_data_handler;
32
-
33
-    /**
34
-     * This holds the EE_Messages_Queue that contains the messages to generate.
35
-     *
36
-     * @type EE_Messages_Queue
37
-     */
38
-    protected $_generation_queue;
39
-
40
-    /**
41
-     * This holds the EE_Messages_Queue that will store the generated EE_Message objects.
42
-     *
43
-     * @type EE_Messages_Queue
44
-     */
45
-    protected $_ready_queue;
46
-
47
-    /**
48
-     * This is a container for any error messages that get created through the generation
49
-     * process.
50
-     *
51
-     * @type array
52
-     */
53
-    protected $_error_msg = array();
54
-
55
-    /**
56
-     * Flag used to set when the current EE_Message in the generation queue has been verified.
57
-     *
58
-     * @type bool
59
-     */
60
-    protected $_verified = false;
61
-
62
-    /**
63
-     * This will hold the current messenger object corresponding with the current EE_Message in the generation queue.
64
-     *
65
-     * @type EE_messenger
66
-     */
67
-    protected $_current_messenger;
68
-
69
-    /**
70
-     * This will hold the current message type object corresponding with the current EE_Message in the generation queue.
71
-     *
72
-     * @type EE_message_type
73
-     */
74
-    protected $_current_message_type;
75
-
76
-    /**
77
-     * @type EEH_Parse_Shortcodes
78
-     */
79
-    protected $_shortcode_parser;
80
-
81
-
82
-    /**
83
-     * @param EE_Messages_Queue                     $generation_queue
84
-     * @param \EE_Messages_Queue                    $ready_queue
85
-     * @param \EE_Messages_Data_Handler_Collection  $data_handler_collection
86
-     * @param \EE_Message_Template_Group_Collection $template_collection
87
-     * @param \EEH_Parse_Shortcodes                 $shortcode_parser
88
-     */
89
-    public function __construct(
90
-        EE_Messages_Queue $generation_queue,
91
-        EE_Messages_Queue $ready_queue,
92
-        EE_Messages_Data_Handler_Collection $data_handler_collection,
93
-        EE_Message_Template_Group_Collection $template_collection,
94
-        EEH_Parse_Shortcodes $shortcode_parser
95
-    ) {
96
-        $this->_generation_queue        = $generation_queue;
97
-        $this->_ready_queue             = $ready_queue;
98
-        $this->_data_handler_collection = $data_handler_collection;
99
-        $this->_template_collection     = $template_collection;
100
-        $this->_shortcode_parser        = $shortcode_parser;
101
-    }
102
-
103
-
104
-    /**
105
-     * @return EE_Messages_Queue
106
-     */
107
-    public function generation_queue()
108
-    {
109
-        return $this->_generation_queue;
110
-    }
111
-
112
-
113
-    /**
114
-     *  This iterates through the provided queue and generates the EE_Message objects.
115
-     *  When iterating through the queue, the queued item that served as the base for generating other EE_Message
116
-     *  objects gets removed and the new EE_Message objects get added to a NEW queue.  The NEW queue is then returned
117
-     *  for the caller to decide what to do with it.
118
-     *
119
-     * @param   bool $save Whether to save the EE_Message objects in the new queue or just return.
120
-     * @return EE_Messages_Queue  The new queue for holding generated EE_Message objects.
121
-     */
122
-    public function generate($save = true)
123
-    {
124
-        //iterate through the messages in the queue, generate, and add to new queue.
125
-        $this->_generation_queue->get_message_repository()->rewind();
126
-        while ($this->_generation_queue->get_message_repository()->valid()) {
127
-            //reset "current" properties
128
-            $this->_reset_current_properties();
129
-
130
-            /** @type EE_Message $msg */
131
-            $msg = $this->_generation_queue->get_message_repository()->current();
132
-
133
-            /**
134
-             * need to get the next object and capture it for setting manually after deletes.  The reason is that when
135
-             * an object is removed from the repo then valid for the next object will fail.
136
-             */
137
-            $this->_generation_queue->get_message_repository()->next();
138
-            $next_msg = $this->_generation_queue->get_message_repository()->current();
139
-            //restore pointer to current item
140
-            $this->_generation_queue->get_message_repository()->set_current($msg);
141
-
142
-            //skip and delete if the current $msg is NOT incomplete (queued for generation)
143
-            if ($msg->STS_ID() !== EEM_Message::status_incomplete) {
144
-                //we keep this item in the db just remove from the repo.
145
-                $this->_generation_queue->get_message_repository()->remove($msg);
146
-                //next item
147
-                $this->_generation_queue->get_message_repository()->set_current($next_msg);
148
-                continue;
149
-            }
150
-
151
-            if ($this->_verify()) {
152
-                //let's get generating!
153
-                $this->_generate();
154
-            }
155
-
156
-            //don't persist debug_only messages if the messages system is not in debug mode.
157
-            if ($msg->STS_ID() === EEM_Message::status_debug_only
158
-                && ! EEM_Message::debug()
159
-            ) {
160
-                do_action(
161
-                    'AHEE__EE_Messages_Generator__generate__before_debug_delete',
162
-                    $msg,
163
-                    $this->_error_msg,
164
-                    $this->_current_messenger,
165
-                    $this->_current_message_type,
166
-                    $this->_current_data_handler
167
-                );
168
-                $this->_generation_queue->get_message_repository()->delete();
169
-                $this->_generation_queue->get_message_repository()->set_current($next_msg);
170
-                continue;
171
-            }
172
-
173
-            //if there are error messages then let's set the status and the error message.
174
-            if ($this->_error_msg) {
175
-                //if the status is already debug only, then let's leave it at that.
176
-                if ($msg->STS_ID() !== EEM_Message::status_debug_only) {
177
-                    $msg->set_STS_ID(EEM_Message::status_failed);
178
-                }
179
-                do_action(
180
-                    'AHEE__EE_Messages_Generator__generate__processing_failed_message',
181
-                    $msg,
182
-                    $this->_error_msg,
183
-                    $this->_current_messenger,
184
-                    $this->_current_message_type,
185
-                    $this->_current_data_handler
186
-                );
187
-                $msg->set_error_message(
188
-                    esc_html__('Message failed to generate for the following reasons: ', 'event_espresso')
189
-                    . "\n"
190
-                    . implode("\n", $this->_error_msg)
191
-                );
192
-                $msg->set_modified(time());
193
-            } else {
194
-                do_action(
195
-                    'AHEE__EE_Messages_Generator__generate__before_successful_generated_message_delete',
196
-                    $msg,
197
-                    $this->_error_msg,
198
-                    $this->_current_messenger,
199
-                    $this->_current_message_type,
200
-                    $this->_current_data_handler
201
-                );
202
-                //remove from db
203
-                $this->_generation_queue->get_message_repository()->delete();
204
-            }
205
-            //next item
206
-            $this->_generation_queue->get_message_repository()->set_current($next_msg);
207
-        }
208
-
209
-        //generation queue is ALWAYS saved to record any errors in the generation process.
210
-        $this->_generation_queue->save();
211
-
212
-        /**
213
-         * save _ready_queue if flag set.
214
-         * Note: The EE_Message objects have values set via the EE_Base_Class::set_field_or_extra_meta() method.  This
215
-         * means if a field was added that is not a valid database column.  The EE_Message was already saved to the db
216
-         * so a EE_Extra_Meta entry could be created and attached to the EE_Message.  In those cases the save flag is
217
-         * irrelevant.
218
-         */
219
-        if ($save) {
220
-            $this->_ready_queue->save();
221
-        }
222
-
223
-        //final reset of properties
224
-        $this->_reset_current_properties();
225
-
226
-        return $this->_ready_queue;
227
-    }
228
-
229
-
230
-    /**
231
-     * This resets all the properties used for holding "current" values corresponding to the current EE_Message object
232
-     * in the generation queue.
233
-     */
234
-    protected function _reset_current_properties()
235
-    {
236
-        $this->_verified = false;
237
-        //make sure any _data value in the current message type is reset
238
-        if ($this->_current_message_type instanceof EE_message_type) {
239
-            $this->_current_message_type->reset_data();
240
-        }
241
-        $this->_current_messenger = $this->_current_message_type = $this->_current_data_handler = null;
242
-    }
243
-
244
-
245
-    /**
246
-     * This proceeds with the actual generation of a message.  By the time this is called, there should already be a
247
-     * $_current_data_handler set and all incoming information should be validated for the current EE_Message in the
248
-     * _generating_queue.
249
-     *
250
-     * @return bool Whether the message was successfully generated or not.
251
-     * @throws EE_Error
252
-     */
253
-    protected function _generate()
254
-    {
255
-        //double check verification has run and that everything is ready to work with (saves us having to validate
256
-        // everything again).
257
-        if (! $this->_verified) {
258
-            return false; //get out because we don't have a valid setup to work with.
259
-        }
260
-
261
-
262
-        try {
263
-            $addressees = $this->_current_message_type->get_addressees(
264
-                $this->_current_data_handler,
265
-                $this->_generation_queue->get_message_repository()->current()->context()
266
-            );
267
-        } catch (EE_Error $e) {
268
-            $this->_error_msg[] = $e->getMessage();
269
-            return false;
270
-        }
271
-
272
-
273
-        //if no addressees then get out because there is nothing to generation (possible bad data).
274
-        if (! $this->_valid_addressees($addressees)) {
275
-            do_action(
276
-                'AHEE__EE_Messages_Generator___generate__invalid_addressees',
277
-                $this->_generation_queue->get_message_repository()->current(),
278
-                $addressees,
279
-                $this->_current_messenger,
280
-                $this->_current_message_type,
281
-                $this->_current_data_handler
282
-            );
283
-            $this->_generation_queue->get_message_repository()->current()->set_STS_ID(
284
-                EEM_Message::status_debug_only
285
-            );
286
-            $this->_error_msg[] = esc_html__(
287
-                'This is not a critical error but an informational notice. Unable to generate messages EE_Messages_Addressee objects.  There were no attendees prepared by the data handler. Sometimes this is because messages only get generated for certain registration statuses. For example, the ticket notice message type only goes to approved registrations.',
288
-                'event_espresso'
289
-            );
290
-            return false;
291
-        }
292
-
293
-        $message_template_group = $this->_get_message_template_group();
294
-
295
-        //in the unlikely event there is no EE_Message_Template_Group available, get out!
296
-        if (! $message_template_group instanceof EE_Message_Template_Group) {
297
-            $this->_error_msg[] = esc_html__(
298
-                'Unable to get the Message Templates for the Message being generated.  No message template group accessible.',
299
-                'event_espresso'
300
-            );
301
-            return false;
302
-        }
303
-
304
-        //get formatted templates for using to parse and setup EE_Message objects.
305
-        $templates = $this->_get_templates($message_template_group);
306
-
307
-
308
-        //setup new EE_Message objects (and add to _ready_queue)
309
-        return $this->_assemble_messages($addressees, $templates, $message_template_group);
310
-    }
311
-
312
-
313
-    /**
314
-     * Retrieves the message template group being used for generating messages.
315
-     * Note: this also utilizes the EE_Message_Template_Group_Collection to avoid having to hit the db multiple times.
316
-     *
317
-     * @return EE_Message_Template_Group|null
318
-     * @throws EE_Error
319
-     */
320
-    protected function _get_message_template_group()
321
-    {
322
-        //first see if there is a specific message template group requested (current message in the queue has a specific
323
-        //GRP_ID
324
-        $message_template_group = $this->_specific_message_template_group_from_queue();
325
-        if ($message_template_group instanceof EE_Message_Template_Group) {
326
-            return $message_template_group;
327
-        }
328
-
329
-        //get event_ids from the datahandler so we can check to see if there's already a message template group for them
330
-        //in the collection.
331
-        $event_ids              = $this->_get_event_ids_from_current_data_handler();
332
-        $message_template_group = $this->_template_collection->get_by_key(
333
-            $this->_template_collection->getKey(
334
-                $this->_current_messenger->name,
335
-                $this->_current_message_type->name,
336
-                $event_ids
337
-            )
338
-        );
339
-
340
-        //if we have a message template group then no need to hit the database, just return it.
341
-        if ($message_template_group instanceof EE_Message_Template_Group) {
342
-            return $message_template_group;
343
-        }
344
-
345
-        //okay made it here, so let's get the global group first for this messenger and message type to ensure
346
-        //there is no override set.
347
-        $global_message_template_group = $this->_get_global_message_template_group_for_current_messenger_and_message_type();
348
-
349
-        if ($global_message_template_group instanceof EE_Message_Template_Group
350
-            && $global_message_template_group->get('MTP_is_override')
351
-        ) {
352
-            return $global_message_template_group;
353
-        }
354
-
355
-        //if we're still here, that means there was no message template group for the events in the collection and
356
-        //the global message template group for the messenger and message type is not set for override.  So next step is
357
-        //to see if there is a common shared custom message template group for this set of events.
358
-        $message_template_group = $this->_get_shared_message_template_for_events($event_ids);
359
-        if ($message_template_group instanceof EE_Message_Template_Group) {
360
-            return $message_template_group;
361
-        }
362
-
363
-        //STILL here?  Okay that means the fallback is to just use the global message template group for this event set.
364
-        //So we'll cache the global group for this event set (so this logic doesn't have to be repeated in this request)
365
-        //and return it.
366
-        if ($global_message_template_group instanceof EE_Message_Template_Group) {
367
-            $this->_template_collection->add(
368
-                $global_message_template_group,
369
-                $event_ids
370
-            );
371
-            return $global_message_template_group;
372
-        }
373
-
374
-        //if we land here that means there's NO active message template group for this set.
375
-        //TODO this will be a good target for some optimization down the road.  Whenever there is no active message
376
-        //template group for a given event set then cache that result so we don't repeat the logic.  However, for now,
377
-        //this should likely bit hit rarely enough that it's not a significant issue.
378
-        return null;
379
-    }
380
-
381
-
382
-    /**
383
-     * This checks the current message in the queue and determines if there is a specific Message Template Group
384
-     * requested for that message.
385
-     *
386
-     * @return EE_Message_Template_Group|null
387
-     */
388
-    protected function _specific_message_template_group_from_queue()
389
-    {
390
-        //is there a GRP_ID already on the EE_Message object?  If there is, then a specific template has been requested
391
-        //so let's use that.
392
-        $GRP_ID = $this->_generation_queue->get_message_repository()->current()->GRP_ID();
393
-
394
-        if ($GRP_ID) {
395
-            //attempt to retrieve from repo first
396
-            $message_template_group = $this->_template_collection->get_by_ID($GRP_ID);
397
-            if ($message_template_group instanceof EE_Message_Template_Group) {
398
-                return $message_template_group;  //got it!
399
-            }
400
-
401
-            //nope don't have it yet.  Get from DB then add to repo if its not here, then that means the current GRP_ID
402
-            //is not valid, so we'll continue on in the code assuming there's NO GRP_ID.
403
-            $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
404
-            if ($message_template_group instanceof EE_Message_Template_Group) {
405
-                $this->_template_collection->add($message_template_group);
406
-                return $message_template_group;
407
-            }
408
-        }
409
-        return null;
410
-    }
411
-
412
-
413
-    /**
414
-     * Returns whether the event ids passed in all share the same message template group for the current message type
415
-     * and messenger.
416
-     *
417
-     * @param array $event_ids
418
-     * @return bool true means they DO share the same message template group, false means they don't.
419
-     * @throws EE_Error
420
-     */
421
-    protected function _queue_shares_same_message_template_group_for_events(array $event_ids)
422
-    {
423
-        foreach ($this->_current_data_handler->events as $event) {
424
-            $event_ids[$event['ID']] = $event['ID'];
425
-        }
426
-        $count_of_message_template_groups = EEM_Message_Template_Group::instance()->count(
427
-            array(
428
-                array(
429
-                    'Event.EVT_ID'           => array('IN', $event_ids),
430
-                    'MTP_messenger'    => $this->_current_messenger->name,
431
-                    'MTP_message_type' => $this->_current_message_type->name,
432
-                ),
433
-            ),
434
-            'GRP_ID',
435
-            true
436
-        );
437
-        return $count_of_message_template_groups === 1;
438
-    }
439
-
440
-
441
-    /**
442
-     * This will get the shared message template group for events that are in the current data handler but ONLY if
443
-     * there's a single shared message template group among all the events.  Otherwise it returns null.
444
-     *
445
-     * @param array $event_ids
446
-     * @return EE_Message_Template_Group|null
447
-     * @throws EE_Error
448
-     */
449
-    protected function _get_shared_message_template_for_events(array $event_ids)
450
-    {
451
-        $message_template_group = null;
452
-        if ($this->_queue_shares_same_message_template_group_for_events($event_ids)) {
453
-            $message_template_group = EEM_Message_Template_Group::instance()->get_one(
454
-                array(
455
-                    array(
456
-                        'Event.EVT_ID'           => array('IN', $event_ids),
457
-                        'MTP_messenger'    => $this->_current_messenger->name,
458
-                        'MTP_message_type' => $this->_current_message_type->name,
459
-                        'MTP_is_active'    => true,
460
-                    ),
461
-                    'group_by' => 'GRP_ID',
462
-                )
463
-            );
464
-            //store this in the collection if its valid
465
-            if ($message_template_group instanceof EE_Message_Template_Group) {
466
-                $this->_template_collection->add(
467
-                    $message_template_group,
468
-                    $event_ids
469
-                );
470
-            }
471
-        }
472
-        return $message_template_group;
473
-    }
474
-
475
-
476
-    /**
477
-     * Retrieves the global message template group for the current messenger and message type.
478
-     *
479
-     * @return EE_Message_Template_Group|null
480
-     * @throws EE_Error
481
-     */
482
-    protected function _get_global_message_template_group_for_current_messenger_and_message_type()
483
-    {
484
-        //first check the collection (we use an array with 0 in it to represent global groups).
485
-        $global_message_template_group = $this->_template_collection->get_by_key(
486
-            $this->_template_collection->getKey(
487
-                $this->_current_messenger->name,
488
-                $this->_current_message_type->name,
489
-                array(0)
490
-            )
491
-        );
492
-
493
-        //if we don't have a group lets hit the db.
494
-        if (! $global_message_template_group instanceof EE_Message_Template_Group) {
495
-            $global_message_template_group = EEM_Message_Template_Group::instance()->get_one(
496
-                array(
497
-                    array(
498
-                        'MTP_messenger'    => $this->_current_messenger->name,
499
-                        'MTP_message_type' => $this->_current_message_type->name,
500
-                        'MTP_is_active'    => true,
501
-                        'MTP_is_global'    => true,
502
-                    ),
503
-                )
504
-            );
505
-            //if we have a group, add it to the collection.
506
-            if ($global_message_template_group instanceof EE_Message_Template_Group) {
507
-                $this->_template_collection->add(
508
-                    $global_message_template_group,
509
-                    array(0)
510
-                );
511
-            }
512
-        }
513
-        return $global_message_template_group;
514
-    }
515
-
516
-
517
-    /**
518
-     * Returns an array of event ids for all the events within the current data handler.
519
-     *
520
-     * @return array
521
-     */
522
-    protected function _get_event_ids_from_current_data_handler()
523
-    {
524
-        $event_ids = array();
525
-        foreach ($this->_current_data_handler->events as $event) {
526
-            $event_ids[$event['ID']] = $event['ID'];
527
-        }
528
-        return $event_ids;
529
-    }
530
-
531
-
532
-    /**
533
-     *  Retrieves formatted array of template information for each context specific to the given
534
-     *  EE_Message_Template_Group
535
-     *
536
-     * @param EE_Message_Template_Group $message_template_group
537
-     * @return array The returned array is in this structure:
538
-     *                          array(
539
-     *                          'field_name' => array(
540
-     *                          'context' => 'content'
541
-     *                          )
542
-     *                          )
543
-     * @throws EE_Error
544
-     */
545
-    protected function _get_templates(EE_Message_Template_Group $message_template_group)
546
-    {
547
-        $templates         = array();
548
-        $context_templates = $message_template_group->context_templates();
549
-        foreach ($context_templates as $context => $template_fields) {
550
-            foreach ($template_fields as $template_field => $template_obj) {
551
-                if (! $template_obj instanceof EE_Message_Template) {
552
-                    continue;
553
-                }
554
-                $templates[$template_field][$context] = $template_obj->get('MTP_content');
555
-            }
556
-        }
557
-        return $templates;
558
-    }
559
-
560
-
561
-    /**
562
-     * Assembles new fully generated EE_Message objects and adds to _ready_queue
563
-     *
564
-     * @param array                     $addressees  Array of EE_Messages_Addressee objects indexed by message type
565
-     *                                               context.
566
-     * @param array                     $templates   formatted array of templates used for parsing data.
567
-     * @param EE_Message_Template_Group $message_template_group
568
-     * @return bool   true if message generation went a-ok.  false if some sort of exception occurred.  Note: The
569
-     *                                               method will attempt to generate ALL EE_Message objects and add to
570
-     *                                               the _ready_queue.  Successfully generated messages get added to the
571
-     *                                               queue with EEM_Message::status_idle, unsuccessfully generated
572
-     *                                               messages will get added to the queue as EEM_Message::status_failed.
573
-     *                                               Very rarely should "false" be returned from this method.
574
-     */
575
-    protected function _assemble_messages($addressees, $templates, EE_Message_Template_Group $message_template_group)
576
-    {
577
-
578
-        //if templates are empty then get out because we can't generate anything.
579
-        if (! $templates) {
580
-            $this->_error_msg[] = esc_html__(
581
-                'Unable to assemble messages because there are no templates retrieved for generating the messages with',
582
-                'event_espresso'
583
-            );
584
-            return false;
585
-        }
586
-
587
-        //We use this as the counter for generated messages because don't forget we may be executing this inside of a
588
-        //generation_queue.  So _ready_queue may have generated EE_Message objects already.
589
-        $generated_count = 0;
590
-        foreach ($addressees as $context => $recipients) {
591
-            foreach ($recipients as $recipient) {
592
-                $message = $this->_setup_message_object($context, $recipient, $templates, $message_template_group);
593
-                if ($message instanceof EE_Message) {
594
-                    $this->_ready_queue->add(
595
-                        $message,
596
-                        array(),
597
-                        $this->_generation_queue->get_message_repository()->is_preview(),
598
-                        $this->_generation_queue->get_message_repository()->is_test_send()
599
-                    );
600
-                    $generated_count++;
601
-                }
602
-
603
-                //if the current MSG being generated is for a test send then we'll only use ONE message in the generation.
604
-                if ($this->_generation_queue->get_message_repository()->is_test_send()) {
605
-                    break 2;
606
-                }
607
-            }
608
-        }
609
-
610
-        //if there are no generated messages then something else fatal went wrong.
611
-        return $generated_count > 0;
612
-    }
613
-
614
-
615
-    /**
616
-     * @param string                    $context   The context for the generated message.
617
-     * @param EE_Messages_Addressee     $recipient
618
-     * @param array                     $templates formatted array of templates used for parsing data.
619
-     * @param EE_Message_Template_Group $message_template_group
620
-     * @return bool|EE_Message
621
-     * @throws EE_Error
622
-     */
623
-    protected function _setup_message_object(
624
-        $context,
625
-        EE_Messages_Addressee $recipient,
626
-        $templates,
627
-        EE_Message_Template_Group $message_template_group
628
-    ) {
629
-        //stuff we already know
630
-        $transaction_id = $recipient->txn instanceof EE_Transaction ? $recipient->txn->ID() : 0;
631
-        $transaction_id = empty($transaction_id) && $this->_current_data_handler->txn instanceof EE_Transaction
632
-            ? $this->_current_data_handler->txn->ID()
633
-            : $transaction_id;
634
-        $message_fields = array(
635
-            'GRP_ID'           => $message_template_group->ID(),
636
-            'TXN_ID'           => $transaction_id,
637
-            'MSG_messenger'    => $this->_current_messenger->name,
638
-            'MSG_message_type' => $this->_current_message_type->name,
639
-            'MSG_context'      => $context,
640
-        );
641
-
642
-        //recipient id and type should be on the EE_Messages_Addressee object but if this is empty, let's try to grab
643
-        // the info from the att_obj found in the EE_Messages_Addressee object.
644
-        if (empty($recipient->recipient_id) || empty($recipient->recipient_type)) {
645
-            $message_fields['MSG_recipient_ID']   = $recipient->att_obj instanceof EE_Attendee
646
-                ? $recipient->att_obj->ID()
647
-                : 0;
648
-            $message_fields['MSG_recipient_type'] = 'Attendee';
649
-        } else {
650
-            $message_fields['MSG_recipient_ID']   = $recipient->recipient_id;
651
-            $message_fields['MSG_recipient_type'] = $recipient->recipient_type;
652
-        }
653
-        $message = EE_Message_Factory::create($message_fields);
654
-
655
-        //grab valid shortcodes for shortcode parser
656
-        $mt_shortcodes = $this->_current_message_type->get_valid_shortcodes();
657
-        $m_shortcodes  = $this->_current_messenger->get_valid_shortcodes();
658
-
659
-        //if the 'to' field is empty (messages will ALWAYS have a "to" field, then we get out because that means this
660
-        //context is turned off) EXCEPT if we're previewing
661
-        if (empty($templates['to'][$context])
662
-            && ! $this->_generation_queue->get_message_repository()->is_preview()
663
-            && ! $this->_current_messenger->allow_empty_to_field()
664
-        ) {
665
-            //we silently exit here and do NOT record a fail because the message is "turned off" by having no "to"
666
-            //field.
667
-            return false;
668
-        }
669
-        $error_msg = array();
670
-        foreach ($templates as $field => $field_context) {
671
-            $error_msg = array();
672
-            //let's setup the valid shortcodes for the incoming context.
673
-            $valid_shortcodes = $mt_shortcodes[$context];
674
-            //merge in valid shortcodes for the field.
675
-            $shortcodes = isset($m_shortcodes[$field]) ? $m_shortcodes[$field] : $valid_shortcodes;
676
-            if (isset($templates[$field][$context])) {
677
-                //prefix field.
678
-                $column_name = 'MSG_' . $field;
679
-                try {
680
-                    $content = $this->_shortcode_parser->parse_message_template(
681
-                        $templates[$field][$context],
682
-                        $recipient,
683
-                        $shortcodes,
684
-                        $this->_current_message_type,
685
-                        $this->_current_messenger,
686
-                        $message
687
-                    );
688
-                    $message->set_field_or_extra_meta($column_name, $content);
689
-                } catch (EE_Error $e) {
690
-                    $error_msg[] = sprintf(
691
-                        esc_html__(
692
-                            'There was a problem generating the content for the field %s: %s',
693
-                            'event_espresso'
694
-                        ),
695
-                        $field,
696
-                        $e->getMessage()
697
-                    );
698
-                    $message->set_STS_ID(EEM_Message::status_failed);
699
-                }
700
-            }
701
-        }
702
-
703
-        if ($message->STS_ID() === EEM_Message::status_failed) {
704
-            $error_msg = esc_html__('There were problems generating this message:', 'event_espresso')
705
-                         . "\n"
706
-                         . implode("\n", $error_msg);
707
-            $message->set_error_message($error_msg);
708
-        } else {
709
-            $message->set_STS_ID(EEM_Message::status_idle);
710
-        }
711
-        return $message;
712
-    }
713
-
714
-
715
-    /**
716
-     * This verifies that the incoming array has a EE_messenger object and a EE_message_type object and sets appropriate
717
-     * error message if either is missing.
718
-     *
719
-     * @return bool         true means there were no errors, false means there were errors.
720
-     */
721
-    protected function _verify()
722
-    {
723
-        //reset error message to an empty array.
724
-        $this->_error_msg = array();
725
-        $valid            = true;
726
-        $valid            = $valid ? $this->_validate_messenger_and_message_type() : $valid;
727
-        $valid            = $valid ? $this->_validate_and_setup_data() : $valid;
728
-
729
-        //set the verified flag so we know everything has been validated.
730
-        $this->_verified = $valid;
731
-
732
-        return $valid;
733
-    }
734
-
735
-
736
-    /**
737
-     * This accepts an array and validates that it is an array indexed by context with each value being an array of
738
-     * EE_Messages_Addressee objects.
739
-     *
740
-     * @param array $addressees Keys correspond to contexts for the message type and values are EE_Messages_Addressee[]
741
-     * @return bool
742
-     */
743
-    protected function _valid_addressees($addressees)
744
-    {
745
-        if (! $addressees || ! is_array($addressees)) {
746
-            return false;
747
-        }
748
-
749
-        foreach ($addressees as $addressee_array) {
750
-            foreach ($addressee_array as $addressee) {
751
-                if (! $addressee instanceof EE_Messages_Addressee) {
752
-                    return false;
753
-                }
754
-            }
755
-        }
756
-        return true;
757
-    }
758
-
759
-
760
-    /**
761
-     * This validates the messenger, message type, and presences of generation data for the current EE_Message in the
762
-     * queue. This process sets error messages if something is wrong.
763
-     *
764
-     * @return bool   true is if there are no errors.  false is if there is.
765
-     */
766
-    protected function _validate_messenger_and_message_type()
767
-    {
768
-
769
-        //first are there any existing error messages?  If so then return.
770
-        if ($this->_error_msg) {
771
-            return false;
772
-        }
773
-        /** @type EE_Message $message */
774
-        $message = $this->_generation_queue->get_message_repository()->current();
775
-        try {
776
-            $this->_current_messenger = $message->valid_messenger(true)
777
-                ? $message->messenger_object()
778
-                : null;
779
-        } catch (Exception $e) {
780
-            $this->_error_msg[] = $e->getMessage();
781
-        }
782
-        try {
783
-            $this->_current_message_type = $message->valid_message_type(true)
784
-                ? $message->message_type_object()
785
-                : null;
786
-        } catch (Exception $e) {
787
-            $this->_error_msg[] = $e->getMessage();
788
-        }
789
-
790
-        /**
791
-         * Check if there is any generation data, but only if this is not for a preview.
792
-         */
793
-        if (! $this->_generation_queue->get_message_repository()->get_generation_data()
794
-            && (
795
-                ! $this->_generation_queue->get_message_repository()->is_preview()
796
-                && $this->_generation_queue->get_message_repository()->get_data_handler()
797
-                   !== 'EE_Messages_Preview_incoming_data'
798
-            )
799
-        ) {
800
-            $this->_error_msg[] = esc_html__(
801
-                'There is no generation data for this message. Unable to generate.',
802
-                'event_espresso'
803
-            );
804
-        }
805
-
806
-        return empty($this->_error_msg);
807
-    }
808
-
809
-
810
-    /**
811
-     * This method retrieves the expected data handler for the message type and validates the generation data for that
812
-     * data handler.
813
-     *
814
-     * @return bool true means there are no errors.  false means there were errors (and handler did not get setup).
815
-     */
816
-    protected function _validate_and_setup_data()
817
-    {
818
-
819
-        //First, are there any existing error messages?  If so, return because if there were errors elsewhere this can't
820
-        //be used anyways.
821
-        if ($this->_error_msg) {
822
-            return false;
823
-        }
824
-
825
-        $generation_data = $this->_generation_queue->get_message_repository()->get_generation_data();
826
-
827
-        /** @type EE_Messages_incoming_data $data_handler_class_name - well not really... just the class name actually */
828
-        $data_handler_class_name = $this->_generation_queue->get_message_repository()->get_data_handler()
829
-            ? $this->_generation_queue->get_message_repository()->get_data_handler()
830
-            : 'EE_Messages_' . $this->_current_message_type->get_data_handler($generation_data) . '_incoming_data';
831
-
832
-        //If this EE_Message is for a preview, then let's switch out to the preview data handler.
833
-        if ($this->_generation_queue->get_message_repository()->is_preview()) {
834
-            $data_handler_class_name = 'EE_Messages_Preview_incoming_data';
835
-        }
836
-
837
-        //First get the class name for the data handler (and also verifies it exists.
838
-        if (! class_exists($data_handler_class_name)) {
839
-            $this->_error_msg[] = sprintf(
840
-                esc_html__(
841
-                    'The included data handler class name does not match any valid, accessible, "%1$s" classes.  Looking for %2$s.',
842
-                    'event_espresso'
843
-                ),
844
-                'EE_Messages_incoming_data',
845
-                $data_handler_class_name
846
-            );
847
-            return false;
848
-        }
849
-
850
-        //convert generation_data for data_handler_instantiation.
851
-        $generation_data = $data_handler_class_name::convert_data_from_persistent_storage($generation_data);
852
-
853
-        //note, this may set error messages as well.
854
-        $this->_set_data_handler($generation_data, $data_handler_class_name);
855
-
856
-        return empty($this->_error_msg);
857
-    }
858
-
859
-
860
-    /**
861
-     * Sets the $_current_data_handler property that is used for generating the current EE_Message in the queue, and
862
-     * adds it to the _data repository.
863
-     *
864
-     * @param mixed  $generating_data           This is data expected by the instantiated data handler.
865
-     * @param string $data_handler_class_name   This is the reference string indicating what data handler is being
866
-     *                                          instantiated.
867
-     * @return void .
868
-     * @throws EE_Error
869
-     * @throws ReflectionException
870
-     */
871
-    protected function _set_data_handler($generating_data, $data_handler_class_name)
872
-    {
873
-        //valid classname for the data handler.  Now let's setup the key for the data handler repository to see if there
874
-        //is already a ready data handler in the repository.
875
-        $this->_current_data_handler = $this->_data_handler_collection->get_by_key(
876
-            $this->_data_handler_collection->get_key(
877
-                $data_handler_class_name,
878
-                $generating_data
879
-            )
880
-        );
881
-        if (! $this->_current_data_handler instanceof EE_Messages_incoming_data) {
882
-            //no saved data_handler in the repo so let's set one up and add it to the repo.
883
-            try {
884
-                $this->_current_data_handler = new $data_handler_class_name($generating_data);
885
-                $this->_data_handler_collection->add($this->_current_data_handler, $generating_data);
886
-            } catch (EE_Error $e) {
887
-                $this->_error_msg[] = $e->get_error();
888
-            }
889
-        }
890
-    }
891
-
892
-
893
-    /**
894
-     * The queued EE_Message for generation does not save the data used for generation as objects
895
-     * because serialization of those objects could be problematic if the data is saved to the db.
896
-     * So this method calls the static method on the associated data_handler for the given message_type
897
-     * and that preps the data for later instantiation when generating.
898
-     *
899
-     * @param EE_Message_To_Generate $message_to_generate
900
-     * @param bool                   $preview Indicate whether this is being used for a preview or not.
901
-     * @return mixed Prepped data for persisting to the queue.  false is returned if unable to prep data.
902
-     */
903
-    protected function _prepare_data_for_queue(EE_Message_To_Generate $message_to_generate, $preview)
904
-    {
905
-        /** @type EE_Messages_incoming_data $data_handler - well not really... just the class name actually */
906
-        $data_handler = $message_to_generate->get_data_handler_class_name($preview);
907
-        if (! $message_to_generate->valid()) {
908
-            return false; //unable to get the data because the info in the EE_Message_To_Generate class is invalid.
909
-        }
910
-        return $data_handler::convert_data_for_persistent_storage($message_to_generate->data());
911
-    }
912
-
913
-
914
-    /**
915
-     * This sets up a EEM_Message::status_incomplete EE_Message object and adds it to the generation queue.
916
-     *
917
-     * @param EE_Message_To_Generate $message_to_generate
918
-     * @param bool                   $test_send Whether this is just a test send or not.  Typically used for previews.
919
-     */
920
-    public function create_and_add_message_to_queue(EE_Message_To_Generate $message_to_generate, $test_send = false)
921
-    {
922
-        //prep data
923
-        $data = $this->_prepare_data_for_queue($message_to_generate, $message_to_generate->preview());
924
-
925
-        $message = $message_to_generate->get_EE_Message();
926
-
927
-        //is there a GRP_ID in the request?
928
-        if ($GRP_ID = EE_Registry::instance()->REQ->get('GRP_ID')) {
929
-            $message->set_GRP_ID($GRP_ID);
930
-        }
931
-
932
-        if ($data === false) {
933
-            $message->set_STS_ID(EEM_Message::status_failed);
934
-            $message->set_error_message(
935
-                esc_html__(
936
-                    'Unable to prepare data for persistence to the database.',
937
-                    'event_espresso'
938
-                )
939
-            );
940
-        } else {
941
-            //make sure that the data handler is cached on the message as well
942
-            $data['data_handler_class_name'] = $message_to_generate->get_data_handler_class_name();
943
-        }
944
-
945
-        $this->_generation_queue->add($message, $data, $message_to_generate->preview(), $test_send);
946
-    }
16
+	/**
17
+	 * @type EE_Messages_Data_Handler_Collection
18
+	 */
19
+	protected $_data_handler_collection;
20
+
21
+	/**
22
+	 * @type  EE_Message_Template_Group_Collection
23
+	 */
24
+	protected $_template_collection;
25
+
26
+	/**
27
+	 * This will hold the data handler for the current EE_Message being generated.
28
+	 *
29
+	 * @type EE_Messages_incoming_data
30
+	 */
31
+	protected $_current_data_handler;
32
+
33
+	/**
34
+	 * This holds the EE_Messages_Queue that contains the messages to generate.
35
+	 *
36
+	 * @type EE_Messages_Queue
37
+	 */
38
+	protected $_generation_queue;
39
+
40
+	/**
41
+	 * This holds the EE_Messages_Queue that will store the generated EE_Message objects.
42
+	 *
43
+	 * @type EE_Messages_Queue
44
+	 */
45
+	protected $_ready_queue;
46
+
47
+	/**
48
+	 * This is a container for any error messages that get created through the generation
49
+	 * process.
50
+	 *
51
+	 * @type array
52
+	 */
53
+	protected $_error_msg = array();
54
+
55
+	/**
56
+	 * Flag used to set when the current EE_Message in the generation queue has been verified.
57
+	 *
58
+	 * @type bool
59
+	 */
60
+	protected $_verified = false;
61
+
62
+	/**
63
+	 * This will hold the current messenger object corresponding with the current EE_Message in the generation queue.
64
+	 *
65
+	 * @type EE_messenger
66
+	 */
67
+	protected $_current_messenger;
68
+
69
+	/**
70
+	 * This will hold the current message type object corresponding with the current EE_Message in the generation queue.
71
+	 *
72
+	 * @type EE_message_type
73
+	 */
74
+	protected $_current_message_type;
75
+
76
+	/**
77
+	 * @type EEH_Parse_Shortcodes
78
+	 */
79
+	protected $_shortcode_parser;
80
+
81
+
82
+	/**
83
+	 * @param EE_Messages_Queue                     $generation_queue
84
+	 * @param \EE_Messages_Queue                    $ready_queue
85
+	 * @param \EE_Messages_Data_Handler_Collection  $data_handler_collection
86
+	 * @param \EE_Message_Template_Group_Collection $template_collection
87
+	 * @param \EEH_Parse_Shortcodes                 $shortcode_parser
88
+	 */
89
+	public function __construct(
90
+		EE_Messages_Queue $generation_queue,
91
+		EE_Messages_Queue $ready_queue,
92
+		EE_Messages_Data_Handler_Collection $data_handler_collection,
93
+		EE_Message_Template_Group_Collection $template_collection,
94
+		EEH_Parse_Shortcodes $shortcode_parser
95
+	) {
96
+		$this->_generation_queue        = $generation_queue;
97
+		$this->_ready_queue             = $ready_queue;
98
+		$this->_data_handler_collection = $data_handler_collection;
99
+		$this->_template_collection     = $template_collection;
100
+		$this->_shortcode_parser        = $shortcode_parser;
101
+	}
102
+
103
+
104
+	/**
105
+	 * @return EE_Messages_Queue
106
+	 */
107
+	public function generation_queue()
108
+	{
109
+		return $this->_generation_queue;
110
+	}
111
+
112
+
113
+	/**
114
+	 *  This iterates through the provided queue and generates the EE_Message objects.
115
+	 *  When iterating through the queue, the queued item that served as the base for generating other EE_Message
116
+	 *  objects gets removed and the new EE_Message objects get added to a NEW queue.  The NEW queue is then returned
117
+	 *  for the caller to decide what to do with it.
118
+	 *
119
+	 * @param   bool $save Whether to save the EE_Message objects in the new queue or just return.
120
+	 * @return EE_Messages_Queue  The new queue for holding generated EE_Message objects.
121
+	 */
122
+	public function generate($save = true)
123
+	{
124
+		//iterate through the messages in the queue, generate, and add to new queue.
125
+		$this->_generation_queue->get_message_repository()->rewind();
126
+		while ($this->_generation_queue->get_message_repository()->valid()) {
127
+			//reset "current" properties
128
+			$this->_reset_current_properties();
129
+
130
+			/** @type EE_Message $msg */
131
+			$msg = $this->_generation_queue->get_message_repository()->current();
132
+
133
+			/**
134
+			 * need to get the next object and capture it for setting manually after deletes.  The reason is that when
135
+			 * an object is removed from the repo then valid for the next object will fail.
136
+			 */
137
+			$this->_generation_queue->get_message_repository()->next();
138
+			$next_msg = $this->_generation_queue->get_message_repository()->current();
139
+			//restore pointer to current item
140
+			$this->_generation_queue->get_message_repository()->set_current($msg);
141
+
142
+			//skip and delete if the current $msg is NOT incomplete (queued for generation)
143
+			if ($msg->STS_ID() !== EEM_Message::status_incomplete) {
144
+				//we keep this item in the db just remove from the repo.
145
+				$this->_generation_queue->get_message_repository()->remove($msg);
146
+				//next item
147
+				$this->_generation_queue->get_message_repository()->set_current($next_msg);
148
+				continue;
149
+			}
150
+
151
+			if ($this->_verify()) {
152
+				//let's get generating!
153
+				$this->_generate();
154
+			}
155
+
156
+			//don't persist debug_only messages if the messages system is not in debug mode.
157
+			if ($msg->STS_ID() === EEM_Message::status_debug_only
158
+				&& ! EEM_Message::debug()
159
+			) {
160
+				do_action(
161
+					'AHEE__EE_Messages_Generator__generate__before_debug_delete',
162
+					$msg,
163
+					$this->_error_msg,
164
+					$this->_current_messenger,
165
+					$this->_current_message_type,
166
+					$this->_current_data_handler
167
+				);
168
+				$this->_generation_queue->get_message_repository()->delete();
169
+				$this->_generation_queue->get_message_repository()->set_current($next_msg);
170
+				continue;
171
+			}
172
+
173
+			//if there are error messages then let's set the status and the error message.
174
+			if ($this->_error_msg) {
175
+				//if the status is already debug only, then let's leave it at that.
176
+				if ($msg->STS_ID() !== EEM_Message::status_debug_only) {
177
+					$msg->set_STS_ID(EEM_Message::status_failed);
178
+				}
179
+				do_action(
180
+					'AHEE__EE_Messages_Generator__generate__processing_failed_message',
181
+					$msg,
182
+					$this->_error_msg,
183
+					$this->_current_messenger,
184
+					$this->_current_message_type,
185
+					$this->_current_data_handler
186
+				);
187
+				$msg->set_error_message(
188
+					esc_html__('Message failed to generate for the following reasons: ', 'event_espresso')
189
+					. "\n"
190
+					. implode("\n", $this->_error_msg)
191
+				);
192
+				$msg->set_modified(time());
193
+			} else {
194
+				do_action(
195
+					'AHEE__EE_Messages_Generator__generate__before_successful_generated_message_delete',
196
+					$msg,
197
+					$this->_error_msg,
198
+					$this->_current_messenger,
199
+					$this->_current_message_type,
200
+					$this->_current_data_handler
201
+				);
202
+				//remove from db
203
+				$this->_generation_queue->get_message_repository()->delete();
204
+			}
205
+			//next item
206
+			$this->_generation_queue->get_message_repository()->set_current($next_msg);
207
+		}
208
+
209
+		//generation queue is ALWAYS saved to record any errors in the generation process.
210
+		$this->_generation_queue->save();
211
+
212
+		/**
213
+		 * save _ready_queue if flag set.
214
+		 * Note: The EE_Message objects have values set via the EE_Base_Class::set_field_or_extra_meta() method.  This
215
+		 * means if a field was added that is not a valid database column.  The EE_Message was already saved to the db
216
+		 * so a EE_Extra_Meta entry could be created and attached to the EE_Message.  In those cases the save flag is
217
+		 * irrelevant.
218
+		 */
219
+		if ($save) {
220
+			$this->_ready_queue->save();
221
+		}
222
+
223
+		//final reset of properties
224
+		$this->_reset_current_properties();
225
+
226
+		return $this->_ready_queue;
227
+	}
228
+
229
+
230
+	/**
231
+	 * This resets all the properties used for holding "current" values corresponding to the current EE_Message object
232
+	 * in the generation queue.
233
+	 */
234
+	protected function _reset_current_properties()
235
+	{
236
+		$this->_verified = false;
237
+		//make sure any _data value in the current message type is reset
238
+		if ($this->_current_message_type instanceof EE_message_type) {
239
+			$this->_current_message_type->reset_data();
240
+		}
241
+		$this->_current_messenger = $this->_current_message_type = $this->_current_data_handler = null;
242
+	}
243
+
244
+
245
+	/**
246
+	 * This proceeds with the actual generation of a message.  By the time this is called, there should already be a
247
+	 * $_current_data_handler set and all incoming information should be validated for the current EE_Message in the
248
+	 * _generating_queue.
249
+	 *
250
+	 * @return bool Whether the message was successfully generated or not.
251
+	 * @throws EE_Error
252
+	 */
253
+	protected function _generate()
254
+	{
255
+		//double check verification has run and that everything is ready to work with (saves us having to validate
256
+		// everything again).
257
+		if (! $this->_verified) {
258
+			return false; //get out because we don't have a valid setup to work with.
259
+		}
260
+
261
+
262
+		try {
263
+			$addressees = $this->_current_message_type->get_addressees(
264
+				$this->_current_data_handler,
265
+				$this->_generation_queue->get_message_repository()->current()->context()
266
+			);
267
+		} catch (EE_Error $e) {
268
+			$this->_error_msg[] = $e->getMessage();
269
+			return false;
270
+		}
271
+
272
+
273
+		//if no addressees then get out because there is nothing to generation (possible bad data).
274
+		if (! $this->_valid_addressees($addressees)) {
275
+			do_action(
276
+				'AHEE__EE_Messages_Generator___generate__invalid_addressees',
277
+				$this->_generation_queue->get_message_repository()->current(),
278
+				$addressees,
279
+				$this->_current_messenger,
280
+				$this->_current_message_type,
281
+				$this->_current_data_handler
282
+			);
283
+			$this->_generation_queue->get_message_repository()->current()->set_STS_ID(
284
+				EEM_Message::status_debug_only
285
+			);
286
+			$this->_error_msg[] = esc_html__(
287
+				'This is not a critical error but an informational notice. Unable to generate messages EE_Messages_Addressee objects.  There were no attendees prepared by the data handler. Sometimes this is because messages only get generated for certain registration statuses. For example, the ticket notice message type only goes to approved registrations.',
288
+				'event_espresso'
289
+			);
290
+			return false;
291
+		}
292
+
293
+		$message_template_group = $this->_get_message_template_group();
294
+
295
+		//in the unlikely event there is no EE_Message_Template_Group available, get out!
296
+		if (! $message_template_group instanceof EE_Message_Template_Group) {
297
+			$this->_error_msg[] = esc_html__(
298
+				'Unable to get the Message Templates for the Message being generated.  No message template group accessible.',
299
+				'event_espresso'
300
+			);
301
+			return false;
302
+		}
303
+
304
+		//get formatted templates for using to parse and setup EE_Message objects.
305
+		$templates = $this->_get_templates($message_template_group);
306
+
307
+
308
+		//setup new EE_Message objects (and add to _ready_queue)
309
+		return $this->_assemble_messages($addressees, $templates, $message_template_group);
310
+	}
311
+
312
+
313
+	/**
314
+	 * Retrieves the message template group being used for generating messages.
315
+	 * Note: this also utilizes the EE_Message_Template_Group_Collection to avoid having to hit the db multiple times.
316
+	 *
317
+	 * @return EE_Message_Template_Group|null
318
+	 * @throws EE_Error
319
+	 */
320
+	protected function _get_message_template_group()
321
+	{
322
+		//first see if there is a specific message template group requested (current message in the queue has a specific
323
+		//GRP_ID
324
+		$message_template_group = $this->_specific_message_template_group_from_queue();
325
+		if ($message_template_group instanceof EE_Message_Template_Group) {
326
+			return $message_template_group;
327
+		}
328
+
329
+		//get event_ids from the datahandler so we can check to see if there's already a message template group for them
330
+		//in the collection.
331
+		$event_ids              = $this->_get_event_ids_from_current_data_handler();
332
+		$message_template_group = $this->_template_collection->get_by_key(
333
+			$this->_template_collection->getKey(
334
+				$this->_current_messenger->name,
335
+				$this->_current_message_type->name,
336
+				$event_ids
337
+			)
338
+		);
339
+
340
+		//if we have a message template group then no need to hit the database, just return it.
341
+		if ($message_template_group instanceof EE_Message_Template_Group) {
342
+			return $message_template_group;
343
+		}
344
+
345
+		//okay made it here, so let's get the global group first for this messenger and message type to ensure
346
+		//there is no override set.
347
+		$global_message_template_group = $this->_get_global_message_template_group_for_current_messenger_and_message_type();
348
+
349
+		if ($global_message_template_group instanceof EE_Message_Template_Group
350
+			&& $global_message_template_group->get('MTP_is_override')
351
+		) {
352
+			return $global_message_template_group;
353
+		}
354
+
355
+		//if we're still here, that means there was no message template group for the events in the collection and
356
+		//the global message template group for the messenger and message type is not set for override.  So next step is
357
+		//to see if there is a common shared custom message template group for this set of events.
358
+		$message_template_group = $this->_get_shared_message_template_for_events($event_ids);
359
+		if ($message_template_group instanceof EE_Message_Template_Group) {
360
+			return $message_template_group;
361
+		}
362
+
363
+		//STILL here?  Okay that means the fallback is to just use the global message template group for this event set.
364
+		//So we'll cache the global group for this event set (so this logic doesn't have to be repeated in this request)
365
+		//and return it.
366
+		if ($global_message_template_group instanceof EE_Message_Template_Group) {
367
+			$this->_template_collection->add(
368
+				$global_message_template_group,
369
+				$event_ids
370
+			);
371
+			return $global_message_template_group;
372
+		}
373
+
374
+		//if we land here that means there's NO active message template group for this set.
375
+		//TODO this will be a good target for some optimization down the road.  Whenever there is no active message
376
+		//template group for a given event set then cache that result so we don't repeat the logic.  However, for now,
377
+		//this should likely bit hit rarely enough that it's not a significant issue.
378
+		return null;
379
+	}
380
+
381
+
382
+	/**
383
+	 * This checks the current message in the queue and determines if there is a specific Message Template Group
384
+	 * requested for that message.
385
+	 *
386
+	 * @return EE_Message_Template_Group|null
387
+	 */
388
+	protected function _specific_message_template_group_from_queue()
389
+	{
390
+		//is there a GRP_ID already on the EE_Message object?  If there is, then a specific template has been requested
391
+		//so let's use that.
392
+		$GRP_ID = $this->_generation_queue->get_message_repository()->current()->GRP_ID();
393
+
394
+		if ($GRP_ID) {
395
+			//attempt to retrieve from repo first
396
+			$message_template_group = $this->_template_collection->get_by_ID($GRP_ID);
397
+			if ($message_template_group instanceof EE_Message_Template_Group) {
398
+				return $message_template_group;  //got it!
399
+			}
400
+
401
+			//nope don't have it yet.  Get from DB then add to repo if its not here, then that means the current GRP_ID
402
+			//is not valid, so we'll continue on in the code assuming there's NO GRP_ID.
403
+			$message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
404
+			if ($message_template_group instanceof EE_Message_Template_Group) {
405
+				$this->_template_collection->add($message_template_group);
406
+				return $message_template_group;
407
+			}
408
+		}
409
+		return null;
410
+	}
411
+
412
+
413
+	/**
414
+	 * Returns whether the event ids passed in all share the same message template group for the current message type
415
+	 * and messenger.
416
+	 *
417
+	 * @param array $event_ids
418
+	 * @return bool true means they DO share the same message template group, false means they don't.
419
+	 * @throws EE_Error
420
+	 */
421
+	protected function _queue_shares_same_message_template_group_for_events(array $event_ids)
422
+	{
423
+		foreach ($this->_current_data_handler->events as $event) {
424
+			$event_ids[$event['ID']] = $event['ID'];
425
+		}
426
+		$count_of_message_template_groups = EEM_Message_Template_Group::instance()->count(
427
+			array(
428
+				array(
429
+					'Event.EVT_ID'           => array('IN', $event_ids),
430
+					'MTP_messenger'    => $this->_current_messenger->name,
431
+					'MTP_message_type' => $this->_current_message_type->name,
432
+				),
433
+			),
434
+			'GRP_ID',
435
+			true
436
+		);
437
+		return $count_of_message_template_groups === 1;
438
+	}
439
+
440
+
441
+	/**
442
+	 * This will get the shared message template group for events that are in the current data handler but ONLY if
443
+	 * there's a single shared message template group among all the events.  Otherwise it returns null.
444
+	 *
445
+	 * @param array $event_ids
446
+	 * @return EE_Message_Template_Group|null
447
+	 * @throws EE_Error
448
+	 */
449
+	protected function _get_shared_message_template_for_events(array $event_ids)
450
+	{
451
+		$message_template_group = null;
452
+		if ($this->_queue_shares_same_message_template_group_for_events($event_ids)) {
453
+			$message_template_group = EEM_Message_Template_Group::instance()->get_one(
454
+				array(
455
+					array(
456
+						'Event.EVT_ID'           => array('IN', $event_ids),
457
+						'MTP_messenger'    => $this->_current_messenger->name,
458
+						'MTP_message_type' => $this->_current_message_type->name,
459
+						'MTP_is_active'    => true,
460
+					),
461
+					'group_by' => 'GRP_ID',
462
+				)
463
+			);
464
+			//store this in the collection if its valid
465
+			if ($message_template_group instanceof EE_Message_Template_Group) {
466
+				$this->_template_collection->add(
467
+					$message_template_group,
468
+					$event_ids
469
+				);
470
+			}
471
+		}
472
+		return $message_template_group;
473
+	}
474
+
475
+
476
+	/**
477
+	 * Retrieves the global message template group for the current messenger and message type.
478
+	 *
479
+	 * @return EE_Message_Template_Group|null
480
+	 * @throws EE_Error
481
+	 */
482
+	protected function _get_global_message_template_group_for_current_messenger_and_message_type()
483
+	{
484
+		//first check the collection (we use an array with 0 in it to represent global groups).
485
+		$global_message_template_group = $this->_template_collection->get_by_key(
486
+			$this->_template_collection->getKey(
487
+				$this->_current_messenger->name,
488
+				$this->_current_message_type->name,
489
+				array(0)
490
+			)
491
+		);
492
+
493
+		//if we don't have a group lets hit the db.
494
+		if (! $global_message_template_group instanceof EE_Message_Template_Group) {
495
+			$global_message_template_group = EEM_Message_Template_Group::instance()->get_one(
496
+				array(
497
+					array(
498
+						'MTP_messenger'    => $this->_current_messenger->name,
499
+						'MTP_message_type' => $this->_current_message_type->name,
500
+						'MTP_is_active'    => true,
501
+						'MTP_is_global'    => true,
502
+					),
503
+				)
504
+			);
505
+			//if we have a group, add it to the collection.
506
+			if ($global_message_template_group instanceof EE_Message_Template_Group) {
507
+				$this->_template_collection->add(
508
+					$global_message_template_group,
509
+					array(0)
510
+				);
511
+			}
512
+		}
513
+		return $global_message_template_group;
514
+	}
515
+
516
+
517
+	/**
518
+	 * Returns an array of event ids for all the events within the current data handler.
519
+	 *
520
+	 * @return array
521
+	 */
522
+	protected function _get_event_ids_from_current_data_handler()
523
+	{
524
+		$event_ids = array();
525
+		foreach ($this->_current_data_handler->events as $event) {
526
+			$event_ids[$event['ID']] = $event['ID'];
527
+		}
528
+		return $event_ids;
529
+	}
530
+
531
+
532
+	/**
533
+	 *  Retrieves formatted array of template information for each context specific to the given
534
+	 *  EE_Message_Template_Group
535
+	 *
536
+	 * @param EE_Message_Template_Group $message_template_group
537
+	 * @return array The returned array is in this structure:
538
+	 *                          array(
539
+	 *                          'field_name' => array(
540
+	 *                          'context' => 'content'
541
+	 *                          )
542
+	 *                          )
543
+	 * @throws EE_Error
544
+	 */
545
+	protected function _get_templates(EE_Message_Template_Group $message_template_group)
546
+	{
547
+		$templates         = array();
548
+		$context_templates = $message_template_group->context_templates();
549
+		foreach ($context_templates as $context => $template_fields) {
550
+			foreach ($template_fields as $template_field => $template_obj) {
551
+				if (! $template_obj instanceof EE_Message_Template) {
552
+					continue;
553
+				}
554
+				$templates[$template_field][$context] = $template_obj->get('MTP_content');
555
+			}
556
+		}
557
+		return $templates;
558
+	}
559
+
560
+
561
+	/**
562
+	 * Assembles new fully generated EE_Message objects and adds to _ready_queue
563
+	 *
564
+	 * @param array                     $addressees  Array of EE_Messages_Addressee objects indexed by message type
565
+	 *                                               context.
566
+	 * @param array                     $templates   formatted array of templates used for parsing data.
567
+	 * @param EE_Message_Template_Group $message_template_group
568
+	 * @return bool   true if message generation went a-ok.  false if some sort of exception occurred.  Note: The
569
+	 *                                               method will attempt to generate ALL EE_Message objects and add to
570
+	 *                                               the _ready_queue.  Successfully generated messages get added to the
571
+	 *                                               queue with EEM_Message::status_idle, unsuccessfully generated
572
+	 *                                               messages will get added to the queue as EEM_Message::status_failed.
573
+	 *                                               Very rarely should "false" be returned from this method.
574
+	 */
575
+	protected function _assemble_messages($addressees, $templates, EE_Message_Template_Group $message_template_group)
576
+	{
577
+
578
+		//if templates are empty then get out because we can't generate anything.
579
+		if (! $templates) {
580
+			$this->_error_msg[] = esc_html__(
581
+				'Unable to assemble messages because there are no templates retrieved for generating the messages with',
582
+				'event_espresso'
583
+			);
584
+			return false;
585
+		}
586
+
587
+		//We use this as the counter for generated messages because don't forget we may be executing this inside of a
588
+		//generation_queue.  So _ready_queue may have generated EE_Message objects already.
589
+		$generated_count = 0;
590
+		foreach ($addressees as $context => $recipients) {
591
+			foreach ($recipients as $recipient) {
592
+				$message = $this->_setup_message_object($context, $recipient, $templates, $message_template_group);
593
+				if ($message instanceof EE_Message) {
594
+					$this->_ready_queue->add(
595
+						$message,
596
+						array(),
597
+						$this->_generation_queue->get_message_repository()->is_preview(),
598
+						$this->_generation_queue->get_message_repository()->is_test_send()
599
+					);
600
+					$generated_count++;
601
+				}
602
+
603
+				//if the current MSG being generated is for a test send then we'll only use ONE message in the generation.
604
+				if ($this->_generation_queue->get_message_repository()->is_test_send()) {
605
+					break 2;
606
+				}
607
+			}
608
+		}
609
+
610
+		//if there are no generated messages then something else fatal went wrong.
611
+		return $generated_count > 0;
612
+	}
613
+
614
+
615
+	/**
616
+	 * @param string                    $context   The context for the generated message.
617
+	 * @param EE_Messages_Addressee     $recipient
618
+	 * @param array                     $templates formatted array of templates used for parsing data.
619
+	 * @param EE_Message_Template_Group $message_template_group
620
+	 * @return bool|EE_Message
621
+	 * @throws EE_Error
622
+	 */
623
+	protected function _setup_message_object(
624
+		$context,
625
+		EE_Messages_Addressee $recipient,
626
+		$templates,
627
+		EE_Message_Template_Group $message_template_group
628
+	) {
629
+		//stuff we already know
630
+		$transaction_id = $recipient->txn instanceof EE_Transaction ? $recipient->txn->ID() : 0;
631
+		$transaction_id = empty($transaction_id) && $this->_current_data_handler->txn instanceof EE_Transaction
632
+			? $this->_current_data_handler->txn->ID()
633
+			: $transaction_id;
634
+		$message_fields = array(
635
+			'GRP_ID'           => $message_template_group->ID(),
636
+			'TXN_ID'           => $transaction_id,
637
+			'MSG_messenger'    => $this->_current_messenger->name,
638
+			'MSG_message_type' => $this->_current_message_type->name,
639
+			'MSG_context'      => $context,
640
+		);
641
+
642
+		//recipient id and type should be on the EE_Messages_Addressee object but if this is empty, let's try to grab
643
+		// the info from the att_obj found in the EE_Messages_Addressee object.
644
+		if (empty($recipient->recipient_id) || empty($recipient->recipient_type)) {
645
+			$message_fields['MSG_recipient_ID']   = $recipient->att_obj instanceof EE_Attendee
646
+				? $recipient->att_obj->ID()
647
+				: 0;
648
+			$message_fields['MSG_recipient_type'] = 'Attendee';
649
+		} else {
650
+			$message_fields['MSG_recipient_ID']   = $recipient->recipient_id;
651
+			$message_fields['MSG_recipient_type'] = $recipient->recipient_type;
652
+		}
653
+		$message = EE_Message_Factory::create($message_fields);
654
+
655
+		//grab valid shortcodes for shortcode parser
656
+		$mt_shortcodes = $this->_current_message_type->get_valid_shortcodes();
657
+		$m_shortcodes  = $this->_current_messenger->get_valid_shortcodes();
658
+
659
+		//if the 'to' field is empty (messages will ALWAYS have a "to" field, then we get out because that means this
660
+		//context is turned off) EXCEPT if we're previewing
661
+		if (empty($templates['to'][$context])
662
+			&& ! $this->_generation_queue->get_message_repository()->is_preview()
663
+			&& ! $this->_current_messenger->allow_empty_to_field()
664
+		) {
665
+			//we silently exit here and do NOT record a fail because the message is "turned off" by having no "to"
666
+			//field.
667
+			return false;
668
+		}
669
+		$error_msg = array();
670
+		foreach ($templates as $field => $field_context) {
671
+			$error_msg = array();
672
+			//let's setup the valid shortcodes for the incoming context.
673
+			$valid_shortcodes = $mt_shortcodes[$context];
674
+			//merge in valid shortcodes for the field.
675
+			$shortcodes = isset($m_shortcodes[$field]) ? $m_shortcodes[$field] : $valid_shortcodes;
676
+			if (isset($templates[$field][$context])) {
677
+				//prefix field.
678
+				$column_name = 'MSG_' . $field;
679
+				try {
680
+					$content = $this->_shortcode_parser->parse_message_template(
681
+						$templates[$field][$context],
682
+						$recipient,
683
+						$shortcodes,
684
+						$this->_current_message_type,
685
+						$this->_current_messenger,
686
+						$message
687
+					);
688
+					$message->set_field_or_extra_meta($column_name, $content);
689
+				} catch (EE_Error $e) {
690
+					$error_msg[] = sprintf(
691
+						esc_html__(
692
+							'There was a problem generating the content for the field %s: %s',
693
+							'event_espresso'
694
+						),
695
+						$field,
696
+						$e->getMessage()
697
+					);
698
+					$message->set_STS_ID(EEM_Message::status_failed);
699
+				}
700
+			}
701
+		}
702
+
703
+		if ($message->STS_ID() === EEM_Message::status_failed) {
704
+			$error_msg = esc_html__('There were problems generating this message:', 'event_espresso')
705
+						 . "\n"
706
+						 . implode("\n", $error_msg);
707
+			$message->set_error_message($error_msg);
708
+		} else {
709
+			$message->set_STS_ID(EEM_Message::status_idle);
710
+		}
711
+		return $message;
712
+	}
713
+
714
+
715
+	/**
716
+	 * This verifies that the incoming array has a EE_messenger object and a EE_message_type object and sets appropriate
717
+	 * error message if either is missing.
718
+	 *
719
+	 * @return bool         true means there were no errors, false means there were errors.
720
+	 */
721
+	protected function _verify()
722
+	{
723
+		//reset error message to an empty array.
724
+		$this->_error_msg = array();
725
+		$valid            = true;
726
+		$valid            = $valid ? $this->_validate_messenger_and_message_type() : $valid;
727
+		$valid            = $valid ? $this->_validate_and_setup_data() : $valid;
728
+
729
+		//set the verified flag so we know everything has been validated.
730
+		$this->_verified = $valid;
731
+
732
+		return $valid;
733
+	}
734
+
735
+
736
+	/**
737
+	 * This accepts an array and validates that it is an array indexed by context with each value being an array of
738
+	 * EE_Messages_Addressee objects.
739
+	 *
740
+	 * @param array $addressees Keys correspond to contexts for the message type and values are EE_Messages_Addressee[]
741
+	 * @return bool
742
+	 */
743
+	protected function _valid_addressees($addressees)
744
+	{
745
+		if (! $addressees || ! is_array($addressees)) {
746
+			return false;
747
+		}
748
+
749
+		foreach ($addressees as $addressee_array) {
750
+			foreach ($addressee_array as $addressee) {
751
+				if (! $addressee instanceof EE_Messages_Addressee) {
752
+					return false;
753
+				}
754
+			}
755
+		}
756
+		return true;
757
+	}
758
+
759
+
760
+	/**
761
+	 * This validates the messenger, message type, and presences of generation data for the current EE_Message in the
762
+	 * queue. This process sets error messages if something is wrong.
763
+	 *
764
+	 * @return bool   true is if there are no errors.  false is if there is.
765
+	 */
766
+	protected function _validate_messenger_and_message_type()
767
+	{
768
+
769
+		//first are there any existing error messages?  If so then return.
770
+		if ($this->_error_msg) {
771
+			return false;
772
+		}
773
+		/** @type EE_Message $message */
774
+		$message = $this->_generation_queue->get_message_repository()->current();
775
+		try {
776
+			$this->_current_messenger = $message->valid_messenger(true)
777
+				? $message->messenger_object()
778
+				: null;
779
+		} catch (Exception $e) {
780
+			$this->_error_msg[] = $e->getMessage();
781
+		}
782
+		try {
783
+			$this->_current_message_type = $message->valid_message_type(true)
784
+				? $message->message_type_object()
785
+				: null;
786
+		} catch (Exception $e) {
787
+			$this->_error_msg[] = $e->getMessage();
788
+		}
789
+
790
+		/**
791
+		 * Check if there is any generation data, but only if this is not for a preview.
792
+		 */
793
+		if (! $this->_generation_queue->get_message_repository()->get_generation_data()
794
+			&& (
795
+				! $this->_generation_queue->get_message_repository()->is_preview()
796
+				&& $this->_generation_queue->get_message_repository()->get_data_handler()
797
+				   !== 'EE_Messages_Preview_incoming_data'
798
+			)
799
+		) {
800
+			$this->_error_msg[] = esc_html__(
801
+				'There is no generation data for this message. Unable to generate.',
802
+				'event_espresso'
803
+			);
804
+		}
805
+
806
+		return empty($this->_error_msg);
807
+	}
808
+
809
+
810
+	/**
811
+	 * This method retrieves the expected data handler for the message type and validates the generation data for that
812
+	 * data handler.
813
+	 *
814
+	 * @return bool true means there are no errors.  false means there were errors (and handler did not get setup).
815
+	 */
816
+	protected function _validate_and_setup_data()
817
+	{
818
+
819
+		//First, are there any existing error messages?  If so, return because if there were errors elsewhere this can't
820
+		//be used anyways.
821
+		if ($this->_error_msg) {
822
+			return false;
823
+		}
824
+
825
+		$generation_data = $this->_generation_queue->get_message_repository()->get_generation_data();
826
+
827
+		/** @type EE_Messages_incoming_data $data_handler_class_name - well not really... just the class name actually */
828
+		$data_handler_class_name = $this->_generation_queue->get_message_repository()->get_data_handler()
829
+			? $this->_generation_queue->get_message_repository()->get_data_handler()
830
+			: 'EE_Messages_' . $this->_current_message_type->get_data_handler($generation_data) . '_incoming_data';
831
+
832
+		//If this EE_Message is for a preview, then let's switch out to the preview data handler.
833
+		if ($this->_generation_queue->get_message_repository()->is_preview()) {
834
+			$data_handler_class_name = 'EE_Messages_Preview_incoming_data';
835
+		}
836
+
837
+		//First get the class name for the data handler (and also verifies it exists.
838
+		if (! class_exists($data_handler_class_name)) {
839
+			$this->_error_msg[] = sprintf(
840
+				esc_html__(
841
+					'The included data handler class name does not match any valid, accessible, "%1$s" classes.  Looking for %2$s.',
842
+					'event_espresso'
843
+				),
844
+				'EE_Messages_incoming_data',
845
+				$data_handler_class_name
846
+			);
847
+			return false;
848
+		}
849
+
850
+		//convert generation_data for data_handler_instantiation.
851
+		$generation_data = $data_handler_class_name::convert_data_from_persistent_storage($generation_data);
852
+
853
+		//note, this may set error messages as well.
854
+		$this->_set_data_handler($generation_data, $data_handler_class_name);
855
+
856
+		return empty($this->_error_msg);
857
+	}
858
+
859
+
860
+	/**
861
+	 * Sets the $_current_data_handler property that is used for generating the current EE_Message in the queue, and
862
+	 * adds it to the _data repository.
863
+	 *
864
+	 * @param mixed  $generating_data           This is data expected by the instantiated data handler.
865
+	 * @param string $data_handler_class_name   This is the reference string indicating what data handler is being
866
+	 *                                          instantiated.
867
+	 * @return void .
868
+	 * @throws EE_Error
869
+	 * @throws ReflectionException
870
+	 */
871
+	protected function _set_data_handler($generating_data, $data_handler_class_name)
872
+	{
873
+		//valid classname for the data handler.  Now let's setup the key for the data handler repository to see if there
874
+		//is already a ready data handler in the repository.
875
+		$this->_current_data_handler = $this->_data_handler_collection->get_by_key(
876
+			$this->_data_handler_collection->get_key(
877
+				$data_handler_class_name,
878
+				$generating_data
879
+			)
880
+		);
881
+		if (! $this->_current_data_handler instanceof EE_Messages_incoming_data) {
882
+			//no saved data_handler in the repo so let's set one up and add it to the repo.
883
+			try {
884
+				$this->_current_data_handler = new $data_handler_class_name($generating_data);
885
+				$this->_data_handler_collection->add($this->_current_data_handler, $generating_data);
886
+			} catch (EE_Error $e) {
887
+				$this->_error_msg[] = $e->get_error();
888
+			}
889
+		}
890
+	}
891
+
892
+
893
+	/**
894
+	 * The queued EE_Message for generation does not save the data used for generation as objects
895
+	 * because serialization of those objects could be problematic if the data is saved to the db.
896
+	 * So this method calls the static method on the associated data_handler for the given message_type
897
+	 * and that preps the data for later instantiation when generating.
898
+	 *
899
+	 * @param EE_Message_To_Generate $message_to_generate
900
+	 * @param bool                   $preview Indicate whether this is being used for a preview or not.
901
+	 * @return mixed Prepped data for persisting to the queue.  false is returned if unable to prep data.
902
+	 */
903
+	protected function _prepare_data_for_queue(EE_Message_To_Generate $message_to_generate, $preview)
904
+	{
905
+		/** @type EE_Messages_incoming_data $data_handler - well not really... just the class name actually */
906
+		$data_handler = $message_to_generate->get_data_handler_class_name($preview);
907
+		if (! $message_to_generate->valid()) {
908
+			return false; //unable to get the data because the info in the EE_Message_To_Generate class is invalid.
909
+		}
910
+		return $data_handler::convert_data_for_persistent_storage($message_to_generate->data());
911
+	}
912
+
913
+
914
+	/**
915
+	 * This sets up a EEM_Message::status_incomplete EE_Message object and adds it to the generation queue.
916
+	 *
917
+	 * @param EE_Message_To_Generate $message_to_generate
918
+	 * @param bool                   $test_send Whether this is just a test send or not.  Typically used for previews.
919
+	 */
920
+	public function create_and_add_message_to_queue(EE_Message_To_Generate $message_to_generate, $test_send = false)
921
+	{
922
+		//prep data
923
+		$data = $this->_prepare_data_for_queue($message_to_generate, $message_to_generate->preview());
924
+
925
+		$message = $message_to_generate->get_EE_Message();
926
+
927
+		//is there a GRP_ID in the request?
928
+		if ($GRP_ID = EE_Registry::instance()->REQ->get('GRP_ID')) {
929
+			$message->set_GRP_ID($GRP_ID);
930
+		}
931
+
932
+		if ($data === false) {
933
+			$message->set_STS_ID(EEM_Message::status_failed);
934
+			$message->set_error_message(
935
+				esc_html__(
936
+					'Unable to prepare data for persistence to the database.',
937
+					'event_espresso'
938
+				)
939
+			);
940
+		} else {
941
+			//make sure that the data handler is cached on the message as well
942
+			$data['data_handler_class_name'] = $message_to_generate->get_data_handler_class_name();
943
+		}
944
+
945
+		$this->_generation_queue->add($message, $data, $message_to_generate->preview(), $test_send);
946
+	}
947 947
 }
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -254,7 +254,7 @@  discard block
 block discarded – undo
254 254
     {
255 255
         //double check verification has run and that everything is ready to work with (saves us having to validate
256 256
         // everything again).
257
-        if (! $this->_verified) {
257
+        if ( ! $this->_verified) {
258 258
             return false; //get out because we don't have a valid setup to work with.
259 259
         }
260 260
 
@@ -271,7 +271,7 @@  discard block
 block discarded – undo
271 271
 
272 272
 
273 273
         //if no addressees then get out because there is nothing to generation (possible bad data).
274
-        if (! $this->_valid_addressees($addressees)) {
274
+        if ( ! $this->_valid_addressees($addressees)) {
275 275
             do_action(
276 276
                 'AHEE__EE_Messages_Generator___generate__invalid_addressees',
277 277
                 $this->_generation_queue->get_message_repository()->current(),
@@ -293,7 +293,7 @@  discard block
 block discarded – undo
293 293
         $message_template_group = $this->_get_message_template_group();
294 294
 
295 295
         //in the unlikely event there is no EE_Message_Template_Group available, get out!
296
-        if (! $message_template_group instanceof EE_Message_Template_Group) {
296
+        if ( ! $message_template_group instanceof EE_Message_Template_Group) {
297 297
             $this->_error_msg[] = esc_html__(
298 298
                 'Unable to get the Message Templates for the Message being generated.  No message template group accessible.',
299 299
                 'event_espresso'
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
             //attempt to retrieve from repo first
396 396
             $message_template_group = $this->_template_collection->get_by_ID($GRP_ID);
397 397
             if ($message_template_group instanceof EE_Message_Template_Group) {
398
-                return $message_template_group;  //got it!
398
+                return $message_template_group; //got it!
399 399
             }
400 400
 
401 401
             //nope don't have it yet.  Get from DB then add to repo if its not here, then that means the current GRP_ID
@@ -491,7 +491,7 @@  discard block
 block discarded – undo
491 491
         );
492 492
 
493 493
         //if we don't have a group lets hit the db.
494
-        if (! $global_message_template_group instanceof EE_Message_Template_Group) {
494
+        if ( ! $global_message_template_group instanceof EE_Message_Template_Group) {
495 495
             $global_message_template_group = EEM_Message_Template_Group::instance()->get_one(
496 496
                 array(
497 497
                     array(
@@ -548,7 +548,7 @@  discard block
 block discarded – undo
548 548
         $context_templates = $message_template_group->context_templates();
549 549
         foreach ($context_templates as $context => $template_fields) {
550 550
             foreach ($template_fields as $template_field => $template_obj) {
551
-                if (! $template_obj instanceof EE_Message_Template) {
551
+                if ( ! $template_obj instanceof EE_Message_Template) {
552 552
                     continue;
553 553
                 }
554 554
                 $templates[$template_field][$context] = $template_obj->get('MTP_content');
@@ -576,7 +576,7 @@  discard block
 block discarded – undo
576 576
     {
577 577
 
578 578
         //if templates are empty then get out because we can't generate anything.
579
-        if (! $templates) {
579
+        if ( ! $templates) {
580 580
             $this->_error_msg[] = esc_html__(
581 581
                 'Unable to assemble messages because there are no templates retrieved for generating the messages with',
582 582
                 'event_espresso'
@@ -675,7 +675,7 @@  discard block
 block discarded – undo
675 675
             $shortcodes = isset($m_shortcodes[$field]) ? $m_shortcodes[$field] : $valid_shortcodes;
676 676
             if (isset($templates[$field][$context])) {
677 677
                 //prefix field.
678
-                $column_name = 'MSG_' . $field;
678
+                $column_name = 'MSG_'.$field;
679 679
                 try {
680 680
                     $content = $this->_shortcode_parser->parse_message_template(
681 681
                         $templates[$field][$context],
@@ -742,13 +742,13 @@  discard block
 block discarded – undo
742 742
      */
743 743
     protected function _valid_addressees($addressees)
744 744
     {
745
-        if (! $addressees || ! is_array($addressees)) {
745
+        if ( ! $addressees || ! is_array($addressees)) {
746 746
             return false;
747 747
         }
748 748
 
749 749
         foreach ($addressees as $addressee_array) {
750 750
             foreach ($addressee_array as $addressee) {
751
-                if (! $addressee instanceof EE_Messages_Addressee) {
751
+                if ( ! $addressee instanceof EE_Messages_Addressee) {
752 752
                     return false;
753 753
                 }
754 754
             }
@@ -790,7 +790,7 @@  discard block
 block discarded – undo
790 790
         /**
791 791
          * Check if there is any generation data, but only if this is not for a preview.
792 792
          */
793
-        if (! $this->_generation_queue->get_message_repository()->get_generation_data()
793
+        if ( ! $this->_generation_queue->get_message_repository()->get_generation_data()
794 794
             && (
795 795
                 ! $this->_generation_queue->get_message_repository()->is_preview()
796 796
                 && $this->_generation_queue->get_message_repository()->get_data_handler()
@@ -827,7 +827,7 @@  discard block
 block discarded – undo
827 827
         /** @type EE_Messages_incoming_data $data_handler_class_name - well not really... just the class name actually */
828 828
         $data_handler_class_name = $this->_generation_queue->get_message_repository()->get_data_handler()
829 829
             ? $this->_generation_queue->get_message_repository()->get_data_handler()
830
-            : 'EE_Messages_' . $this->_current_message_type->get_data_handler($generation_data) . '_incoming_data';
830
+            : 'EE_Messages_'.$this->_current_message_type->get_data_handler($generation_data).'_incoming_data';
831 831
 
832 832
         //If this EE_Message is for a preview, then let's switch out to the preview data handler.
833 833
         if ($this->_generation_queue->get_message_repository()->is_preview()) {
@@ -835,7 +835,7 @@  discard block
 block discarded – undo
835 835
         }
836 836
 
837 837
         //First get the class name for the data handler (and also verifies it exists.
838
-        if (! class_exists($data_handler_class_name)) {
838
+        if ( ! class_exists($data_handler_class_name)) {
839 839
             $this->_error_msg[] = sprintf(
840 840
                 esc_html__(
841 841
                     'The included data handler class name does not match any valid, accessible, "%1$s" classes.  Looking for %2$s.',
@@ -878,7 +878,7 @@  discard block
 block discarded – undo
878 878
                 $generating_data
879 879
             )
880 880
         );
881
-        if (! $this->_current_data_handler instanceof EE_Messages_incoming_data) {
881
+        if ( ! $this->_current_data_handler instanceof EE_Messages_incoming_data) {
882 882
             //no saved data_handler in the repo so let's set one up and add it to the repo.
883 883
             try {
884 884
                 $this->_current_data_handler = new $data_handler_class_name($generating_data);
@@ -904,7 +904,7 @@  discard block
 block discarded – undo
904 904
     {
905 905
         /** @type EE_Messages_incoming_data $data_handler - well not really... just the class name actually */
906 906
         $data_handler = $message_to_generate->get_data_handler_class_name($preview);
907
-        if (! $message_to_generate->valid()) {
907
+        if ( ! $message_to_generate->valid()) {
908 908
             return false; //unable to get the data because the info in the EE_Message_To_Generate class is invalid.
909 909
         }
910 910
         return $data_handler::convert_data_for_persistent_storage($message_to_generate->data());
Please login to merge, or discard this patch.