Completed
Pull Request — master (#782)
by Darren
10:59
created
admin_pages/messages/Messages_Admin_Page.core.php 1 patch
Indentation   +4484 added lines, -4484 removed lines patch added patch discarded remove patch
@@ -19,2588 +19,2588 @@  discard block
 block discarded – undo
19 19
 class Messages_Admin_Page extends EE_Admin_Page
20 20
 {
21 21
 
22
-    /**
23
-     * @type EE_Message_Resource_Manager $_message_resource_manager
24
-     */
25
-    protected $_message_resource_manager;
26
-
27
-    /**
28
-     * @type string $_active_message_type_name
29
-     */
30
-    protected $_active_message_type_name = '';
31
-
32
-    /**
33
-     * @type EE_messenger $_active_messenger
34
-     */
35
-    protected $_active_messenger;
36
-    protected $_activate_state;
37
-    protected $_activate_meta_box_type;
38
-    protected $_current_message_meta_box;
39
-    protected $_current_message_meta_box_object;
40
-    protected $_context_switcher;
41
-    protected $_shortcodes = array();
42
-    protected $_active_messengers = array();
43
-    protected $_active_message_types = array();
44
-
45
-    /**
46
-     * @var EE_Message_Template_Group $_message_template_group
47
-     */
48
-    protected $_message_template_group;
49
-    protected $_m_mt_settings = array();
50
-
51
-
52
-    /**
53
-     * This is set via the _set_message_template_group method and holds whatever the template pack for the group is.
54
-     * IF there is no group then it gets automatically set to the Default template pack.
55
-     *
56
-     * @since 4.5.0
57
-     *
58
-     * @var EE_Messages_Template_Pack
59
-     */
60
-    protected $_template_pack;
61
-
62
-
63
-    /**
64
-     * This is set via the _set_message_template_group method and holds whatever the template pack variation for the
65
-     * group is.  If there is no group then it automatically gets set to default.
66
-     *
67
-     * @since 4.5.0
68
-     *
69
-     * @var string
70
-     */
71
-    protected $_variation;
72
-
73
-
74
-    /**
75
-     * @param bool $routing
76
-     * @throws EE_Error
77
-     */
78
-    public function __construct($routing = true)
79
-    {
80
-        // make sure messages autoloader is running
81
-        EED_Messages::set_autoloaders();
82
-        parent::__construct($routing);
83
-    }
84
-
85
-
86
-    protected function _init_page_props()
87
-    {
88
-        $this->page_slug = EE_MSG_PG_SLUG;
89
-        $this->page_label = esc_html__('Messages Settings', 'event_espresso');
90
-        $this->_admin_base_url = EE_MSG_ADMIN_URL;
91
-        $this->_admin_base_path = EE_MSG_ADMIN;
92
-
93
-        $this->_activate_state = isset($this->_req_data['activate_state']) ? (array) $this->_req_data['activate_state']
94
-            : array();
95
-
96
-        $this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
97
-        $this->_load_message_resource_manager();
98
-    }
99
-
100
-
101
-    /**
102
-     * loads messenger objects into the $_active_messengers property (so we can access the needed methods)
103
-     *
104
-     * @throws EE_Error
105
-     * @throws InvalidDataTypeException
106
-     * @throws InvalidInterfaceException
107
-     * @throws InvalidArgumentException
108
-     * @throws ReflectionException
109
-     */
110
-    protected function _load_message_resource_manager()
111
-    {
112
-        $this->_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
113
-    }
114
-
115
-
116
-    /**
117
-     * @deprecated 4.9.9.rc.014
118
-     * @return array
119
-     * @throws EE_Error
120
-     * @throws InvalidArgumentException
121
-     * @throws InvalidDataTypeException
122
-     * @throws InvalidInterfaceException
123
-     */
124
-    public function get_messengers_for_list_table()
125
-    {
126
-        EE_Error::doing_it_wrong(
127
-            __METHOD__,
128
-            sprintf(
129
-                esc_html__(
130
-                    'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a messenger filter dropdown which is now generated differently via %s',
131
-                    'event_espresso'
132
-                ),
133
-                'Messages_Admin_Page::get_messengers_select_input()'
134
-            ),
135
-            '4.9.9.rc.014'
136
-        );
137
-
138
-        $m_values = array();
139
-        $active_messengers = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
140
-        // setup messengers for selects
141
-        $i = 1;
142
-        foreach ($active_messengers as $active_messenger) {
143
-            if ($active_messenger instanceof EE_Message) {
144
-                $m_values[ $i ]['id'] = $active_messenger->messenger();
145
-                $m_values[ $i ]['text'] = ucwords($active_messenger->messenger_label());
146
-                $i++;
147
-            }
148
-        }
149
-
150
-        return $m_values;
151
-    }
152
-
153
-
154
-    /**
155
-     * @deprecated 4.9.9.rc.014
156
-     * @return array
157
-     * @throws EE_Error
158
-     * @throws InvalidArgumentException
159
-     * @throws InvalidDataTypeException
160
-     * @throws InvalidInterfaceException
161
-     */
162
-    public function get_message_types_for_list_table()
163
-    {
164
-        EE_Error::doing_it_wrong(
165
-            __METHOD__,
166
-            sprintf(
167
-                esc_html__(
168
-                    'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type filter dropdown which is now generated differently via %s',
169
-                    'event_espresso'
170
-                ),
171
-                'Messages_Admin_Page::get_message_types_select_input()'
172
-            ),
173
-            '4.9.9.rc.014'
174
-        );
175
-
176
-        $mt_values = array();
177
-        $active_messages = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
178
-        $i = 1;
179
-        foreach ($active_messages as $active_message) {
180
-            if ($active_message instanceof EE_Message) {
181
-                $mt_values[ $i ]['id'] = $active_message->message_type();
182
-                $mt_values[ $i ]['text'] = ucwords($active_message->message_type_label());
183
-                $i++;
184
-            }
185
-        }
186
-
187
-        return $mt_values;
188
-    }
189
-
190
-
191
-    /**
192
-     * @deprecated 4.9.9.rc.014
193
-     * @return array
194
-     * @throws EE_Error
195
-     * @throws InvalidArgumentException
196
-     * @throws InvalidDataTypeException
197
-     * @throws InvalidInterfaceException
198
-     */
199
-    public function get_contexts_for_message_types_for_list_table()
200
-    {
201
-        EE_Error::doing_it_wrong(
202
-            __METHOD__,
203
-            sprintf(
204
-                esc_html__(
205
-                    'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type context filter dropdown which is now generated differently via %s',
206
-                    'event_espresso'
207
-                ),
208
-                'Messages_Admin_Page::get_contexts_for_message_types_select_input()'
209
-            ),
210
-            '4.9.9.rc.014'
211
-        );
212
-
213
-        $contexts = array();
214
-        $active_message_contexts = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
215
-        foreach ($active_message_contexts as $active_message) {
216
-            if ($active_message instanceof EE_Message) {
217
-                $message_type = $active_message->message_type_object();
218
-                if ($message_type instanceof EE_message_type) {
219
-                    $message_type_contexts = $message_type->get_contexts();
220
-                    foreach ($message_type_contexts as $context => $context_details) {
221
-                        $contexts[ $context ] = $context_details['label'];
222
-                    }
223
-                }
224
-            }
225
-        }
226
-
227
-        return $contexts;
228
-    }
229
-
230
-
231
-    /**
232
-     * Generate select input with provided messenger options array.
233
-     *
234
-     * @param array $messenger_options Array of messengers indexed by messenger slug and values are the messenger
235
-     *                                 labels.
236
-     * @return string
237
-     * @throws EE_Error
238
-     */
239
-    public function get_messengers_select_input($messenger_options)
240
-    {
241
-        // if empty or just one value then just return an empty string
242
-        if (empty($messenger_options)
243
-            || ! is_array($messenger_options)
244
-            || count($messenger_options) === 1
245
-        ) {
246
-            return '';
247
-        }
248
-        // merge in default
249
-        $messenger_options = array_merge(
250
-            array('none_selected' => esc_html__('Show All Messengers', 'event_espresso')),
251
-            $messenger_options
252
-        );
253
-        $input = new EE_Select_Input(
254
-            $messenger_options,
255
-            array(
256
-                'html_name'  => 'ee_messenger_filter_by',
257
-                'html_id'    => 'ee_messenger_filter_by',
258
-                'html_class' => 'wide',
259
-                'default'    => isset($this->_req_data['ee_messenger_filter_by'])
260
-                    ? sanitize_title($this->_req_data['ee_messenger_filter_by'])
261
-                    : 'none_selected',
262
-            )
263
-        );
264
-
265
-        return $input->get_html_for_input();
266
-    }
267
-
268
-
269
-    /**
270
-     * Generate select input with provided message type options array.
271
-     *
272
-     * @param array $message_type_options Array of message types indexed by message type slug, and values are the
273
-     *                                    message type labels
274
-     * @return string
275
-     * @throws EE_Error
276
-     */
277
-    public function get_message_types_select_input($message_type_options)
278
-    {
279
-        // if empty or count of options is 1 then just return an empty string
280
-        if (empty($message_type_options)
281
-            || ! is_array($message_type_options)
282
-            || count($message_type_options) === 1
283
-        ) {
284
-            return '';
285
-        }
286
-        // merge in default
287
-        $message_type_options = array_merge(
288
-            array('none_selected' => esc_html__('Show All Message Types', 'event_espresso')),
289
-            $message_type_options
290
-        );
291
-        $input = new EE_Select_Input(
292
-            $message_type_options,
293
-            array(
294
-                'html_name'  => 'ee_message_type_filter_by',
295
-                'html_id'    => 'ee_message_type_filter_by',
296
-                'html_class' => 'wide',
297
-                'default'    => isset($this->_req_data['ee_message_type_filter_by'])
298
-                    ? sanitize_title($this->_req_data['ee_message_type_filter_by'])
299
-                    : 'none_selected',
300
-            )
301
-        );
302
-
303
-        return $input->get_html_for_input();
304
-    }
305
-
306
-
307
-    /**
308
-     * Generate select input with provide message type contexts array.
309
-     *
310
-     * @param array $context_options Array of message type contexts indexed by context slug, and values are the
311
-     *                               context label.
312
-     * @return string
313
-     * @throws EE_Error
314
-     */
315
-    public function get_contexts_for_message_types_select_input($context_options)
316
-    {
317
-        // if empty or count of options is one then just return empty string
318
-        if (empty($context_options)
319
-            || ! is_array($context_options)
320
-            || count($context_options) === 1
321
-        ) {
322
-            return '';
323
-        }
324
-        // merge in default
325
-        $context_options = array_merge(
326
-            array('none_selected' => esc_html__('Show all Contexts', 'event_espresso')),
327
-            $context_options
328
-        );
329
-        $input = new EE_Select_Input(
330
-            $context_options,
331
-            array(
332
-                'html_name'  => 'ee_context_filter_by',
333
-                'html_id'    => 'ee_context_filter_by',
334
-                'html_class' => 'wide',
335
-                'default'    => isset($this->_req_data['ee_context_filter_by'])
336
-                    ? sanitize_title($this->_req_data['ee_context_filter_by'])
337
-                    : 'none_selected',
338
-            )
339
-        );
340
-
341
-        return $input->get_html_for_input();
342
-    }
343
-
344
-
345
-    protected function _ajax_hooks()
346
-    {
347
-        add_action('wp_ajax_activate_messenger', array($this, 'activate_messenger_toggle'));
348
-        add_action('wp_ajax_activate_mt', array($this, 'activate_mt_toggle'));
349
-        add_action('wp_ajax_ee_msgs_save_settings', array($this, 'save_settings'));
350
-        add_action('wp_ajax_ee_msgs_update_mt_form', array($this, 'update_mt_form'));
351
-        add_action('wp_ajax_switch_template_pack', array($this, 'switch_template_pack'));
352
-        add_action('wp_ajax_toggle_context_template', array($this, 'toggle_context_template'));
353
-    }
354
-
355
-
356
-    protected function _define_page_props()
357
-    {
358
-        $this->_admin_page_title = $this->page_label;
359
-        $this->_labels = array(
360
-            'buttons'    => array(
361
-                'add'    => esc_html__('Add New Message Template', 'event_espresso'),
362
-                'edit'   => esc_html__('Edit Message Template', 'event_espresso'),
363
-                'delete' => esc_html__('Delete Message Template', 'event_espresso'),
364
-            ),
365
-            'publishbox' => esc_html__('Update Actions', 'event_espresso'),
366
-        );
367
-    }
368
-
369
-
370
-    /**
371
-     *        an array for storing key => value pairs of request actions and their corresponding methods
372
-     *
373
-     * @access protected
374
-     * @return void
375
-     */
376
-    protected function _set_page_routes()
377
-    {
378
-        $grp_id = ! empty($this->_req_data['GRP_ID']) && ! is_array($this->_req_data['GRP_ID'])
379
-            ? $this->_req_data['GRP_ID']
380
-            : 0;
381
-        $grp_id = empty($grp_id) && ! empty($this->_req_data['id'])
382
-            ? $this->_req_data['id']
383
-            : $grp_id;
384
-        $msg_id = ! empty($this->_req_data['MSG_ID']) && ! is_array($this->_req_data['MSG_ID'])
385
-            ? $this->_req_data['MSG_ID']
386
-            : 0;
387
-
388
-        $this->_page_routes = array(
389
-            'default'                          => array(
390
-                'func'       => '_message_queue_list_table',
391
-                'capability' => 'ee_read_global_messages',
392
-            ),
393
-            'global_mtps'                      => array(
394
-                'func'       => '_ee_default_messages_overview_list_table',
395
-                'capability' => 'ee_read_global_messages',
396
-            ),
397
-            'custom_mtps'                      => array(
398
-                'func'       => '_custom_mtps_preview',
399
-                'capability' => 'ee_read_messages',
400
-            ),
401
-            'add_new_message_template'         => array(
402
-                'func'       => '_add_message_template',
403
-                'capability' => 'ee_edit_messages',
404
-                'noheader'   => true,
405
-            ),
406
-            'edit_message_template'            => array(
407
-                'func'       => '_edit_message_template',
408
-                'capability' => 'ee_edit_message',
409
-                'obj_id'     => $grp_id,
410
-            ),
411
-            'preview_message'                  => array(
412
-                'func'               => '_preview_message',
413
-                'capability'         => 'ee_read_message',
414
-                'obj_id'             => $grp_id,
415
-                'noheader'           => true,
416
-                'headers_sent_route' => 'display_preview_message',
417
-            ),
418
-            'display_preview_message'          => array(
419
-                'func'       => '_display_preview_message',
420
-                'capability' => 'ee_read_message',
421
-                'obj_id'     => $grp_id,
422
-            ),
423
-            'insert_message_template'          => array(
424
-                'func'       => '_insert_or_update_message_template',
425
-                'capability' => 'ee_edit_messages',
426
-                'args'       => array('new_template' => true),
427
-                'noheader'   => true,
428
-            ),
429
-            'update_message_template'          => array(
430
-                'func'       => '_insert_or_update_message_template',
431
-                'capability' => 'ee_edit_message',
432
-                'obj_id'     => $grp_id,
433
-                'args'       => array('new_template' => false),
434
-                'noheader'   => true,
435
-            ),
436
-            'trash_message_template'           => array(
437
-                'func'       => '_trash_or_restore_message_template',
438
-                'capability' => 'ee_delete_message',
439
-                'obj_id'     => $grp_id,
440
-                'args'       => array('trash' => true, 'all' => true),
441
-                'noheader'   => true,
442
-            ),
443
-            'trash_message_template_context'   => array(
444
-                'func'       => '_trash_or_restore_message_template',
445
-                'capability' => 'ee_delete_message',
446
-                'obj_id'     => $grp_id,
447
-                'args'       => array('trash' => true),
448
-                'noheader'   => true,
449
-            ),
450
-            'restore_message_template'         => array(
451
-                'func'       => '_trash_or_restore_message_template',
452
-                'capability' => 'ee_delete_message',
453
-                'obj_id'     => $grp_id,
454
-                'args'       => array('trash' => false, 'all' => true),
455
-                'noheader'   => true,
456
-            ),
457
-            'restore_message_template_context' => array(
458
-                'func'       => '_trash_or_restore_message_template',
459
-                'capability' => 'ee_delete_message',
460
-                'obj_id'     => $grp_id,
461
-                'args'       => array('trash' => false),
462
-                'noheader'   => true,
463
-            ),
464
-            'delete_message_template'          => array(
465
-                'func'       => '_delete_message_template',
466
-                'capability' => 'ee_delete_message',
467
-                'obj_id'     => $grp_id,
468
-                'noheader'   => true,
469
-            ),
470
-            'reset_to_default'                 => array(
471
-                'func'       => '_reset_to_default_template',
472
-                'capability' => 'ee_edit_message',
473
-                'obj_id'     => $grp_id,
474
-                'noheader'   => true,
475
-            ),
476
-            'settings'                         => array(
477
-                'func'       => '_settings',
478
-                'capability' => 'manage_options',
479
-            ),
480
-            'update_global_settings'           => array(
481
-                'func'       => '_update_global_settings',
482
-                'capability' => 'manage_options',
483
-                'noheader'   => true,
484
-            ),
485
-            'generate_now'                     => array(
486
-                'func'       => '_generate_now',
487
-                'capability' => 'ee_send_message',
488
-                'noheader'   => true,
489
-            ),
490
-            'generate_and_send_now'            => array(
491
-                'func'       => '_generate_and_send_now',
492
-                'capability' => 'ee_send_message',
493
-                'noheader'   => true,
494
-            ),
495
-            'queue_for_resending'              => array(
496
-                'func'       => '_queue_for_resending',
497
-                'capability' => 'ee_send_message',
498
-                'noheader'   => true,
499
-            ),
500
-            'send_now'                         => array(
501
-                'func'       => '_send_now',
502
-                'capability' => 'ee_send_message',
503
-                'noheader'   => true,
504
-            ),
505
-            'delete_ee_message'                => array(
506
-                'func'       => '_delete_ee_messages',
507
-                'capability' => 'ee_delete_messages',
508
-                'noheader'   => true,
509
-            ),
510
-            'delete_ee_messages'               => array(
511
-                'func'       => '_delete_ee_messages',
512
-                'capability' => 'ee_delete_messages',
513
-                'noheader'   => true,
514
-                'obj_id'     => $msg_id,
515
-            ),
516
-        );
517
-    }
518
-
519
-
520
-    protected function _set_page_config()
521
-    {
522
-        $this->_page_config = array(
523
-            'default'                  => array(
524
-                'nav'           => array(
525
-                    'label' => esc_html__('Message Activity', 'event_espresso'),
526
-                    'order' => 10,
527
-                ),
528
-                'list_table'    => 'EE_Message_List_Table',
529
-                // 'qtips' => array( 'EE_Message_List_Table_Tips' ),
530
-                'require_nonce' => false,
531
-            ),
532
-            'global_mtps'              => array(
533
-                'nav'           => array(
534
-                    'label' => esc_html__('Default Message Templates', 'event_espresso'),
535
-                    'order' => 20,
536
-                ),
537
-                'list_table'    => 'Messages_Template_List_Table',
538
-                'help_tabs'     => array(
539
-                    'messages_overview_help_tab'                                => array(
540
-                        'title'    => esc_html__('Messages Overview', 'event_espresso'),
541
-                        'filename' => 'messages_overview',
542
-                    ),
543
-                    'messages_overview_messages_table_column_headings_help_tab' => array(
544
-                        'title'    => esc_html__('Messages Table Column Headings', 'event_espresso'),
545
-                        'filename' => 'messages_overview_table_column_headings',
546
-                    ),
547
-                    'messages_overview_messages_filters_help_tab'               => array(
548
-                        'title'    => esc_html__('Message Filters', 'event_espresso'),
549
-                        'filename' => 'messages_overview_filters',
550
-                    ),
551
-                    'messages_overview_messages_views_help_tab'                 => array(
552
-                        'title'    => esc_html__('Message Views', 'event_espresso'),
553
-                        'filename' => 'messages_overview_views',
554
-                    ),
555
-                    'message_overview_message_types_help_tab'                   => array(
556
-                        'title'    => esc_html__('Message Types', 'event_espresso'),
557
-                        'filename' => 'messages_overview_types',
558
-                    ),
559
-                    'messages_overview_messengers_help_tab'                     => array(
560
-                        'title'    => esc_html__('Messengers', 'event_espresso'),
561
-                        'filename' => 'messages_overview_messengers',
562
-                    ),
563
-                ),
564
-                'help_tour'     => array('Messages_Overview_Help_Tour'),
565
-                'require_nonce' => false,
566
-            ),
567
-            'custom_mtps'              => array(
568
-                'nav'           => array(
569
-                    'label' => esc_html__('Custom Message Templates', 'event_espresso'),
570
-                    'order' => 30,
571
-                ),
572
-                'help_tabs'     => array(),
573
-                'help_tour'     => array(),
574
-                'require_nonce' => false,
575
-            ),
576
-            'add_new_message_template' => array(
577
-                'nav'           => array(
578
-                    'label'      => esc_html__('Add New Message Templates', 'event_espresso'),
579
-                    'order'      => 5,
580
-                    'persistent' => false,
581
-                ),
582
-                'require_nonce' => false,
583
-            ),
584
-            'edit_message_template'    => array(
585
-                'labels'        => array(
586
-                    'buttons'    => array(
587
-                        'reset' => esc_html__('Reset Templates', 'event_espresso'),
588
-                    ),
589
-                    'publishbox' => esc_html__('Update Actions', 'event_espresso'),
590
-                ),
591
-                'nav'           => array(
592
-                    'label'      => esc_html__('Edit Message Templates', 'event_espresso'),
593
-                    'order'      => 5,
594
-                    'persistent' => false,
595
-                    'url'        => '',
596
-                ),
597
-                'metaboxes'     => array('_publish_post_box', '_register_edit_meta_boxes'),
598
-                'has_metaboxes' => true,
599
-                'help_tour'     => array('Message_Templates_Edit_Help_Tour'),
600
-                'help_tabs'     => array(
601
-                    'edit_message_template'            => array(
602
-                        'title'    => esc_html__('Message Template Editor', 'event_espresso'),
603
-                        'callback' => 'edit_message_template_help_tab',
604
-                    ),
605
-                    'message_templates_help_tab'       => array(
606
-                        'title'    => esc_html__('Message Templates', 'event_espresso'),
607
-                        'filename' => 'messages_templates',
608
-                    ),
609
-                    'message_template_shortcodes'      => array(
610
-                        'title'    => esc_html__('Message Shortcodes', 'event_espresso'),
611
-                        'callback' => 'message_template_shortcodes_help_tab',
612
-                    ),
613
-                    'message_preview_help_tab'         => array(
614
-                        'title'    => esc_html__('Message Preview', 'event_espresso'),
615
-                        'filename' => 'messages_preview',
616
-                    ),
617
-                    'messages_overview_other_help_tab' => array(
618
-                        'title'    => esc_html__('Messages Other', 'event_espresso'),
619
-                        'filename' => 'messages_overview_other',
620
-                    ),
621
-                ),
622
-                'require_nonce' => false,
623
-            ),
624
-            'display_preview_message'  => array(
625
-                'nav'           => array(
626
-                    'label'      => esc_html__('Message Preview', 'event_espresso'),
627
-                    'order'      => 5,
628
-                    'url'        => '',
629
-                    'persistent' => false,
630
-                ),
631
-                'help_tabs'     => array(
632
-                    'preview_message' => array(
633
-                        'title'    => esc_html__('About Previews', 'event_espresso'),
634
-                        'callback' => 'preview_message_help_tab',
635
-                    ),
636
-                ),
637
-                'require_nonce' => false,
638
-            ),
639
-            'settings'                 => array(
640
-                'nav'           => array(
641
-                    'label' => esc_html__('Settings', 'event_espresso'),
642
-                    'order' => 40,
643
-                ),
644
-                'metaboxes'     => array('_messages_settings_metaboxes'),
645
-                'help_tabs'     => array(
646
-                    'messages_settings_help_tab'               => array(
647
-                        'title'    => esc_html__('Messages Settings', 'event_espresso'),
648
-                        'filename' => 'messages_settings',
649
-                    ),
650
-                    'messages_settings_message_types_help_tab' => array(
651
-                        'title'    => esc_html__('Activating / Deactivating Message Types', 'event_espresso'),
652
-                        'filename' => 'messages_settings_message_types',
653
-                    ),
654
-                    'messages_settings_messengers_help_tab'    => array(
655
-                        'title'    => esc_html__('Activating / Deactivating Messengers', 'event_espresso'),
656
-                        'filename' => 'messages_settings_messengers',
657
-                    ),
658
-                ),
659
-                'help_tour'     => array('Messages_Settings_Help_Tour'),
660
-                'require_nonce' => false,
661
-            ),
662
-        );
663
-    }
664
-
665
-
666
-    protected function _add_screen_options()
667
-    {
668
-        // todo
669
-    }
670
-
671
-
672
-    protected function _add_screen_options_global_mtps()
673
-    {
674
-        /**
675
-         * Note: the reason for the value swap here on $this->_admin_page_title is because $this->_per_page_screen_options
676
-         * uses the $_admin_page_title property and we want different outputs in the different spots.
677
-         */
678
-        $page_title = $this->_admin_page_title;
679
-        $this->_admin_page_title = esc_html__('Global Message Templates', 'event_espresso');
680
-        $this->_per_page_screen_option();
681
-        $this->_admin_page_title = $page_title;
682
-    }
683
-
684
-
685
-    protected function _add_screen_options_default()
686
-    {
687
-        $this->_admin_page_title = esc_html__('Message Activity', 'event_espresso');
688
-        $this->_per_page_screen_option();
689
-    }
690
-
691
-
692
-    // none of the below group are currently used for Messages
693
-    protected function _add_feature_pointers()
694
-    {
695
-    }
696
-
697
-    public function admin_init()
698
-    {
699
-    }
700
-
701
-    public function admin_notices()
702
-    {
703
-    }
704
-
705
-    public function admin_footer_scripts()
706
-    {
707
-    }
708
-
709
-
710
-    public function messages_help_tab()
711
-    {
712
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
713
-    }
714
-
715
-
716
-    public function messengers_help_tab()
717
-    {
718
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
719
-    }
720
-
721
-
722
-    public function message_types_help_tab()
723
-    {
724
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
725
-    }
726
-
727
-
728
-    public function messages_overview_help_tab()
729
-    {
730
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
731
-    }
732
-
733
-
734
-    public function message_templates_help_tab()
735
-    {
736
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
737
-    }
738
-
739
-
740
-    public function edit_message_template_help_tab()
741
-    {
742
-        $args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="'
743
-                        . esc_attr__('Editor Title', 'event_espresso')
744
-                        . '" />';
745
-        $args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="'
746
-                        . esc_attr__('Context Switcher and Preview', 'event_espresso')
747
-                        . '" />';
748
-        $args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="'
749
-                        . esc_attr__('Message Template Form Fields', 'event_espresso')
750
-                        . '" />';
751
-        $args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="'
752
-                        . esc_attr__('Shortcodes Metabox', 'event_espresso')
753
-                        . '" />';
754
-        $args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="'
755
-                        . esc_attr__('Publish Metabox', 'event_espresso')
756
-                        . '" />';
757
-        EEH_Template::display_template(
758
-            EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_templates_editor_help_tab.template.php',
759
-            $args
760
-        );
761
-    }
762
-
763
-
764
-    public function message_template_shortcodes_help_tab()
765
-    {
766
-        $this->_set_shortcodes();
767
-        $args['shortcodes'] = $this->_shortcodes;
768
-        EEH_Template::display_template(
769
-            EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
770
-            $args
771
-        );
772
-    }
773
-
774
-
775
-    public function preview_message_help_tab()
776
-    {
777
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
778
-    }
779
-
780
-
781
-    public function settings_help_tab()
782
-    {
783
-        $args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png'
784
-                        . '" alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />';
785
-        $args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
786
-                        . '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />';
787
-        $args['img3'] = '<div class="switch">'
788
-                        . '<input class="ee-on-off-toggle ee-toggle-round-flat"'
789
-                        . ' type="checkbox" checked="checked">'
790
-                        . '<label for="ee-on-off-toggle-on"></label>'
791
-                        . '</div>';
792
-        $args['img4'] = '<div class="switch">'
793
-                        . '<input class="ee-on-off-toggle ee-toggle-round-flat"'
794
-                        . ' type="checkbox">'
795
-                        . '<label for="ee-on-off-toggle-on"></label>'
796
-                        . '</div>';
797
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
798
-    }
799
-
800
-
801
-    public function load_scripts_styles()
802
-    {
803
-        wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
804
-        wp_enqueue_style('espresso_ee_msg');
805
-
806
-        wp_register_script(
807
-            'ee-messages-settings',
808
-            EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
809
-            array('jquery-ui-droppable', 'ee-serialize-full-array'),
810
-            EVENT_ESPRESSO_VERSION,
811
-            true
812
-        );
813
-        wp_register_script(
814
-            'ee-msg-list-table-js',
815
-            EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
816
-            array('ee-dialog'),
817
-            EVENT_ESPRESSO_VERSION
818
-        );
819
-    }
820
-
821
-
822
-    public function load_scripts_styles_default()
823
-    {
824
-        wp_enqueue_script('ee-msg-list-table-js');
825
-    }
826
-
827
-
828
-    public function wp_editor_css($mce_css)
829
-    {
830
-        // if we're on the edit_message_template route
831
-        if ($this->_req_action === 'edit_message_template' && $this->_active_messenger instanceof EE_messenger) {
832
-            $message_type_name = $this->_active_message_type_name;
833
-
834
-            // we're going to REPLACE the existing mce css
835
-            // we need to get the css file location from the active messenger
836
-            $mce_css = $this->_active_messenger->get_variation(
837
-                $this->_template_pack,
838
-                $message_type_name,
839
-                true,
840
-                'wpeditor',
841
-                $this->_variation
842
-            );
843
-        }
844
-
845
-        return $mce_css;
846
-    }
847
-
848
-
849
-    public function load_scripts_styles_edit_message_template()
850
-    {
851
-
852
-        $this->_set_shortcodes();
853
-
854
-        EE_Registry::$i18n_js_strings['confirm_default_reset'] = sprintf(
855
-            esc_html__(
856
-                'Are you sure you want to reset the %s %s message templates?  Remember continuing will reset the templates for all contexts in this messenger and message type group.',
857
-                'event_espresso'
858
-            ),
859
-            $this->_message_template_group->messenger_obj()->label['singular'],
860
-            $this->_message_template_group->message_type_obj()->label['singular']
861
-        );
862
-        EE_Registry::$i18n_js_strings['confirm_switch_template_pack'] = esc_html__(
863
-            'Switching the template pack for a messages template will reset the content for the template so the new layout is loaded.  Any custom content in the existing template will be lost. Are you sure you wish to do this?',
864
-            'event_espresso'
865
-        );
866
-        EE_Registry::$i18n_js_strings['server_error'] = esc_html__(
867
-            'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
868
-            'event_espresso'
869
-        );
870
-
871
-        wp_register_script(
872
-            'ee_msgs_edit_js',
873
-            EE_MSG_ASSETS_URL . 'ee_message_editor.js',
874
-            array('jquery'),
875
-            EVENT_ESPRESSO_VERSION
876
-        );
877
-
878
-        wp_enqueue_script('ee_admin_js');
879
-        wp_enqueue_script('ee_msgs_edit_js');
880
-
881
-        // add in special css for tiny_mce
882
-        add_filter('mce_css', array($this, 'wp_editor_css'));
883
-    }
884
-
885
-
886
-    public function load_scripts_styles_display_preview_message()
887
-    {
888
-
889
-        $this->_set_message_template_group();
890
-
891
-        if (isset($this->_req_data['messenger'])) {
892
-            $this->_active_messenger = $this->_message_resource_manager->get_active_messenger(
893
-                $this->_req_data['messenger']
894
-            );
895
-        }
896
-
897
-        $message_type_name = isset($this->_req_data['message_type']) ? $this->_req_data['message_type'] : '';
898
-
899
-
900
-        wp_enqueue_style(
901
-            'espresso_preview_css',
902
-            $this->_active_messenger->get_variation(
903
-                $this->_template_pack,
904
-                $message_type_name,
905
-                true,
906
-                'preview',
907
-                $this->_variation
908
-            )
909
-        );
910
-    }
911
-
912
-
913
-    public function load_scripts_styles_settings()
914
-    {
915
-        wp_register_style(
916
-            'ee-message-settings',
917
-            EE_MSG_ASSETS_URL . 'ee_message_settings.css',
918
-            array(),
919
-            EVENT_ESPRESSO_VERSION
920
-        );
921
-        wp_enqueue_style('ee-text-links');
922
-        wp_enqueue_style('ee-message-settings');
923
-        wp_enqueue_script('ee-messages-settings');
924
-    }
925
-
926
-
927
-    /**
928
-     * set views array for List Table
929
-     */
930
-    public function _set_list_table_views_global_mtps()
931
-    {
932
-        $this->_views = array(
933
-            'in_use' => array(
934
-                'slug'  => 'in_use',
935
-                'label' => esc_html__('In Use', 'event_espresso'),
936
-                'count' => 0,
937
-            ),
938
-        );
939
-    }
940
-
941
-
942
-    /**
943
-     * Set views array for the Custom Template List Table
944
-     */
945
-    public function _set_list_table_views_custom_mtps()
946
-    {
947
-        $this->_set_list_table_views_global_mtps();
948
-        $this->_views['in_use']['bulk_action'] = array(
949
-            'trash_message_template' => esc_html__('Move to Trash', 'event_espresso'),
950
-        );
951
-    }
952
-
953
-
954
-    /**
955
-     * set views array for message queue list table
956
-     *
957
-     * @throws InvalidDataTypeException
958
-     * @throws InvalidInterfaceException
959
-     * @throws InvalidArgumentException
960
-     * @throws EE_Error
961
-     * @throws ReflectionException
962
-     */
963
-    public function _set_list_table_views_default()
964
-    {
965
-        EE_Registry::instance()->load_helper('Template');
966
-
967
-        $common_bulk_actions = EE_Registry::instance()->CAP->current_user_can(
968
-            'ee_send_message',
969
-            'message_list_table_bulk_actions'
970
-        )
971
-            ? array(
972
-                'generate_now'          => esc_html__('Generate Now', 'event_espresso'),
973
-                'generate_and_send_now' => esc_html__('Generate and Send Now', 'event_espresso'),
974
-                'queue_for_resending'   => esc_html__('Queue for Resending', 'event_espresso'),
975
-                'send_now'              => esc_html__('Send Now', 'event_espresso'),
976
-            )
977
-            : array();
978
-
979
-        $delete_bulk_action = EE_Registry::instance()->CAP->current_user_can(
980
-            'ee_delete_messages',
981
-            'message_list_table_bulk_actions'
982
-        )
983
-            ? array('delete_ee_messages' => esc_html__('Delete Messages', 'event_espresso'))
984
-            : array();
985
-
986
-
987
-        $this->_views = array(
988
-            'all' => array(
989
-                'slug'        => 'all',
990
-                'label'       => esc_html__('All', 'event_espresso'),
991
-                'count'       => 0,
992
-                'bulk_action' => array_merge($common_bulk_actions, $delete_bulk_action),
993
-            ),
994
-        );
995
-
996
-
997
-        foreach (EEM_Message::instance()->all_statuses() as $status) {
998
-            if ($status === EEM_Message::status_debug_only && ! EEM_Message::debug()) {
999
-                continue;
1000
-            }
1001
-            $status_bulk_actions = $common_bulk_actions;
1002
-            // unset bulk actions not applying to status
1003
-            if (! empty($status_bulk_actions)) {
1004
-                switch ($status) {
1005
-                    case EEM_Message::status_idle:
1006
-                    case EEM_Message::status_resend:
1007
-                        $status_bulk_actions['send_now'] = $common_bulk_actions['send_now'];
1008
-                        break;
1009
-
1010
-                    case EEM_Message::status_failed:
1011
-                    case EEM_Message::status_debug_only:
1012
-                    case EEM_Message::status_messenger_executing:
1013
-                        $status_bulk_actions = array();
1014
-                        break;
1015
-
1016
-                    case EEM_Message::status_incomplete:
1017
-                        unset($status_bulk_actions['queue_for_resending'], $status_bulk_actions['send_now']);
1018
-                        break;
1019
-
1020
-                    case EEM_Message::status_retry:
1021
-                    case EEM_Message::status_sent:
1022
-                        unset($status_bulk_actions['generate_now'], $status_bulk_actions['generate_and_send_now']);
1023
-                        break;
1024
-                }
1025
-            }
1026
-
1027
-            // skip adding messenger executing status to views because it will be included with the Failed view.
1028
-            if ($status === EEM_Message::status_messenger_executing) {
1029
-                continue;
1030
-            }
1031
-
1032
-            $this->_views[ strtolower($status) ] = array(
1033
-                'slug'        => strtolower($status),
1034
-                'label'       => EEH_Template::pretty_status($status, false, 'sentence'),
1035
-                'count'       => 0,
1036
-                'bulk_action' => array_merge($status_bulk_actions, $delete_bulk_action),
1037
-            );
1038
-        }
1039
-    }
1040
-
1041
-
1042
-    protected function _ee_default_messages_overview_list_table()
1043
-    {
1044
-        $this->_admin_page_title = esc_html__('Default Message Templates', 'event_espresso');
1045
-        $this->display_admin_list_table_page_with_no_sidebar();
1046
-    }
1047
-
1048
-
1049
-    protected function _message_queue_list_table()
1050
-    {
1051
-        $this->_search_btn_label = esc_html__('Message Activity', 'event_espresso');
1052
-        $this->_template_args['per_column'] = 6;
1053
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_message_legend_items());
1054
-        $this->_template_args['before_list_table'] = '<h3>'
1055
-                                                     . EEM_Message::instance()->get_pretty_label_for_results()
1056
-                                                     . '</h3>';
1057
-        $this->display_admin_list_table_page_with_no_sidebar();
1058
-    }
1059
-
1060
-
1061
-    protected function _message_legend_items()
1062
-    {
1063
-
1064
-        $action_css_classes = EEH_MSG_Template::get_message_action_icons();
1065
-        $action_items = array();
1066
-
1067
-        foreach ($action_css_classes as $action_item => $action_details) {
1068
-            if ($action_item === 'see_notifications_for') {
1069
-                continue;
1070
-            }
1071
-            $action_items[ $action_item ] = array(
1072
-                'class' => $action_details['css_class'],
1073
-                'desc'  => $action_details['label'],
1074
-            );
1075
-        }
1076
-
1077
-        /** @type array $status_items status legend setup */
1078
-        $status_items = array(
1079
-            'sent_status'                => array(
1080
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
1081
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence'),
1082
-            ),
1083
-            'idle_status'                => array(
1084
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
1085
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence'),
1086
-            ),
1087
-            'failed_status'              => array(
1088
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
1089
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence'),
1090
-            ),
1091
-            'messenger_executing_status' => array(
1092
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
1093
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence'),
1094
-            ),
1095
-            'resend_status'              => array(
1096
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
1097
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence'),
1098
-            ),
1099
-            'incomplete_status'          => array(
1100
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1101
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence'),
1102
-            ),
1103
-            'retry_status'               => array(
1104
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1105
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence'),
1106
-            ),
1107
-        );
1108
-        if (EEM_Message::debug()) {
1109
-            $status_items['debug_only_status'] = array(
1110
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1111
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence'),
1112
-            );
1113
-        }
1114
-
1115
-        return array_merge($action_items, $status_items);
1116
-    }
1117
-
1118
-
1119
-    protected function _custom_mtps_preview()
1120
-    {
1121
-        $this->_admin_page_title = esc_html__('Custom Message Templates (Preview)', 'event_espresso');
1122
-        $this->_template_args['preview_img'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png"'
1123
-                                               . ' alt="' . esc_attr__(
1124
-                                                   'Preview Custom Message Templates screenshot',
1125
-                                                   'event_espresso'
1126
-                                               ) . '" />';
1127
-        $this->_template_args['preview_text'] = '<strong>'
1128
-                                                . esc_html__(
1129
-                                                    'Custom Message Templates is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Custom Message Templates feature, you are able to create custom message templates and assign them on a per-event basis.',
1130
-                                                    'event_espresso'
1131
-                                                )
1132
-                                                . '</strong>';
1133
-
1134
-        $this->display_admin_caf_preview_page('custom_message_types', false);
1135
-    }
1136
-
1137
-
1138
-    /**
1139
-     * get_message_templates
1140
-     * This gets all the message templates for listing on the overview list.
1141
-     *
1142
-     * @access public
1143
-     * @param int    $perpage the amount of templates groups to show per page
1144
-     * @param string $type    the current _view we're getting templates for
1145
-     * @param bool   $count   return count?
1146
-     * @param bool   $all     disregard any paging info (get all data);
1147
-     * @param bool   $global  whether to return just global (true) or custom templates (false)
1148
-     * @return array
1149
-     * @throws EE_Error
1150
-     * @throws InvalidArgumentException
1151
-     * @throws InvalidDataTypeException
1152
-     * @throws InvalidInterfaceException
1153
-     */
1154
-    public function get_message_templates(
1155
-        $perpage = 10,
1156
-        $type = 'in_use',
1157
-        $count = false,
1158
-        $all = false,
1159
-        $global = true
1160
-    ) {
1161
-
1162
-        $MTP = EEM_Message_Template_Group::instance();
1163
-
1164
-        $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? 'GRP_ID' : $this->_req_data['orderby'];
1165
-        $orderby = $this->_req_data['orderby'];
1166
-
1167
-        $order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
1168
-            ? $this->_req_data['order']
1169
-            : 'ASC';
1170
-
1171
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
1172
-            ? $this->_req_data['paged']
1173
-            : 1;
1174
-        $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
1175
-            ? $this->_req_data['perpage']
1176
-            : $perpage;
1177
-
1178
-        $offset = ($current_page - 1) * $per_page;
1179
-        $limit = $all ? null : array($offset, $per_page);
1180
-
1181
-
1182
-        // options will match what is in the _views array property
1183
-        switch ($type) {
1184
-            case 'in_use':
1185
-                $templates = $MTP->get_all_active_message_templates($orderby, $order, $limit, $count, $global, true);
1186
-                break;
1187
-            default:
1188
-                $templates = $MTP->get_all_trashed_grouped_message_templates($orderby, $order, $limit, $count, $global);
1189
-        }
1190
-
1191
-        return $templates;
1192
-    }
1193
-
1194
-
1195
-    /**
1196
-     * filters etc might need a list of installed message_types
1197
-     *
1198
-     * @return array an array of message type objects
1199
-     */
1200
-    public function get_installed_message_types()
1201
-    {
1202
-        $installed_message_types = $this->_message_resource_manager->installed_message_types();
1203
-        $installed = array();
1204
-
1205
-        foreach ($installed_message_types as $message_type) {
1206
-            $installed[ $message_type->name ] = $message_type;
1207
-        }
1208
-
1209
-        return $installed;
1210
-    }
1211
-
1212
-
1213
-    /**
1214
-     * _add_message_template
1215
-     *
1216
-     * This is used when creating a custom template. All Custom Templates start based off another template.
1217
-     *
1218
-     * @param string $message_type
1219
-     * @param string $messenger
1220
-     * @param string $GRP_ID
1221
-     *
1222
-     * @throws EE_error
1223
-     */
1224
-    protected function _add_message_template($message_type = '', $messenger = '', $GRP_ID = '')
1225
-    {
1226
-        // set values override any request data
1227
-        $message_type = ! empty($message_type) ? $message_type : '';
1228
-        $message_type = empty($message_type) && ! empty($this->_req_data['message_type'])
1229
-            ? $this->_req_data['message_type']
1230
-            : $message_type;
1231
-
1232
-        $messenger = ! empty($messenger) ? $messenger : '';
1233
-        $messenger = empty($messenger) && ! empty($this->_req_data['messenger'])
1234
-            ? $this->_req_data['messenger']
1235
-            : $messenger;
1236
-
1237
-        $GRP_ID = ! empty($GRP_ID) ? $GRP_ID : '';
1238
-        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : $GRP_ID;
1239
-
1240
-        // we need messenger and message type.  They should be coming from the event editor. If not here then return error
1241
-        if (empty($message_type) || empty($messenger)) {
1242
-            throw new EE_Error(
1243
-                esc_html__(
1244
-                    'Sorry, but we can\'t create new templates because we\'re missing the messenger or message type',
1245
-                    'event_espresso'
1246
-                )
1247
-            );
1248
-        }
1249
-
1250
-        // we need the GRP_ID for the template being used as the base for the new template
1251
-        if (empty($GRP_ID)) {
1252
-            throw new EE_Error(
1253
-                esc_html__(
1254
-                    'In order to create a custom message template the GRP_ID of the template being used as a base is needed',
1255
-                    'event_espresso'
1256
-                )
1257
-            );
1258
-        }
1259
-
1260
-        // let's just make sure the template gets generated!
1261
-
1262
-        // we need to reassign some variables for what the insert is expecting
1263
-        $this->_req_data['MTP_messenger'] = $messenger;
1264
-        $this->_req_data['MTP_message_type'] = $message_type;
1265
-        $this->_req_data['GRP_ID'] = $GRP_ID;
1266
-        $this->_insert_or_update_message_template(true);
1267
-    }
1268
-
1269
-
1270
-    /**
1271
-     * public wrapper for the _add_message_template method
1272
-     *
1273
-     * @param string $message_type     message type slug
1274
-     * @param string $messenger        messenger slug
1275
-     * @param int    $GRP_ID           GRP_ID for the related message template group this new template will be based
1276
-     *                                 off of.
1277
-     * @throws EE_error
1278
-     */
1279
-    public function add_message_template($message_type, $messenger, $GRP_ID)
1280
-    {
1281
-        $this->_add_message_template($message_type, $messenger, $GRP_ID);
1282
-    }
1283
-
1284
-
1285
-    /**
1286
-     * _edit_message_template
1287
-     *
1288
-     * @access protected
1289
-     * @return void
1290
-     * @throws InvalidIdentifierException
1291
-     * @throws DomainException
1292
-     * @throws EE_Error
1293
-     * @throws InvalidArgumentException
1294
-     * @throws ReflectionException
1295
-     * @throws InvalidDataTypeException
1296
-     * @throws InvalidInterfaceException
1297
-     */
1298
-    protected function _edit_message_template()
1299
-    {
1300
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1301
-        $template_fields = '';
1302
-        $sidebar_fields = '';
1303
-        // we filter the tinyMCE settings to remove the validation since message templates by their nature will not have
1304
-        // valid html in the templates.
1305
-        add_filter('tiny_mce_before_init', array($this, 'filter_tinymce_init'), 10, 2);
1306
-
1307
-        $GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
1308
-            ? absint($this->_req_data['id'])
1309
-            : false;
1310
-
1311
-        $this->_set_shortcodes(); // this also sets the _message_template property.
1312
-        $message_template_group = $this->_message_template_group;
1313
-        $c_label = $message_template_group->context_label();
1314
-        $c_config = $message_template_group->contexts_config();
1315
-
1316
-        reset($c_config);
1317
-        $context = isset($this->_req_data['context']) && ! empty($this->_req_data['context'])
1318
-            ? strtolower($this->_req_data['context'])
1319
-            : key($c_config);
1320
-
1321
-
1322
-        if (empty($GRP_ID)) {
1323
-            $action = 'insert_message_template';
1324
-            $edit_message_template_form_url = add_query_arg(
1325
-                array('action' => $action, 'noheader' => true),
1326
-                EE_MSG_ADMIN_URL
1327
-            );
1328
-        } else {
1329
-            $action = 'update_message_template';
1330
-            $edit_message_template_form_url = add_query_arg(
1331
-                array('action' => $action, 'noheader' => true),
1332
-                EE_MSG_ADMIN_URL
1333
-            );
1334
-        }
1335
-
1336
-        // set active messenger for this view
1337
-        $this->_active_messenger = $this->_message_resource_manager->get_active_messenger(
1338
-            $message_template_group->messenger()
1339
-        );
1340
-        $this->_active_message_type_name = $message_template_group->message_type();
1341
-
1342
-
1343
-        // Do we have any validation errors?
1344
-        $validators = $this->_get_transient();
1345
-        $v_fields = ! empty($validators) ? array_keys($validators) : array();
1346
-
1347
-
1348
-        // we need to assemble the title from Various details
1349
-        $context_label = sprintf(
1350
-            esc_html__('(%s %s)', 'event_espresso'),
1351
-            $c_config[ $context ]['label'],
1352
-            ucwords($c_label['label'])
1353
-        );
1354
-
1355
-        $title = sprintf(
1356
-            esc_html__(' %s %s Template %s', 'event_espresso'),
1357
-            ucwords($message_template_group->messenger_obj()->label['singular']),
1358
-            ucwords($message_template_group->message_type_obj()->label['singular']),
1359
-            $context_label
1360
-        );
1361
-
1362
-        $this->_template_args['GRP_ID'] = $GRP_ID;
1363
-        $this->_template_args['message_template'] = $message_template_group;
1364
-        $this->_template_args['is_extra_fields'] = false;
1365
-
1366
-
1367
-        // let's get EEH_MSG_Template so we can get template form fields
1368
-        $template_field_structure = EEH_MSG_Template::get_fields(
1369
-            $message_template_group->messenger(),
1370
-            $message_template_group->message_type()
1371
-        );
1372
-
1373
-        if (! $template_field_structure) {
1374
-            $template_field_structure = false;
1375
-            $template_fields = esc_html__(
1376
-                'There was an error in assembling the fields for this display (you should see an error message)',
1377
-                'event_espresso'
1378
-            );
1379
-        }
1380
-
1381
-
1382
-        $message_templates = $message_template_group->context_templates();
1383
-
1384
-
1385
-        // if we have the extra key.. then we need to remove the content index from the template_field_structure as it
1386
-        // will get handled in the "extra" array.
1387
-        if (is_array($template_field_structure[ $context ]) && isset($template_field_structure[ $context ]['extra'])) {
1388
-            foreach ($template_field_structure[ $context ]['extra'] as $reference_field => $new_fields) {
1389
-                unset($template_field_structure[ $context ][ $reference_field ]);
1390
-            }
1391
-        }
1392
-
1393
-        // let's loop through the template_field_structure and actually assemble the input fields!
1394
-        if (! empty($template_field_structure)) {
1395
-            foreach ($template_field_structure[ $context ] as $template_field => $field_setup_array) {
1396
-                // if this is an 'extra' template field then we need to remove any existing fields that are keyed up in
1397
-                // the extra array and reset them.
1398
-                if ($template_field === 'extra') {
1399
-                    $this->_template_args['is_extra_fields'] = true;
1400
-                    foreach ($field_setup_array as $reference_field => $new_fields_array) {
1401
-                        $message_template = $message_templates[ $context ][ $reference_field ];
1402
-                        $content = $message_template instanceof EE_Message_Template
1403
-                            ? $message_template->get('MTP_content')
1404
-                            : '';
1405
-                        foreach ($new_fields_array as $extra_field => $extra_array) {
1406
-                            // let's verify if we need this extra field via the shortcodes parameter.
1407
-                            $continue = false;
1408
-                            if (isset($extra_array['shortcodes_required'])) {
1409
-                                foreach ((array) $extra_array['shortcodes_required'] as $shortcode) {
1410
-                                    if (! array_key_exists($shortcode, $this->_shortcodes)) {
1411
-                                        $continue = true;
1412
-                                    }
1413
-                                }
1414
-                                if ($continue) {
1415
-                                    continue;
1416
-                                }
1417
-                            }
1418
-
1419
-                            $field_id = $reference_field
1420
-                                        . '-'
1421
-                                        . $extra_field
1422
-                                        . '-content';
1423
-                            $template_form_fields[ $field_id ] = $extra_array;
1424
-                            $template_form_fields[ $field_id ]['name'] = 'MTP_template_fields['
1425
-                                                                         . $reference_field
1426
-                                                                         . '][content]['
1427
-                                                                         . $extra_field . ']';
1428
-                            $css_class = isset($extra_array['css_class'])
1429
-                                ? $extra_array['css_class']
1430
-                                : '';
1431
-
1432
-                            $template_form_fields[ $field_id ]['css_class'] = ! empty($v_fields)
1433
-                                                                              && in_array($extra_field, $v_fields, true)
1434
-                                                                              &&
1435
-                                                                              (
1436
-                                                                                  is_array($validators[ $extra_field ])
1437
-                                                                                  && isset($validators[ $extra_field ]['msg'])
1438
-                                                                              )
1439
-                                ? 'validate-error ' . $css_class
1440
-                                : $css_class;
1441
-
1442
-                            $template_form_fields[ $field_id ]['value'] = ! empty($message_templates)
1443
-                                                                          && isset($content[ $extra_field ])
1444
-                                ? $content[ $extra_field ]
1445
-                                : '';
1446
-
1447
-                            // do we have a validation error?  if we do then let's use that value instead
1448
-                            $template_form_fields[ $field_id ]['value'] = isset($validators[ $extra_field ])
1449
-                                ? $validators[ $extra_field ]['value']
1450
-                                : $template_form_fields[ $field_id ]['value'];
1451
-
1452
-
1453
-                            $template_form_fields[ $field_id ]['db-col'] = 'MTP_content';
1454
-
1455
-                            // shortcode selector
1456
-                            $field_name_to_use = $extra_field === 'main'
1457
-                                ? 'content'
1458
-                                : $extra_field;
1459
-                            $template_form_fields[ $field_id ]['append_content'] = $this->_get_shortcode_selector(
1460
-                                $field_name_to_use,
1461
-                                $field_id
1462
-                            );
1463
-
1464
-                            if (isset($extra_array['input']) && $extra_array['input'] === 'wp_editor') {
1465
-                                // we want to decode the entities
1466
-                                $template_form_fields[ $field_id ]['value'] = $template_form_fields[ $field_id ]['value'];
1467
-                            }/**/
1468
-                        }
1469
-                        $templatefield_MTP_id = $reference_field . '-MTP_ID';
1470
-                        $templatefield_templatename_id = $reference_field . '-name';
1471
-
1472
-                        $template_form_fields[ $templatefield_MTP_id ] = array(
1473
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1474
-                            'label'      => null,
1475
-                            'input'      => 'hidden',
1476
-                            'type'       => 'int',
1477
-                            'required'   => false,
1478
-                            'validation' => false,
1479
-                            'value'      => ! empty($message_templates) ? $message_template->ID() : '',
1480
-                            'css_class'  => '',
1481
-                            'format'     => '%d',
1482
-                            'db-col'     => 'MTP_ID',
1483
-                        );
1484
-
1485
-                        $template_form_fields[ $templatefield_templatename_id ] = array(
1486
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1487
-                            'label'      => null,
1488
-                            'input'      => 'hidden',
1489
-                            'type'       => 'string',
1490
-                            'required'   => false,
1491
-                            'validation' => true,
1492
-                            'value'      => $reference_field,
1493
-                            'css_class'  => '',
1494
-                            'format'     => '%s',
1495
-                            'db-col'     => 'MTP_template_field',
1496
-                        );
1497
-                    }
1498
-                    continue; // skip the next stuff, we got the necessary fields here for this dataset.
1499
-                } else {
1500
-                    $field_id = $template_field . '-content';
1501
-                    $template_form_fields[ $field_id ] = $field_setup_array;
1502
-                    $template_form_fields[ $field_id ]['name'] = 'MTP_template_fields[' . $template_field . '][content]';
1503
-                    $message_template = isset($message_templates[ $context ][ $template_field ])
1504
-                        ? $message_templates[ $context ][ $template_field ]
1505
-                        : null;
1506
-                    $template_form_fields[ $field_id ]['value'] = ! empty($message_templates)
1507
-                                                                  && is_array($message_templates[ $context ])
1508
-                                                                  && $message_template instanceof EE_Message_Template
1509
-                        ? $message_template->get('MTP_content')
1510
-                        : '';
1511
-
1512
-                    // do we have a validator error for this field?  if we do then we'll use that value instead
1513
-                    $template_form_fields[ $field_id ]['value'] = isset($validators[ $template_field ])
1514
-                        ? $validators[ $template_field ]['value']
1515
-                        : $template_form_fields[ $field_id ]['value'];
1516
-
1517
-
1518
-                    $template_form_fields[ $field_id ]['db-col'] = 'MTP_content';
1519
-                    $css_class = isset($field_setup_array['css_class'])
1520
-                        ? $field_setup_array['css_class']
1521
-                        : '';
1522
-                    $template_form_fields[ $field_id ]['css_class'] = ! empty($v_fields)
1523
-                                                                      && in_array($template_field, $v_fields, true)
1524
-                                                                      && isset($validators[ $template_field ]['msg'])
1525
-                        ? 'validate-error ' . $css_class
1526
-                        : $css_class;
1527
-
1528
-                    // shortcode selector
1529
-                    $template_form_fields[ $field_id ]['append_content'] = $this->_get_shortcode_selector(
1530
-                        $template_field,
1531
-                        $field_id
1532
-                    );
1533
-                }
1534
-
1535
-                // k took care of content field(s) now let's take care of others.
1536
-
1537
-                $templatefield_MTP_id = $template_field . '-MTP_ID';
1538
-                $templatefield_field_templatename_id = $template_field . '-name';
1539
-
1540
-                // foreach template field there are actually two form fields created
1541
-                $template_form_fields[ $templatefield_MTP_id ] = array(
1542
-                    'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1543
-                    'label'      => null,
1544
-                    'input'      => 'hidden',
1545
-                    'type'       => 'int',
1546
-                    'required'   => false,
1547
-                    'validation' => true,
1548
-                    'value'      => $message_template instanceof EE_Message_Template ? $message_template->ID() : '',
1549
-                    'css_class'  => '',
1550
-                    'format'     => '%d',
1551
-                    'db-col'     => 'MTP_ID',
1552
-                );
1553
-
1554
-                $template_form_fields[ $templatefield_field_templatename_id ] = array(
1555
-                    'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1556
-                    'label'      => null,
1557
-                    'input'      => 'hidden',
1558
-                    'type'       => 'string',
1559
-                    'required'   => false,
1560
-                    'validation' => true,
1561
-                    'value'      => $template_field,
1562
-                    'css_class'  => '',
1563
-                    'format'     => '%s',
1564
-                    'db-col'     => 'MTP_template_field',
1565
-                );
1566
-            }
1567
-
1568
-            // add other fields
1569
-            $template_form_fields['ee-msg-current-context'] = array(
1570
-                'name'       => 'MTP_context',
1571
-                'label'      => null,
1572
-                'input'      => 'hidden',
1573
-                'type'       => 'string',
1574
-                'required'   => false,
1575
-                'validation' => true,
1576
-                'value'      => $context,
1577
-                'css_class'  => '',
1578
-                'format'     => '%s',
1579
-                'db-col'     => 'MTP_context',
1580
-            );
1581
-
1582
-            $template_form_fields['ee-msg-grp-id'] = array(
1583
-                'name'       => 'GRP_ID',
1584
-                'label'      => null,
1585
-                'input'      => 'hidden',
1586
-                'type'       => 'int',
1587
-                'required'   => false,
1588
-                'validation' => true,
1589
-                'value'      => $GRP_ID,
1590
-                'css_class'  => '',
1591
-                'format'     => '%d',
1592
-                'db-col'     => 'GRP_ID',
1593
-            );
1594
-
1595
-            $template_form_fields['ee-msg-messenger'] = array(
1596
-                'name'       => 'MTP_messenger',
1597
-                'label'      => null,
1598
-                'input'      => 'hidden',
1599
-                'type'       => 'string',
1600
-                'required'   => false,
1601
-                'validation' => true,
1602
-                'value'      => $message_template_group->messenger(),
1603
-                'css_class'  => '',
1604
-                'format'     => '%s',
1605
-                'db-col'     => 'MTP_messenger',
1606
-            );
1607
-
1608
-            $template_form_fields['ee-msg-message-type'] = array(
1609
-                'name'       => 'MTP_message_type',
1610
-                'label'      => null,
1611
-                'input'      => 'hidden',
1612
-                'type'       => 'string',
1613
-                'required'   => false,
1614
-                'validation' => true,
1615
-                'value'      => $message_template_group->message_type(),
1616
-                'css_class'  => '',
1617
-                'format'     => '%s',
1618
-                'db-col'     => 'MTP_message_type',
1619
-            );
1620
-
1621
-            $sidebar_form_fields['ee-msg-is-global'] = array(
1622
-                'name'       => 'MTP_is_global',
1623
-                'label'      => esc_html__('Global Template', 'event_espresso'),
1624
-                'input'      => 'hidden',
1625
-                'type'       => 'int',
1626
-                'required'   => false,
1627
-                'validation' => true,
1628
-                'value'      => $message_template_group->get('MTP_is_global'),
1629
-                'css_class'  => '',
1630
-                'format'     => '%d',
1631
-                'db-col'     => 'MTP_is_global',
1632
-            );
1633
-
1634
-            $sidebar_form_fields['ee-msg-is-override'] = array(
1635
-                'name'       => 'MTP_is_override',
1636
-                'label'      => esc_html__('Override all custom', 'event_espresso'),
1637
-                'input'      => $message_template_group->is_global() ? 'checkbox' : 'hidden',
1638
-                'type'       => 'int',
1639
-                'required'   => false,
1640
-                'validation' => true,
1641
-                'value'      => $message_template_group->get('MTP_is_override'),
1642
-                'css_class'  => '',
1643
-                'format'     => '%d',
1644
-                'db-col'     => 'MTP_is_override',
1645
-            );
1646
-
1647
-            $sidebar_form_fields['ee-msg-is-active'] = array(
1648
-                'name'       => 'MTP_is_active',
1649
-                'label'      => esc_html__('Active Template', 'event_espresso'),
1650
-                'input'      => 'hidden',
1651
-                'type'       => 'int',
1652
-                'required'   => false,
1653
-                'validation' => true,
1654
-                'value'      => $message_template_group->is_active(),
1655
-                'css_class'  => '',
1656
-                'format'     => '%d',
1657
-                'db-col'     => 'MTP_is_active',
1658
-            );
1659
-
1660
-            $sidebar_form_fields['ee-msg-deleted'] = array(
1661
-                'name'       => 'MTP_deleted',
1662
-                'label'      => null,
1663
-                'input'      => 'hidden',
1664
-                'type'       => 'int',
1665
-                'required'   => false,
1666
-                'validation' => true,
1667
-                'value'      => $message_template_group->get('MTP_deleted'),
1668
-                'css_class'  => '',
1669
-                'format'     => '%d',
1670
-                'db-col'     => 'MTP_deleted',
1671
-            );
1672
-            $sidebar_form_fields['ee-msg-author'] = array(
1673
-                'name'       => 'MTP_user_id',
1674
-                'label'      => esc_html__('Author', 'event_espresso'),
1675
-                'input'      => 'hidden',
1676
-                'type'       => 'int',
1677
-                'required'   => false,
1678
-                'validation' => false,
1679
-                'value'      => $message_template_group->user(),
1680
-                'format'     => '%d',
1681
-                'db-col'     => 'MTP_user_id',
1682
-            );
1683
-
1684
-            $sidebar_form_fields['ee-msg-route'] = array(
1685
-                'name'  => 'action',
1686
-                'input' => 'hidden',
1687
-                'type'  => 'string',
1688
-                'value' => $action,
1689
-            );
1690
-
1691
-            $sidebar_form_fields['ee-msg-id'] = array(
1692
-                'name'  => 'id',
1693
-                'input' => 'hidden',
1694
-                'type'  => 'int',
1695
-                'value' => $GRP_ID,
1696
-            );
1697
-            $sidebar_form_fields['ee-msg-evt-nonce'] = array(
1698
-                'name'  => $action . '_nonce',
1699
-                'input' => 'hidden',
1700
-                'type'  => 'string',
1701
-                'value' => wp_create_nonce($action . '_nonce'),
1702
-            );
1703
-
1704
-            if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
1705
-                $sidebar_form_fields['ee-msg-template-switch'] = array(
1706
-                    'name'  => 'template_switch',
1707
-                    'input' => 'hidden',
1708
-                    'type'  => 'int',
1709
-                    'value' => 1,
1710
-                );
1711
-            }
1712
-
1713
-
1714
-            $template_fields = $this->_generate_admin_form_fields($template_form_fields);
1715
-            $sidebar_fields = $this->_generate_admin_form_fields($sidebar_form_fields);
1716
-        } //end if ( !empty($template_field_structure) )
1717
-
1718
-        // set extra content for publish box
1719
-        $this->_template_args['publish_box_extra_content'] = $sidebar_fields;
1720
-        $this->_set_publish_post_box_vars(
1721
-            'id',
1722
-            $GRP_ID,
1723
-            false,
1724
-            add_query_arg(
1725
-                array('action' => 'global_mtps'),
1726
-                $this->_admin_base_url
1727
-            )
1728
-        );
1729
-
1730
-        // add preview button
1731
-        $preview_url = parent::add_query_args_and_nonce(
1732
-            array(
1733
-                'message_type' => $message_template_group->message_type(),
1734
-                'messenger'    => $message_template_group->messenger(),
1735
-                'context'      => $context,
1736
-                'GRP_ID'       => $GRP_ID,
1737
-                'action'       => 'preview_message',
1738
-            ),
1739
-            $this->_admin_base_url
1740
-        );
1741
-        $preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">'
1742
-                          . esc_html__('Preview', 'event_espresso')
1743
-                          . '</a>';
1744
-
1745
-
1746
-        // setup context switcher
1747
-        $context_switcher_args = array(
1748
-            'page'    => 'espresso_messages',
1749
-            'action'  => 'edit_message_template',
1750
-            'id'      => $GRP_ID,
1751
-            'context' => $context,
1752
-            'extra'   => $preview_button,
1753
-        );
1754
-        $this->_set_context_switcher($message_template_group, $context_switcher_args);
1755
-
1756
-
1757
-        // main box
1758
-        $this->_template_args['template_fields'] = $template_fields;
1759
-        $this->_template_args['sidebar_box_id'] = 'details';
1760
-        $this->_template_args['action'] = $action;
1761
-        $this->_template_args['context'] = $context;
1762
-        $this->_template_args['edit_message_template_form_url'] = $edit_message_template_form_url;
1763
-        $this->_template_args['learn_more_about_message_templates_link'] =
1764
-            $this->_learn_more_about_message_templates_link();
1765
-
1766
-
1767
-        $this->_template_args['before_admin_page_content'] = $this->add_context_switcher();
1768
-        $this->_template_args['before_admin_page_content'] .= $this->add_active_context_element(
1769
-            $message_template_group,
1770
-            $context,
1771
-            $context_label
1772
-        );
1773
-        $this->_template_args['before_admin_page_content'] .= $this->_add_form_element_before();
1774
-        $this->_template_args['after_admin_page_content'] = $this->_add_form_element_after();
1775
-
1776
-        $this->_template_path = $this->_template_args['GRP_ID']
1777
-            ? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1778
-            : EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1779
-
1780
-        // send along EE_Message_Template_Group object for further template use.
1781
-        $this->_template_args['MTP'] = $message_template_group;
1782
-
1783
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
1784
-            $this->_template_path,
1785
-            $this->_template_args,
1786
-            true
1787
-        );
1788
-
1789
-
1790
-        // finally, let's set the admin_page title
1791
-        $this->_admin_page_title = sprintf(__('Editing %s', 'event_espresso'), $title);
1792
-
1793
-
1794
-        // we need to take care of setting the shortcodes property for use elsewhere.
1795
-        $this->_set_shortcodes();
1796
-
1797
-
1798
-        // final template wrapper
1799
-        $this->display_admin_page_with_sidebar();
1800
-    }
1801
-
1802
-
1803
-    public function filter_tinymce_init($mceInit, $editor_id)
1804
-    {
1805
-        return $mceInit;
1806
-    }
1807
-
1808
-
1809
-    public function add_context_switcher()
1810
-    {
1811
-        return $this->_context_switcher;
1812
-    }
1813
-
1814
-
1815
-    /**
1816
-     * Adds the activation/deactivation toggle for the message template context.
1817
-     *
1818
-     * @param EE_Message_Template_Group $message_template_group
1819
-     * @param string                    $context
1820
-     * @param string                    $context_label
1821
-     * @return string
1822
-     * @throws DomainException
1823
-     * @throws EE_Error
1824
-     * @throws InvalidIdentifierException
1825
-     */
1826
-    protected function add_active_context_element(
1827
-        EE_Message_Template_Group $message_template_group,
1828
-        $context,
1829
-        $context_label
1830
-    ) {
1831
-        $template_args = array(
1832
-            'context'                   => $context,
1833
-            'nonce'                     => wp_create_nonce('activate_' . $context . '_toggle_nonce'),
1834
-            'is_active'                 => $message_template_group->is_context_active($context),
1835
-            'on_off_action'             => $message_template_group->is_context_active($context)
1836
-                ? 'context-off'
1837
-                : 'context-on',
1838
-            'context_label'             => str_replace(array('(', ')'), '', $context_label),
1839
-            'message_template_group_id' => $message_template_group->ID(),
1840
-        );
1841
-        return EEH_Template::display_template(
1842
-            EE_MSG_TEMPLATE_PATH . 'ee_msg_editor_active_context_element.template.php',
1843
-            $template_args,
1844
-            true
1845
-        );
1846
-    }
1847
-
1848
-
1849
-    /**
1850
-     * Ajax callback for `toggle_context_template` ajax action.
1851
-     * Handles toggling the message context on or off.
1852
-     *
1853
-     * @throws EE_Error
1854
-     * @throws InvalidArgumentException
1855
-     * @throws InvalidDataTypeException
1856
-     * @throws InvalidIdentifierException
1857
-     * @throws InvalidInterfaceException
1858
-     */
1859
-    public function toggle_context_template()
1860
-    {
1861
-        $success = true;
1862
-        // check for required data
1863
-        if (! isset(
1864
-            $this->_req_data['message_template_group_id'],
1865
-            $this->_req_data['context'],
1866
-            $this->_req_data['status']
1867
-        )) {
1868
-            EE_Error::add_error(
1869
-                esc_html__('Required data for doing this action is not available.', 'event_espresso'),
1870
-                __FILE__,
1871
-                __FUNCTION__,
1872
-                __LINE__
1873
-            );
1874
-            $success = false;
1875
-        }
1876
-
1877
-        $nonce = isset($this->_req_data['toggle_context_nonce'])
1878
-            ? sanitize_text_field($this->_req_data['toggle_context_nonce'])
1879
-            : '';
1880
-        $nonce_ref = 'activate_' . $this->_req_data['context'] . '_toggle_nonce';
1881
-        $this->_verify_nonce($nonce, $nonce_ref);
1882
-        $status = $this->_req_data['status'];
1883
-        if ($status !== 'off' && $status !== 'on') {
1884
-            EE_Error::add_error(
1885
-                sprintf(
1886
-                    esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
1887
-                    $this->_req_data['status']
1888
-                ),
1889
-                __FILE__,
1890
-                __FUNCTION__,
1891
-                __LINE__
1892
-            );
1893
-            $success = false;
1894
-        }
1895
-        $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID(
1896
-            $this->_req_data['message_template_group_id']
1897
-        );
1898
-        if (! $message_template_group instanceof EE_Message_Template_Group) {
1899
-            EE_Error::add_error(
1900
-                sprintf(
1901
-                    esc_html__(
1902
-                        'Unable to change the active state because the given id "%1$d" does not match a valid "%2$s"',
1903
-                        'event_espresso'
1904
-                    ),
1905
-                    $this->_req_data['message_template_group_id'],
1906
-                    'EE_Message_Template_Group'
1907
-                ),
1908
-                __FILE__,
1909
-                __FUNCTION__,
1910
-                __LINE__
1911
-            );
1912
-            $success = false;
1913
-        }
1914
-        if ($success) {
1915
-            $success = $status === 'off'
1916
-                ? $message_template_group->deactivate_context($this->_req_data['context'])
1917
-                : $message_template_group->activate_context($this->_req_data['context']);
1918
-        }
1919
-        $this->_template_args['success'] = $success;
1920
-        $this->_return_json();
1921
-    }
1922
-
1923
-
1924
-    public function _add_form_element_before()
1925
-    {
1926
-        return '<form method="post" action="'
1927
-               . $this->_template_args["edit_message_template_form_url"]
1928
-               . '" id="ee-msg-edit-frm">';
1929
-    }
1930
-
1931
-    public function _add_form_element_after()
1932
-    {
1933
-        return '</form>';
1934
-    }
1935
-
1936
-
1937
-    /**
1938
-     * This executes switching the template pack for a message template.
1939
-     *
1940
-     * @since 4.5.0
1941
-     * @throws EE_Error
1942
-     * @throws InvalidDataTypeException
1943
-     * @throws InvalidInterfaceException
1944
-     * @throws InvalidArgumentException
1945
-     * @throws ReflectionException
1946
-     */
1947
-    public function switch_template_pack()
1948
-    {
1949
-        $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1950
-        $template_pack = ! empty($this->_req_data['template_pack']) ? $this->_req_data['template_pack'] : '';
1951
-
1952
-        // verify we have needed values.
1953
-        if (empty($GRP_ID) || empty($template_pack)) {
1954
-            $this->_template_args['error'] = true;
1955
-            EE_Error::add_error(
1956
-                esc_html__('The required date for switching templates is not available.', 'event_espresso'),
1957
-                __FILE__,
1958
-                __FUNCTION__,
1959
-                __LINE__
1960
-            );
1961
-        } else {
1962
-            // get template, set the new template_pack and then reset to default
1963
-            /** @type EE_Message_Template_Group $message_template_group */
1964
-            $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1965
-
1966
-            $message_template_group->set_template_pack_name($template_pack);
1967
-            $this->_req_data['msgr'] = $message_template_group->messenger();
1968
-            $this->_req_data['mt'] = $message_template_group->message_type();
1969
-
1970
-            $query_args = $this->_reset_to_default_template();
1971
-
1972
-            if (empty($query_args['id'])) {
1973
-                EE_Error::add_error(
1974
-                    esc_html__(
1975
-                        'Something went wrong with switching the template pack. Please try again or contact EE support',
1976
-                        'event_espresso'
1977
-                    ),
1978
-                    __FILE__,
1979
-                    __FUNCTION__,
1980
-                    __LINE__
1981
-                );
1982
-                $this->_template_args['error'] = true;
1983
-            } else {
1984
-                $template_label = $message_template_group->get_template_pack()->label;
1985
-                $template_pack_labels = $message_template_group->messenger_obj()->get_supports_labels();
1986
-                EE_Error::add_success(
1987
-                    sprintf(
1988
-                        esc_html__(
1989
-                            'This message template has been successfully switched to use the %1$s %2$s.  Please wait while the page reloads with your new template.',
1990
-                            'event_espresso'
1991
-                        ),
1992
-                        $template_label,
1993
-                        $template_pack_labels->template_pack
1994
-                    )
1995
-                );
1996
-                // generate the redirect url for js.
1997
-                $url = self::add_query_args_and_nonce(
1998
-                    $query_args,
1999
-                    $this->_admin_base_url
2000
-                );
2001
-                $this->_template_args['data']['redirect_url'] = $url;
2002
-                $this->_template_args['success'] = true;
2003
-            }
2004
-
2005
-            $this->_return_json();
2006
-        }
2007
-    }
2008
-
2009
-
2010
-    /**
2011
-     * This handles resetting the template for the given messenger/message_type so that users can start from scratch if
2012
-     * they want.
2013
-     *
2014
-     * @access protected
2015
-     * @return array|null
2016
-     * @throws EE_Error
2017
-     * @throws InvalidArgumentException
2018
-     * @throws InvalidDataTypeException
2019
-     * @throws InvalidInterfaceException
2020
-     */
2021
-    protected function _reset_to_default_template()
2022
-    {
2023
-
2024
-        $templates = array();
2025
-        $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2026
-        // we need to make sure we've got the info we need.
2027
-        if (! isset($this->_req_data['msgr'], $this->_req_data['mt'], $this->_req_data['GRP_ID'])) {
2028
-            EE_Error::add_error(
2029
-                esc_html__(
2030
-                    'In order to reset the template to its default we require the messenger, message type, and message template GRP_ID to know what is being reset.  At least one of these is missing.',
2031
-                    'event_espresso'
2032
-                ),
2033
-                __FILE__,
2034
-                __FUNCTION__,
2035
-                __LINE__
2036
-            );
2037
-        }
2038
-
2039
-        // all templates will be reset to whatever the defaults are
2040
-        // for the global template matching the messenger and message type.
2041
-        $success = ! empty($GRP_ID) ? true : false;
2042
-
2043
-        if ($success) {
2044
-            // let's first determine if the incoming template is a global template,
2045
-            // if it isn't then we need to get the global template matching messenger and message type.
2046
-            // $MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID( $GRP_ID );
2047
-
2048
-
2049
-            // note this is ONLY deleting the template fields (Message Template rows) NOT the message template group.
2050
-            $success = $this->_delete_mtp_permanently($GRP_ID, false);
2051
-
2052
-            if ($success) {
2053
-                // if successfully deleted, lets generate the new ones.
2054
-                // Note. We set GLOBAL to true, because resets on ANY template
2055
-                // will use the related global template defaults for regeneration.
2056
-                // This means that if a custom template is reset it resets to whatever the related global template is.
2057
-                // HOWEVER, we DO keep the template pack and template variation set
2058
-                // for the current custom template when resetting.
2059
-                $templates = $this->_generate_new_templates(
2060
-                    $this->_req_data['msgr'],
2061
-                    $this->_req_data['mt'],
2062
-                    $GRP_ID,
2063
-                    true
2064
-                );
2065
-            }
2066
-        }
2067
-
2068
-        // any error messages?
2069
-        if (! $success) {
2070
-            EE_Error::add_error(
2071
-                esc_html__(
2072
-                    'Something went wrong with deleting existing templates. Unable to reset to default',
2073
-                    'event_espresso'
2074
-                ),
2075
-                __FILE__,
2076
-                __FUNCTION__,
2077
-                __LINE__
2078
-            );
2079
-        }
2080
-
2081
-        // all good, let's add a success message!
2082
-        if ($success && ! empty($templates)) {
2083
-            // the info for the template we generated is the first element in the returned array
2084
-            // $templates = $templates[0];
2085
-            EE_Error::overwrite_success();
2086
-            EE_Error::add_success(__('Templates have been reset to defaults.', 'event_espresso'));
2087
-        }
2088
-
2089
-
2090
-        $query_args = array(
2091
-            'id'      => isset($templates[0]['GRP_ID']) ? $templates[0]['GRP_ID'] : null,
2092
-            'context' => isset($templates[0]['MTP_context']) ? $templates[0]['MTP_context'] : null,
2093
-            'action'  => isset($templates[0]['GRP_ID']) ? 'edit_message_template' : 'global_mtps',
2094
-        );
2095
-
2096
-        // if called via ajax then we return query args otherwise redirect
2097
-        if (defined('DOING_AJAX') && DOING_AJAX) {
2098
-            return $query_args;
2099
-        } else {
2100
-            $this->_redirect_after_action(false, '', '', $query_args, true);
2101
-
2102
-            return null;
2103
-        }
2104
-    }
2105
-
2106
-
2107
-    /**
2108
-     * Retrieve and set the message preview for display.
2109
-     *
2110
-     * @param bool $send if TRUE then we are doing an actual TEST send with the results of the preview.
2111
-     * @return string
2112
-     * @throws ReflectionException
2113
-     * @throws EE_Error
2114
-     * @throws InvalidArgumentException
2115
-     * @throws InvalidDataTypeException
2116
-     * @throws InvalidInterfaceException
2117
-     */
2118
-    public function _preview_message($send = false)
2119
-    {
2120
-        // first make sure we've got the necessary parameters
2121
-        if (! isset(
2122
-            $this->_req_data['message_type'],
2123
-            $this->_req_data['messenger'],
2124
-            $this->_req_data['messenger'],
2125
-            $this->_req_data['GRP_ID']
2126
-        )) {
2127
-            EE_Error::add_error(
2128
-                esc_html__('Missing necessary parameters for displaying preview', 'event_espresso'),
2129
-                __FILE__,
2130
-                __FUNCTION__,
2131
-                __LINE__
2132
-            );
2133
-        }
2134
-
2135
-        EE_Registry::instance()->REQ->set('GRP_ID', $this->_req_data['GRP_ID']);
2136
-
2137
-
2138
-        // get the preview!
2139
-        $preview = EED_Messages::preview_message(
2140
-            $this->_req_data['message_type'],
2141
-            $this->_req_data['context'],
2142
-            $this->_req_data['messenger'],
2143
-            $send
2144
-        );
2145
-
2146
-        if ($send) {
2147
-            return $preview;
2148
-        }
2149
-
2150
-        // let's add a button to go back to the edit view
2151
-        $query_args = array(
2152
-            'id'      => $this->_req_data['GRP_ID'],
2153
-            'context' => $this->_req_data['context'],
2154
-            'action'  => 'edit_message_template',
2155
-        );
2156
-        $go_back_url = parent::add_query_args_and_nonce($query_args, $this->_admin_base_url);
2157
-        $preview_button = '<a href="'
2158
-                          . $go_back_url
2159
-                          . '" class="button-secondary messages-preview-go-back-button">'
2160
-                          . esc_html__('Go Back to Edit', 'event_espresso')
2161
-                          . '</a>';
2162
-        $message_types = $this->get_installed_message_types();
2163
-        $active_messenger = $this->_message_resource_manager->get_active_messenger(
2164
-            $this->_req_data['messenger']
2165
-        );
2166
-        $active_messenger_label = $active_messenger instanceof EE_messenger
2167
-            ? ucwords($active_messenger->label['singular'])
2168
-            : esc_html__('Unknown Messenger', 'event_espresso');
2169
-        // let's provide a helpful title for context
2170
-        $preview_title = sprintf(
2171
-            esc_html__('Viewing Preview for %s %s Message Template', 'event_espresso'),
2172
-            $active_messenger_label,
2173
-            ucwords($message_types[ $this->_req_data['message_type'] ]->label['singular'])
2174
-        );
2175
-        // setup display of preview.
2176
-        $this->_admin_page_title = $preview_title;
2177
-        $this->_template_args['admin_page_content'] = $preview_button . '<br />' . $preview;
2178
-        $this->_template_args['data']['force_json'] = true;
2179
-
2180
-        return '';
2181
-    }
2182
-
2183
-
2184
-    /**
2185
-     * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
2186
-     * gets called automatically.
2187
-     *
2188
-     * @since 4.5.0
2189
-     *
2190
-     * @return string
2191
-     */
2192
-    protected function _display_preview_message()
2193
-    {
2194
-        $this->display_admin_page_with_no_sidebar();
2195
-    }
2196
-
2197
-
2198
-    /**
2199
-     * registers metaboxes that should show up on the "edit_message_template" page
2200
-     *
2201
-     * @access protected
2202
-     * @return void
2203
-     */
2204
-    protected function _register_edit_meta_boxes()
2205
-    {
2206
-        add_meta_box(
2207
-            'mtp_valid_shortcodes',
2208
-            esc_html__('Valid Shortcodes', 'event_espresso'),
2209
-            array($this, 'shortcode_meta_box'),
2210
-            $this->_current_screen->id,
2211
-            'side',
2212
-            'default'
2213
-        );
2214
-        add_meta_box(
2215
-            'mtp_extra_actions',
2216
-            esc_html__('Extra Actions', 'event_espresso'),
2217
-            array($this, 'extra_actions_meta_box'),
2218
-            $this->_current_screen->id,
2219
-            'side',
2220
-            'high'
2221
-        );
2222
-        add_meta_box(
2223
-            'mtp_templates',
2224
-            esc_html__('Template Styles', 'event_espresso'),
2225
-            array($this, 'template_pack_meta_box'),
2226
-            $this->_current_screen->id,
2227
-            'side',
2228
-            'high'
2229
-        );
2230
-    }
2231
-
2232
-
2233
-    /**
2234
-     * metabox content for all template pack and variation selection.
2235
-     *
2236
-     * @since 4.5.0
2237
-     * @return string
2238
-     * @throws DomainException
2239
-     * @throws EE_Error
2240
-     * @throws InvalidArgumentException
2241
-     * @throws ReflectionException
2242
-     * @throws InvalidDataTypeException
2243
-     * @throws InvalidInterfaceException
2244
-     */
2245
-    public function template_pack_meta_box()
2246
-    {
2247
-        $this->_set_message_template_group();
2248
-
2249
-        $tp_collection = EEH_MSG_Template::get_template_pack_collection();
2250
-
2251
-        $tp_select_values = array();
2252
-
2253
-        foreach ($tp_collection as $tp) {
2254
-            // only include template packs that support this messenger and message type!
2255
-            $supports = $tp->get_supports();
2256
-            if (! isset($supports[ $this->_message_template_group->messenger() ])
2257
-                || ! in_array(
2258
-                    $this->_message_template_group->message_type(),
2259
-                    $supports[ $this->_message_template_group->messenger() ],
2260
-                    true
2261
-                )
2262
-            ) {
2263
-                // not supported
2264
-                continue;
2265
-            }
2266
-
2267
-            $tp_select_values[] = array(
2268
-                'text' => $tp->label,
2269
-                'id'   => $tp->dbref,
2270
-            );
2271
-        }
2272
-
2273
-        // if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by
2274
-        // the default template pack.  This still allows for the odd template pack to override.
2275
-        if (empty($tp_select_values)) {
2276
-            $tp_select_values[] = array(
2277
-                'text' => esc_html__('Default', 'event_espresso'),
2278
-                'id'   => 'default',
2279
-            );
2280
-        }
2281
-
2282
-        // setup variation select values for the currently selected template.
2283
-        $variations = $this->_message_template_group->get_template_pack()->get_variations(
2284
-            $this->_message_template_group->messenger(),
2285
-            $this->_message_template_group->message_type()
2286
-        );
2287
-        $variations_select_values = array();
2288
-        foreach ($variations as $variation => $label) {
2289
-            $variations_select_values[] = array(
2290
-                'text' => $label,
2291
-                'id'   => $variation,
2292
-            );
2293
-        }
2294
-
2295
-        $template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
2296
-
2297
-        $template_args['template_packs_selector'] = EEH_Form_Fields::select_input(
2298
-            'MTP_template_pack',
2299
-            $tp_select_values,
2300
-            $this->_message_template_group->get_template_pack_name()
2301
-        );
2302
-        $template_args['variations_selector'] = EEH_Form_Fields::select_input(
2303
-            'MTP_template_variation',
2304
-            $variations_select_values,
2305
-            $this->_message_template_group->get_template_pack_variation()
2306
-        );
2307
-        $template_args['template_pack_label'] = $template_pack_labels->template_pack;
2308
-        $template_args['template_variation_label'] = $template_pack_labels->template_variation;
2309
-        $template_args['template_pack_description'] = $template_pack_labels->template_pack_description;
2310
-        $template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
2311
-
2312
-        $template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
2313
-
2314
-        EEH_Template::display_template($template, $template_args);
2315
-    }
2316
-
2317
-
2318
-    /**
2319
-     * This meta box holds any extra actions related to Message Templates
2320
-     * For now, this includes Resetting templates to defaults and sending a test email.
2321
-     *
2322
-     * @access  public
2323
-     * @return void
2324
-     * @throws EE_Error
2325
-     */
2326
-    public function extra_actions_meta_box()
2327
-    {
2328
-        $template_form_fields = array();
2329
-
2330
-        $extra_args = array(
2331
-            'msgr'   => $this->_message_template_group->messenger(),
2332
-            'mt'     => $this->_message_template_group->message_type(),
2333
-            'GRP_ID' => $this->_message_template_group->GRP_ID(),
2334
-        );
2335
-        // first we need to see if there are any fields
2336
-        $fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2337
-
2338
-        if (! empty($fields)) {
2339
-            // yup there be fields
2340
-            foreach ($fields as $field => $config) {
2341
-                $field_id = $this->_message_template_group->messenger() . '_' . $field;
2342
-                $existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2343
-                $default = isset($config['default']) ? $config['default'] : '';
2344
-                $default = isset($config['value']) ? $config['value'] : $default;
2345
-
2346
-                // if type is hidden and the value is empty
2347
-                // something may have gone wrong so let's correct with the defaults
2348
-                $fix = $config['input'] === 'hidden'
2349
-                       && isset($existing[ $field ])
2350
-                       && empty($existing[ $field ])
2351
-                    ? $default
2352
-                    : '';
2353
-                $existing[ $field ] = isset($existing[ $field ]) && empty($fix)
2354
-                    ? $existing[ $field ]
2355
-                    : $fix;
2356
-
2357
-                $template_form_fields[ $field_id ] = array(
2358
-                    'name'       => 'test_settings_fld[' . $field . ']',
2359
-                    'label'      => $config['label'],
2360
-                    'input'      => $config['input'],
2361
-                    'type'       => $config['type'],
2362
-                    'required'   => $config['required'],
2363
-                    'validation' => $config['validation'],
2364
-                    'value'      => isset($existing[ $field ]) ? $existing[ $field ] : $default,
2365
-                    'css_class'  => $config['css_class'],
2366
-                    'options'    => isset($config['options']) ? $config['options'] : array(),
2367
-                    'default'    => $default,
2368
-                    'format'     => $config['format'],
2369
-                );
2370
-            }
2371
-        }
2372
-
2373
-        $test_settings_fields = ! empty($template_form_fields)
2374
-            ? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2375
-            : '';
2376
-
2377
-        $test_settings_html = '';
2378
-        // print out $test_settings_fields
2379
-        if (! empty($test_settings_fields)) {
2380
-            echo $test_settings_fields;
2381
-            $test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2382
-            $test_settings_html .= 'name="test_button" value="';
2383
-            $test_settings_html .= esc_html__('Test Send', 'event_espresso');
2384
-            $test_settings_html .= '" /><div style="clear:both"></div>';
2385
-        }
2386
-
2387
-        // and button
2388
-        $test_settings_html .= '<p>'
2389
-                               . esc_html__('Need to reset this message type and start over?', 'event_espresso')
2390
-                               . '</p>';
2391
-        $test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2392
-        $test_settings_html .= $this->get_action_link_or_button(
2393
-            'reset_to_default',
2394
-            'reset',
2395
-            $extra_args,
2396
-            'button-primary reset-default-button'
2397
-        );
2398
-        $test_settings_html .= '</div><div style="clear:both"></div>';
2399
-        echo $test_settings_html;
2400
-    }
2401
-
2402
-
2403
-    /**
2404
-     * This returns the shortcode selector skeleton for a given context and field.
2405
-     *
2406
-     * @since 4.9.rc.000
2407
-     * @param string $field           The name of the field retrieving shortcodes for.
2408
-     * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2409
-     * @return string
2410
-     * @throws DomainException
2411
-     * @throws EE_Error
2412
-     * @throws InvalidArgumentException
2413
-     * @throws ReflectionException
2414
-     * @throws InvalidDataTypeException
2415
-     * @throws InvalidInterfaceException
2416
-     */
2417
-    protected function _get_shortcode_selector($field, $linked_input_id)
2418
-    {
2419
-        $template_args = array(
2420
-            'shortcodes'      => $this->_get_shortcodes(array($field), true),
2421
-            'fieldname'       => $field,
2422
-            'linked_input_id' => $linked_input_id,
2423
-        );
2424
-
2425
-        return EEH_Template::display_template(
2426
-            EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2427
-            $template_args,
2428
-            true
2429
-        );
2430
-    }
2431
-
2432
-
2433
-    /**
2434
-     * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2435
-     * page)
2436
-     *
2437
-     * @access public
2438
-     * @return void
2439
-     * @throws EE_Error
2440
-     * @throws InvalidArgumentException
2441
-     * @throws ReflectionException
2442
-     * @throws InvalidDataTypeException
2443
-     * @throws InvalidInterfaceException
2444
-     */
2445
-    public function shortcode_meta_box()
2446
-    {
2447
-        $shortcodes = $this->_get_shortcodes(array(), false); // just make sure shortcodes property is set
2448
-        // $messenger = $this->_message_template_group->messenger_obj();
2449
-        // now let's set the content depending on the status of the shortcodes array
2450
-        if (empty($shortcodes)) {
2451
-            $content = '<p>' . esc_html__('There are no valid shortcodes available', 'event_espresso') . '</p>';
2452
-            echo $content;
2453
-        } else {
2454
-            // $alt = 0;
2455
-            ?>
22
+	/**
23
+	 * @type EE_Message_Resource_Manager $_message_resource_manager
24
+	 */
25
+	protected $_message_resource_manager;
26
+
27
+	/**
28
+	 * @type string $_active_message_type_name
29
+	 */
30
+	protected $_active_message_type_name = '';
31
+
32
+	/**
33
+	 * @type EE_messenger $_active_messenger
34
+	 */
35
+	protected $_active_messenger;
36
+	protected $_activate_state;
37
+	protected $_activate_meta_box_type;
38
+	protected $_current_message_meta_box;
39
+	protected $_current_message_meta_box_object;
40
+	protected $_context_switcher;
41
+	protected $_shortcodes = array();
42
+	protected $_active_messengers = array();
43
+	protected $_active_message_types = array();
44
+
45
+	/**
46
+	 * @var EE_Message_Template_Group $_message_template_group
47
+	 */
48
+	protected $_message_template_group;
49
+	protected $_m_mt_settings = array();
50
+
51
+
52
+	/**
53
+	 * This is set via the _set_message_template_group method and holds whatever the template pack for the group is.
54
+	 * IF there is no group then it gets automatically set to the Default template pack.
55
+	 *
56
+	 * @since 4.5.0
57
+	 *
58
+	 * @var EE_Messages_Template_Pack
59
+	 */
60
+	protected $_template_pack;
61
+
62
+
63
+	/**
64
+	 * This is set via the _set_message_template_group method and holds whatever the template pack variation for the
65
+	 * group is.  If there is no group then it automatically gets set to default.
66
+	 *
67
+	 * @since 4.5.0
68
+	 *
69
+	 * @var string
70
+	 */
71
+	protected $_variation;
72
+
73
+
74
+	/**
75
+	 * @param bool $routing
76
+	 * @throws EE_Error
77
+	 */
78
+	public function __construct($routing = true)
79
+	{
80
+		// make sure messages autoloader is running
81
+		EED_Messages::set_autoloaders();
82
+		parent::__construct($routing);
83
+	}
84
+
85
+
86
+	protected function _init_page_props()
87
+	{
88
+		$this->page_slug = EE_MSG_PG_SLUG;
89
+		$this->page_label = esc_html__('Messages Settings', 'event_espresso');
90
+		$this->_admin_base_url = EE_MSG_ADMIN_URL;
91
+		$this->_admin_base_path = EE_MSG_ADMIN;
92
+
93
+		$this->_activate_state = isset($this->_req_data['activate_state']) ? (array) $this->_req_data['activate_state']
94
+			: array();
95
+
96
+		$this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
97
+		$this->_load_message_resource_manager();
98
+	}
99
+
100
+
101
+	/**
102
+	 * loads messenger objects into the $_active_messengers property (so we can access the needed methods)
103
+	 *
104
+	 * @throws EE_Error
105
+	 * @throws InvalidDataTypeException
106
+	 * @throws InvalidInterfaceException
107
+	 * @throws InvalidArgumentException
108
+	 * @throws ReflectionException
109
+	 */
110
+	protected function _load_message_resource_manager()
111
+	{
112
+		$this->_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
113
+	}
114
+
115
+
116
+	/**
117
+	 * @deprecated 4.9.9.rc.014
118
+	 * @return array
119
+	 * @throws EE_Error
120
+	 * @throws InvalidArgumentException
121
+	 * @throws InvalidDataTypeException
122
+	 * @throws InvalidInterfaceException
123
+	 */
124
+	public function get_messengers_for_list_table()
125
+	{
126
+		EE_Error::doing_it_wrong(
127
+			__METHOD__,
128
+			sprintf(
129
+				esc_html__(
130
+					'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a messenger filter dropdown which is now generated differently via %s',
131
+					'event_espresso'
132
+				),
133
+				'Messages_Admin_Page::get_messengers_select_input()'
134
+			),
135
+			'4.9.9.rc.014'
136
+		);
137
+
138
+		$m_values = array();
139
+		$active_messengers = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
140
+		// setup messengers for selects
141
+		$i = 1;
142
+		foreach ($active_messengers as $active_messenger) {
143
+			if ($active_messenger instanceof EE_Message) {
144
+				$m_values[ $i ]['id'] = $active_messenger->messenger();
145
+				$m_values[ $i ]['text'] = ucwords($active_messenger->messenger_label());
146
+				$i++;
147
+			}
148
+		}
149
+
150
+		return $m_values;
151
+	}
152
+
153
+
154
+	/**
155
+	 * @deprecated 4.9.9.rc.014
156
+	 * @return array
157
+	 * @throws EE_Error
158
+	 * @throws InvalidArgumentException
159
+	 * @throws InvalidDataTypeException
160
+	 * @throws InvalidInterfaceException
161
+	 */
162
+	public function get_message_types_for_list_table()
163
+	{
164
+		EE_Error::doing_it_wrong(
165
+			__METHOD__,
166
+			sprintf(
167
+				esc_html__(
168
+					'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type filter dropdown which is now generated differently via %s',
169
+					'event_espresso'
170
+				),
171
+				'Messages_Admin_Page::get_message_types_select_input()'
172
+			),
173
+			'4.9.9.rc.014'
174
+		);
175
+
176
+		$mt_values = array();
177
+		$active_messages = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
178
+		$i = 1;
179
+		foreach ($active_messages as $active_message) {
180
+			if ($active_message instanceof EE_Message) {
181
+				$mt_values[ $i ]['id'] = $active_message->message_type();
182
+				$mt_values[ $i ]['text'] = ucwords($active_message->message_type_label());
183
+				$i++;
184
+			}
185
+		}
186
+
187
+		return $mt_values;
188
+	}
189
+
190
+
191
+	/**
192
+	 * @deprecated 4.9.9.rc.014
193
+	 * @return array
194
+	 * @throws EE_Error
195
+	 * @throws InvalidArgumentException
196
+	 * @throws InvalidDataTypeException
197
+	 * @throws InvalidInterfaceException
198
+	 */
199
+	public function get_contexts_for_message_types_for_list_table()
200
+	{
201
+		EE_Error::doing_it_wrong(
202
+			__METHOD__,
203
+			sprintf(
204
+				esc_html__(
205
+					'This method is no longer in use.  There is no replacement for it. The method was used to generate a set of values for use in creating a message type context filter dropdown which is now generated differently via %s',
206
+					'event_espresso'
207
+				),
208
+				'Messages_Admin_Page::get_contexts_for_message_types_select_input()'
209
+			),
210
+			'4.9.9.rc.014'
211
+		);
212
+
213
+		$contexts = array();
214
+		$active_message_contexts = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
215
+		foreach ($active_message_contexts as $active_message) {
216
+			if ($active_message instanceof EE_Message) {
217
+				$message_type = $active_message->message_type_object();
218
+				if ($message_type instanceof EE_message_type) {
219
+					$message_type_contexts = $message_type->get_contexts();
220
+					foreach ($message_type_contexts as $context => $context_details) {
221
+						$contexts[ $context ] = $context_details['label'];
222
+					}
223
+				}
224
+			}
225
+		}
226
+
227
+		return $contexts;
228
+	}
229
+
230
+
231
+	/**
232
+	 * Generate select input with provided messenger options array.
233
+	 *
234
+	 * @param array $messenger_options Array of messengers indexed by messenger slug and values are the messenger
235
+	 *                                 labels.
236
+	 * @return string
237
+	 * @throws EE_Error
238
+	 */
239
+	public function get_messengers_select_input($messenger_options)
240
+	{
241
+		// if empty or just one value then just return an empty string
242
+		if (empty($messenger_options)
243
+			|| ! is_array($messenger_options)
244
+			|| count($messenger_options) === 1
245
+		) {
246
+			return '';
247
+		}
248
+		// merge in default
249
+		$messenger_options = array_merge(
250
+			array('none_selected' => esc_html__('Show All Messengers', 'event_espresso')),
251
+			$messenger_options
252
+		);
253
+		$input = new EE_Select_Input(
254
+			$messenger_options,
255
+			array(
256
+				'html_name'  => 'ee_messenger_filter_by',
257
+				'html_id'    => 'ee_messenger_filter_by',
258
+				'html_class' => 'wide',
259
+				'default'    => isset($this->_req_data['ee_messenger_filter_by'])
260
+					? sanitize_title($this->_req_data['ee_messenger_filter_by'])
261
+					: 'none_selected',
262
+			)
263
+		);
264
+
265
+		return $input->get_html_for_input();
266
+	}
267
+
268
+
269
+	/**
270
+	 * Generate select input with provided message type options array.
271
+	 *
272
+	 * @param array $message_type_options Array of message types indexed by message type slug, and values are the
273
+	 *                                    message type labels
274
+	 * @return string
275
+	 * @throws EE_Error
276
+	 */
277
+	public function get_message_types_select_input($message_type_options)
278
+	{
279
+		// if empty or count of options is 1 then just return an empty string
280
+		if (empty($message_type_options)
281
+			|| ! is_array($message_type_options)
282
+			|| count($message_type_options) === 1
283
+		) {
284
+			return '';
285
+		}
286
+		// merge in default
287
+		$message_type_options = array_merge(
288
+			array('none_selected' => esc_html__('Show All Message Types', 'event_espresso')),
289
+			$message_type_options
290
+		);
291
+		$input = new EE_Select_Input(
292
+			$message_type_options,
293
+			array(
294
+				'html_name'  => 'ee_message_type_filter_by',
295
+				'html_id'    => 'ee_message_type_filter_by',
296
+				'html_class' => 'wide',
297
+				'default'    => isset($this->_req_data['ee_message_type_filter_by'])
298
+					? sanitize_title($this->_req_data['ee_message_type_filter_by'])
299
+					: 'none_selected',
300
+			)
301
+		);
302
+
303
+		return $input->get_html_for_input();
304
+	}
305
+
306
+
307
+	/**
308
+	 * Generate select input with provide message type contexts array.
309
+	 *
310
+	 * @param array $context_options Array of message type contexts indexed by context slug, and values are the
311
+	 *                               context label.
312
+	 * @return string
313
+	 * @throws EE_Error
314
+	 */
315
+	public function get_contexts_for_message_types_select_input($context_options)
316
+	{
317
+		// if empty or count of options is one then just return empty string
318
+		if (empty($context_options)
319
+			|| ! is_array($context_options)
320
+			|| count($context_options) === 1
321
+		) {
322
+			return '';
323
+		}
324
+		// merge in default
325
+		$context_options = array_merge(
326
+			array('none_selected' => esc_html__('Show all Contexts', 'event_espresso')),
327
+			$context_options
328
+		);
329
+		$input = new EE_Select_Input(
330
+			$context_options,
331
+			array(
332
+				'html_name'  => 'ee_context_filter_by',
333
+				'html_id'    => 'ee_context_filter_by',
334
+				'html_class' => 'wide',
335
+				'default'    => isset($this->_req_data['ee_context_filter_by'])
336
+					? sanitize_title($this->_req_data['ee_context_filter_by'])
337
+					: 'none_selected',
338
+			)
339
+		);
340
+
341
+		return $input->get_html_for_input();
342
+	}
343
+
344
+
345
+	protected function _ajax_hooks()
346
+	{
347
+		add_action('wp_ajax_activate_messenger', array($this, 'activate_messenger_toggle'));
348
+		add_action('wp_ajax_activate_mt', array($this, 'activate_mt_toggle'));
349
+		add_action('wp_ajax_ee_msgs_save_settings', array($this, 'save_settings'));
350
+		add_action('wp_ajax_ee_msgs_update_mt_form', array($this, 'update_mt_form'));
351
+		add_action('wp_ajax_switch_template_pack', array($this, 'switch_template_pack'));
352
+		add_action('wp_ajax_toggle_context_template', array($this, 'toggle_context_template'));
353
+	}
354
+
355
+
356
+	protected function _define_page_props()
357
+	{
358
+		$this->_admin_page_title = $this->page_label;
359
+		$this->_labels = array(
360
+			'buttons'    => array(
361
+				'add'    => esc_html__('Add New Message Template', 'event_espresso'),
362
+				'edit'   => esc_html__('Edit Message Template', 'event_espresso'),
363
+				'delete' => esc_html__('Delete Message Template', 'event_espresso'),
364
+			),
365
+			'publishbox' => esc_html__('Update Actions', 'event_espresso'),
366
+		);
367
+	}
368
+
369
+
370
+	/**
371
+	 *        an array for storing key => value pairs of request actions and their corresponding methods
372
+	 *
373
+	 * @access protected
374
+	 * @return void
375
+	 */
376
+	protected function _set_page_routes()
377
+	{
378
+		$grp_id = ! empty($this->_req_data['GRP_ID']) && ! is_array($this->_req_data['GRP_ID'])
379
+			? $this->_req_data['GRP_ID']
380
+			: 0;
381
+		$grp_id = empty($grp_id) && ! empty($this->_req_data['id'])
382
+			? $this->_req_data['id']
383
+			: $grp_id;
384
+		$msg_id = ! empty($this->_req_data['MSG_ID']) && ! is_array($this->_req_data['MSG_ID'])
385
+			? $this->_req_data['MSG_ID']
386
+			: 0;
387
+
388
+		$this->_page_routes = array(
389
+			'default'                          => array(
390
+				'func'       => '_message_queue_list_table',
391
+				'capability' => 'ee_read_global_messages',
392
+			),
393
+			'global_mtps'                      => array(
394
+				'func'       => '_ee_default_messages_overview_list_table',
395
+				'capability' => 'ee_read_global_messages',
396
+			),
397
+			'custom_mtps'                      => array(
398
+				'func'       => '_custom_mtps_preview',
399
+				'capability' => 'ee_read_messages',
400
+			),
401
+			'add_new_message_template'         => array(
402
+				'func'       => '_add_message_template',
403
+				'capability' => 'ee_edit_messages',
404
+				'noheader'   => true,
405
+			),
406
+			'edit_message_template'            => array(
407
+				'func'       => '_edit_message_template',
408
+				'capability' => 'ee_edit_message',
409
+				'obj_id'     => $grp_id,
410
+			),
411
+			'preview_message'                  => array(
412
+				'func'               => '_preview_message',
413
+				'capability'         => 'ee_read_message',
414
+				'obj_id'             => $grp_id,
415
+				'noheader'           => true,
416
+				'headers_sent_route' => 'display_preview_message',
417
+			),
418
+			'display_preview_message'          => array(
419
+				'func'       => '_display_preview_message',
420
+				'capability' => 'ee_read_message',
421
+				'obj_id'     => $grp_id,
422
+			),
423
+			'insert_message_template'          => array(
424
+				'func'       => '_insert_or_update_message_template',
425
+				'capability' => 'ee_edit_messages',
426
+				'args'       => array('new_template' => true),
427
+				'noheader'   => true,
428
+			),
429
+			'update_message_template'          => array(
430
+				'func'       => '_insert_or_update_message_template',
431
+				'capability' => 'ee_edit_message',
432
+				'obj_id'     => $grp_id,
433
+				'args'       => array('new_template' => false),
434
+				'noheader'   => true,
435
+			),
436
+			'trash_message_template'           => array(
437
+				'func'       => '_trash_or_restore_message_template',
438
+				'capability' => 'ee_delete_message',
439
+				'obj_id'     => $grp_id,
440
+				'args'       => array('trash' => true, 'all' => true),
441
+				'noheader'   => true,
442
+			),
443
+			'trash_message_template_context'   => array(
444
+				'func'       => '_trash_or_restore_message_template',
445
+				'capability' => 'ee_delete_message',
446
+				'obj_id'     => $grp_id,
447
+				'args'       => array('trash' => true),
448
+				'noheader'   => true,
449
+			),
450
+			'restore_message_template'         => array(
451
+				'func'       => '_trash_or_restore_message_template',
452
+				'capability' => 'ee_delete_message',
453
+				'obj_id'     => $grp_id,
454
+				'args'       => array('trash' => false, 'all' => true),
455
+				'noheader'   => true,
456
+			),
457
+			'restore_message_template_context' => array(
458
+				'func'       => '_trash_or_restore_message_template',
459
+				'capability' => 'ee_delete_message',
460
+				'obj_id'     => $grp_id,
461
+				'args'       => array('trash' => false),
462
+				'noheader'   => true,
463
+			),
464
+			'delete_message_template'          => array(
465
+				'func'       => '_delete_message_template',
466
+				'capability' => 'ee_delete_message',
467
+				'obj_id'     => $grp_id,
468
+				'noheader'   => true,
469
+			),
470
+			'reset_to_default'                 => array(
471
+				'func'       => '_reset_to_default_template',
472
+				'capability' => 'ee_edit_message',
473
+				'obj_id'     => $grp_id,
474
+				'noheader'   => true,
475
+			),
476
+			'settings'                         => array(
477
+				'func'       => '_settings',
478
+				'capability' => 'manage_options',
479
+			),
480
+			'update_global_settings'           => array(
481
+				'func'       => '_update_global_settings',
482
+				'capability' => 'manage_options',
483
+				'noheader'   => true,
484
+			),
485
+			'generate_now'                     => array(
486
+				'func'       => '_generate_now',
487
+				'capability' => 'ee_send_message',
488
+				'noheader'   => true,
489
+			),
490
+			'generate_and_send_now'            => array(
491
+				'func'       => '_generate_and_send_now',
492
+				'capability' => 'ee_send_message',
493
+				'noheader'   => true,
494
+			),
495
+			'queue_for_resending'              => array(
496
+				'func'       => '_queue_for_resending',
497
+				'capability' => 'ee_send_message',
498
+				'noheader'   => true,
499
+			),
500
+			'send_now'                         => array(
501
+				'func'       => '_send_now',
502
+				'capability' => 'ee_send_message',
503
+				'noheader'   => true,
504
+			),
505
+			'delete_ee_message'                => array(
506
+				'func'       => '_delete_ee_messages',
507
+				'capability' => 'ee_delete_messages',
508
+				'noheader'   => true,
509
+			),
510
+			'delete_ee_messages'               => array(
511
+				'func'       => '_delete_ee_messages',
512
+				'capability' => 'ee_delete_messages',
513
+				'noheader'   => true,
514
+				'obj_id'     => $msg_id,
515
+			),
516
+		);
517
+	}
518
+
519
+
520
+	protected function _set_page_config()
521
+	{
522
+		$this->_page_config = array(
523
+			'default'                  => array(
524
+				'nav'           => array(
525
+					'label' => esc_html__('Message Activity', 'event_espresso'),
526
+					'order' => 10,
527
+				),
528
+				'list_table'    => 'EE_Message_List_Table',
529
+				// 'qtips' => array( 'EE_Message_List_Table_Tips' ),
530
+				'require_nonce' => false,
531
+			),
532
+			'global_mtps'              => array(
533
+				'nav'           => array(
534
+					'label' => esc_html__('Default Message Templates', 'event_espresso'),
535
+					'order' => 20,
536
+				),
537
+				'list_table'    => 'Messages_Template_List_Table',
538
+				'help_tabs'     => array(
539
+					'messages_overview_help_tab'                                => array(
540
+						'title'    => esc_html__('Messages Overview', 'event_espresso'),
541
+						'filename' => 'messages_overview',
542
+					),
543
+					'messages_overview_messages_table_column_headings_help_tab' => array(
544
+						'title'    => esc_html__('Messages Table Column Headings', 'event_espresso'),
545
+						'filename' => 'messages_overview_table_column_headings',
546
+					),
547
+					'messages_overview_messages_filters_help_tab'               => array(
548
+						'title'    => esc_html__('Message Filters', 'event_espresso'),
549
+						'filename' => 'messages_overview_filters',
550
+					),
551
+					'messages_overview_messages_views_help_tab'                 => array(
552
+						'title'    => esc_html__('Message Views', 'event_espresso'),
553
+						'filename' => 'messages_overview_views',
554
+					),
555
+					'message_overview_message_types_help_tab'                   => array(
556
+						'title'    => esc_html__('Message Types', 'event_espresso'),
557
+						'filename' => 'messages_overview_types',
558
+					),
559
+					'messages_overview_messengers_help_tab'                     => array(
560
+						'title'    => esc_html__('Messengers', 'event_espresso'),
561
+						'filename' => 'messages_overview_messengers',
562
+					),
563
+				),
564
+				'help_tour'     => array('Messages_Overview_Help_Tour'),
565
+				'require_nonce' => false,
566
+			),
567
+			'custom_mtps'              => array(
568
+				'nav'           => array(
569
+					'label' => esc_html__('Custom Message Templates', 'event_espresso'),
570
+					'order' => 30,
571
+				),
572
+				'help_tabs'     => array(),
573
+				'help_tour'     => array(),
574
+				'require_nonce' => false,
575
+			),
576
+			'add_new_message_template' => array(
577
+				'nav'           => array(
578
+					'label'      => esc_html__('Add New Message Templates', 'event_espresso'),
579
+					'order'      => 5,
580
+					'persistent' => false,
581
+				),
582
+				'require_nonce' => false,
583
+			),
584
+			'edit_message_template'    => array(
585
+				'labels'        => array(
586
+					'buttons'    => array(
587
+						'reset' => esc_html__('Reset Templates', 'event_espresso'),
588
+					),
589
+					'publishbox' => esc_html__('Update Actions', 'event_espresso'),
590
+				),
591
+				'nav'           => array(
592
+					'label'      => esc_html__('Edit Message Templates', 'event_espresso'),
593
+					'order'      => 5,
594
+					'persistent' => false,
595
+					'url'        => '',
596
+				),
597
+				'metaboxes'     => array('_publish_post_box', '_register_edit_meta_boxes'),
598
+				'has_metaboxes' => true,
599
+				'help_tour'     => array('Message_Templates_Edit_Help_Tour'),
600
+				'help_tabs'     => array(
601
+					'edit_message_template'            => array(
602
+						'title'    => esc_html__('Message Template Editor', 'event_espresso'),
603
+						'callback' => 'edit_message_template_help_tab',
604
+					),
605
+					'message_templates_help_tab'       => array(
606
+						'title'    => esc_html__('Message Templates', 'event_espresso'),
607
+						'filename' => 'messages_templates',
608
+					),
609
+					'message_template_shortcodes'      => array(
610
+						'title'    => esc_html__('Message Shortcodes', 'event_espresso'),
611
+						'callback' => 'message_template_shortcodes_help_tab',
612
+					),
613
+					'message_preview_help_tab'         => array(
614
+						'title'    => esc_html__('Message Preview', 'event_espresso'),
615
+						'filename' => 'messages_preview',
616
+					),
617
+					'messages_overview_other_help_tab' => array(
618
+						'title'    => esc_html__('Messages Other', 'event_espresso'),
619
+						'filename' => 'messages_overview_other',
620
+					),
621
+				),
622
+				'require_nonce' => false,
623
+			),
624
+			'display_preview_message'  => array(
625
+				'nav'           => array(
626
+					'label'      => esc_html__('Message Preview', 'event_espresso'),
627
+					'order'      => 5,
628
+					'url'        => '',
629
+					'persistent' => false,
630
+				),
631
+				'help_tabs'     => array(
632
+					'preview_message' => array(
633
+						'title'    => esc_html__('About Previews', 'event_espresso'),
634
+						'callback' => 'preview_message_help_tab',
635
+					),
636
+				),
637
+				'require_nonce' => false,
638
+			),
639
+			'settings'                 => array(
640
+				'nav'           => array(
641
+					'label' => esc_html__('Settings', 'event_espresso'),
642
+					'order' => 40,
643
+				),
644
+				'metaboxes'     => array('_messages_settings_metaboxes'),
645
+				'help_tabs'     => array(
646
+					'messages_settings_help_tab'               => array(
647
+						'title'    => esc_html__('Messages Settings', 'event_espresso'),
648
+						'filename' => 'messages_settings',
649
+					),
650
+					'messages_settings_message_types_help_tab' => array(
651
+						'title'    => esc_html__('Activating / Deactivating Message Types', 'event_espresso'),
652
+						'filename' => 'messages_settings_message_types',
653
+					),
654
+					'messages_settings_messengers_help_tab'    => array(
655
+						'title'    => esc_html__('Activating / Deactivating Messengers', 'event_espresso'),
656
+						'filename' => 'messages_settings_messengers',
657
+					),
658
+				),
659
+				'help_tour'     => array('Messages_Settings_Help_Tour'),
660
+				'require_nonce' => false,
661
+			),
662
+		);
663
+	}
664
+
665
+
666
+	protected function _add_screen_options()
667
+	{
668
+		// todo
669
+	}
670
+
671
+
672
+	protected function _add_screen_options_global_mtps()
673
+	{
674
+		/**
675
+		 * Note: the reason for the value swap here on $this->_admin_page_title is because $this->_per_page_screen_options
676
+		 * uses the $_admin_page_title property and we want different outputs in the different spots.
677
+		 */
678
+		$page_title = $this->_admin_page_title;
679
+		$this->_admin_page_title = esc_html__('Global Message Templates', 'event_espresso');
680
+		$this->_per_page_screen_option();
681
+		$this->_admin_page_title = $page_title;
682
+	}
683
+
684
+
685
+	protected function _add_screen_options_default()
686
+	{
687
+		$this->_admin_page_title = esc_html__('Message Activity', 'event_espresso');
688
+		$this->_per_page_screen_option();
689
+	}
690
+
691
+
692
+	// none of the below group are currently used for Messages
693
+	protected function _add_feature_pointers()
694
+	{
695
+	}
696
+
697
+	public function admin_init()
698
+	{
699
+	}
700
+
701
+	public function admin_notices()
702
+	{
703
+	}
704
+
705
+	public function admin_footer_scripts()
706
+	{
707
+	}
708
+
709
+
710
+	public function messages_help_tab()
711
+	{
712
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
713
+	}
714
+
715
+
716
+	public function messengers_help_tab()
717
+	{
718
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
719
+	}
720
+
721
+
722
+	public function message_types_help_tab()
723
+	{
724
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
725
+	}
726
+
727
+
728
+	public function messages_overview_help_tab()
729
+	{
730
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
731
+	}
732
+
733
+
734
+	public function message_templates_help_tab()
735
+	{
736
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
737
+	}
738
+
739
+
740
+	public function edit_message_template_help_tab()
741
+	{
742
+		$args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="'
743
+						. esc_attr__('Editor Title', 'event_espresso')
744
+						. '" />';
745
+		$args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="'
746
+						. esc_attr__('Context Switcher and Preview', 'event_espresso')
747
+						. '" />';
748
+		$args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="'
749
+						. esc_attr__('Message Template Form Fields', 'event_espresso')
750
+						. '" />';
751
+		$args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="'
752
+						. esc_attr__('Shortcodes Metabox', 'event_espresso')
753
+						. '" />';
754
+		$args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="'
755
+						. esc_attr__('Publish Metabox', 'event_espresso')
756
+						. '" />';
757
+		EEH_Template::display_template(
758
+			EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_templates_editor_help_tab.template.php',
759
+			$args
760
+		);
761
+	}
762
+
763
+
764
+	public function message_template_shortcodes_help_tab()
765
+	{
766
+		$this->_set_shortcodes();
767
+		$args['shortcodes'] = $this->_shortcodes;
768
+		EEH_Template::display_template(
769
+			EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
770
+			$args
771
+		);
772
+	}
773
+
774
+
775
+	public function preview_message_help_tab()
776
+	{
777
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
778
+	}
779
+
780
+
781
+	public function settings_help_tab()
782
+	{
783
+		$args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png'
784
+						. '" alt="' . esc_attr__('Active Email Tab', 'event_espresso') . '" />';
785
+		$args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png'
786
+						. '" alt="' . esc_attr__('Inactive Email Tab', 'event_espresso') . '" />';
787
+		$args['img3'] = '<div class="switch">'
788
+						. '<input class="ee-on-off-toggle ee-toggle-round-flat"'
789
+						. ' type="checkbox" checked="checked">'
790
+						. '<label for="ee-on-off-toggle-on"></label>'
791
+						. '</div>';
792
+		$args['img4'] = '<div class="switch">'
793
+						. '<input class="ee-on-off-toggle ee-toggle-round-flat"'
794
+						. ' type="checkbox">'
795
+						. '<label for="ee-on-off-toggle-on"></label>'
796
+						. '</div>';
797
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
798
+	}
799
+
800
+
801
+	public function load_scripts_styles()
802
+	{
803
+		wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
804
+		wp_enqueue_style('espresso_ee_msg');
805
+
806
+		wp_register_script(
807
+			'ee-messages-settings',
808
+			EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
809
+			array('jquery-ui-droppable', 'ee-serialize-full-array'),
810
+			EVENT_ESPRESSO_VERSION,
811
+			true
812
+		);
813
+		wp_register_script(
814
+			'ee-msg-list-table-js',
815
+			EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
816
+			array('ee-dialog'),
817
+			EVENT_ESPRESSO_VERSION
818
+		);
819
+	}
820
+
821
+
822
+	public function load_scripts_styles_default()
823
+	{
824
+		wp_enqueue_script('ee-msg-list-table-js');
825
+	}
826
+
827
+
828
+	public function wp_editor_css($mce_css)
829
+	{
830
+		// if we're on the edit_message_template route
831
+		if ($this->_req_action === 'edit_message_template' && $this->_active_messenger instanceof EE_messenger) {
832
+			$message_type_name = $this->_active_message_type_name;
833
+
834
+			// we're going to REPLACE the existing mce css
835
+			// we need to get the css file location from the active messenger
836
+			$mce_css = $this->_active_messenger->get_variation(
837
+				$this->_template_pack,
838
+				$message_type_name,
839
+				true,
840
+				'wpeditor',
841
+				$this->_variation
842
+			);
843
+		}
844
+
845
+		return $mce_css;
846
+	}
847
+
848
+
849
+	public function load_scripts_styles_edit_message_template()
850
+	{
851
+
852
+		$this->_set_shortcodes();
853
+
854
+		EE_Registry::$i18n_js_strings['confirm_default_reset'] = sprintf(
855
+			esc_html__(
856
+				'Are you sure you want to reset the %s %s message templates?  Remember continuing will reset the templates for all contexts in this messenger and message type group.',
857
+				'event_espresso'
858
+			),
859
+			$this->_message_template_group->messenger_obj()->label['singular'],
860
+			$this->_message_template_group->message_type_obj()->label['singular']
861
+		);
862
+		EE_Registry::$i18n_js_strings['confirm_switch_template_pack'] = esc_html__(
863
+			'Switching the template pack for a messages template will reset the content for the template so the new layout is loaded.  Any custom content in the existing template will be lost. Are you sure you wish to do this?',
864
+			'event_espresso'
865
+		);
866
+		EE_Registry::$i18n_js_strings['server_error'] = esc_html__(
867
+			'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
868
+			'event_espresso'
869
+		);
870
+
871
+		wp_register_script(
872
+			'ee_msgs_edit_js',
873
+			EE_MSG_ASSETS_URL . 'ee_message_editor.js',
874
+			array('jquery'),
875
+			EVENT_ESPRESSO_VERSION
876
+		);
877
+
878
+		wp_enqueue_script('ee_admin_js');
879
+		wp_enqueue_script('ee_msgs_edit_js');
880
+
881
+		// add in special css for tiny_mce
882
+		add_filter('mce_css', array($this, 'wp_editor_css'));
883
+	}
884
+
885
+
886
+	public function load_scripts_styles_display_preview_message()
887
+	{
888
+
889
+		$this->_set_message_template_group();
890
+
891
+		if (isset($this->_req_data['messenger'])) {
892
+			$this->_active_messenger = $this->_message_resource_manager->get_active_messenger(
893
+				$this->_req_data['messenger']
894
+			);
895
+		}
896
+
897
+		$message_type_name = isset($this->_req_data['message_type']) ? $this->_req_data['message_type'] : '';
898
+
899
+
900
+		wp_enqueue_style(
901
+			'espresso_preview_css',
902
+			$this->_active_messenger->get_variation(
903
+				$this->_template_pack,
904
+				$message_type_name,
905
+				true,
906
+				'preview',
907
+				$this->_variation
908
+			)
909
+		);
910
+	}
911
+
912
+
913
+	public function load_scripts_styles_settings()
914
+	{
915
+		wp_register_style(
916
+			'ee-message-settings',
917
+			EE_MSG_ASSETS_URL . 'ee_message_settings.css',
918
+			array(),
919
+			EVENT_ESPRESSO_VERSION
920
+		);
921
+		wp_enqueue_style('ee-text-links');
922
+		wp_enqueue_style('ee-message-settings');
923
+		wp_enqueue_script('ee-messages-settings');
924
+	}
925
+
926
+
927
+	/**
928
+	 * set views array for List Table
929
+	 */
930
+	public function _set_list_table_views_global_mtps()
931
+	{
932
+		$this->_views = array(
933
+			'in_use' => array(
934
+				'slug'  => 'in_use',
935
+				'label' => esc_html__('In Use', 'event_espresso'),
936
+				'count' => 0,
937
+			),
938
+		);
939
+	}
940
+
941
+
942
+	/**
943
+	 * Set views array for the Custom Template List Table
944
+	 */
945
+	public function _set_list_table_views_custom_mtps()
946
+	{
947
+		$this->_set_list_table_views_global_mtps();
948
+		$this->_views['in_use']['bulk_action'] = array(
949
+			'trash_message_template' => esc_html__('Move to Trash', 'event_espresso'),
950
+		);
951
+	}
952
+
953
+
954
+	/**
955
+	 * set views array for message queue list table
956
+	 *
957
+	 * @throws InvalidDataTypeException
958
+	 * @throws InvalidInterfaceException
959
+	 * @throws InvalidArgumentException
960
+	 * @throws EE_Error
961
+	 * @throws ReflectionException
962
+	 */
963
+	public function _set_list_table_views_default()
964
+	{
965
+		EE_Registry::instance()->load_helper('Template');
966
+
967
+		$common_bulk_actions = EE_Registry::instance()->CAP->current_user_can(
968
+			'ee_send_message',
969
+			'message_list_table_bulk_actions'
970
+		)
971
+			? array(
972
+				'generate_now'          => esc_html__('Generate Now', 'event_espresso'),
973
+				'generate_and_send_now' => esc_html__('Generate and Send Now', 'event_espresso'),
974
+				'queue_for_resending'   => esc_html__('Queue for Resending', 'event_espresso'),
975
+				'send_now'              => esc_html__('Send Now', 'event_espresso'),
976
+			)
977
+			: array();
978
+
979
+		$delete_bulk_action = EE_Registry::instance()->CAP->current_user_can(
980
+			'ee_delete_messages',
981
+			'message_list_table_bulk_actions'
982
+		)
983
+			? array('delete_ee_messages' => esc_html__('Delete Messages', 'event_espresso'))
984
+			: array();
985
+
986
+
987
+		$this->_views = array(
988
+			'all' => array(
989
+				'slug'        => 'all',
990
+				'label'       => esc_html__('All', 'event_espresso'),
991
+				'count'       => 0,
992
+				'bulk_action' => array_merge($common_bulk_actions, $delete_bulk_action),
993
+			),
994
+		);
995
+
996
+
997
+		foreach (EEM_Message::instance()->all_statuses() as $status) {
998
+			if ($status === EEM_Message::status_debug_only && ! EEM_Message::debug()) {
999
+				continue;
1000
+			}
1001
+			$status_bulk_actions = $common_bulk_actions;
1002
+			// unset bulk actions not applying to status
1003
+			if (! empty($status_bulk_actions)) {
1004
+				switch ($status) {
1005
+					case EEM_Message::status_idle:
1006
+					case EEM_Message::status_resend:
1007
+						$status_bulk_actions['send_now'] = $common_bulk_actions['send_now'];
1008
+						break;
1009
+
1010
+					case EEM_Message::status_failed:
1011
+					case EEM_Message::status_debug_only:
1012
+					case EEM_Message::status_messenger_executing:
1013
+						$status_bulk_actions = array();
1014
+						break;
1015
+
1016
+					case EEM_Message::status_incomplete:
1017
+						unset($status_bulk_actions['queue_for_resending'], $status_bulk_actions['send_now']);
1018
+						break;
1019
+
1020
+					case EEM_Message::status_retry:
1021
+					case EEM_Message::status_sent:
1022
+						unset($status_bulk_actions['generate_now'], $status_bulk_actions['generate_and_send_now']);
1023
+						break;
1024
+				}
1025
+			}
1026
+
1027
+			// skip adding messenger executing status to views because it will be included with the Failed view.
1028
+			if ($status === EEM_Message::status_messenger_executing) {
1029
+				continue;
1030
+			}
1031
+
1032
+			$this->_views[ strtolower($status) ] = array(
1033
+				'slug'        => strtolower($status),
1034
+				'label'       => EEH_Template::pretty_status($status, false, 'sentence'),
1035
+				'count'       => 0,
1036
+				'bulk_action' => array_merge($status_bulk_actions, $delete_bulk_action),
1037
+			);
1038
+		}
1039
+	}
1040
+
1041
+
1042
+	protected function _ee_default_messages_overview_list_table()
1043
+	{
1044
+		$this->_admin_page_title = esc_html__('Default Message Templates', 'event_espresso');
1045
+		$this->display_admin_list_table_page_with_no_sidebar();
1046
+	}
1047
+
1048
+
1049
+	protected function _message_queue_list_table()
1050
+	{
1051
+		$this->_search_btn_label = esc_html__('Message Activity', 'event_espresso');
1052
+		$this->_template_args['per_column'] = 6;
1053
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_message_legend_items());
1054
+		$this->_template_args['before_list_table'] = '<h3>'
1055
+													 . EEM_Message::instance()->get_pretty_label_for_results()
1056
+													 . '</h3>';
1057
+		$this->display_admin_list_table_page_with_no_sidebar();
1058
+	}
1059
+
1060
+
1061
+	protected function _message_legend_items()
1062
+	{
1063
+
1064
+		$action_css_classes = EEH_MSG_Template::get_message_action_icons();
1065
+		$action_items = array();
1066
+
1067
+		foreach ($action_css_classes as $action_item => $action_details) {
1068
+			if ($action_item === 'see_notifications_for') {
1069
+				continue;
1070
+			}
1071
+			$action_items[ $action_item ] = array(
1072
+				'class' => $action_details['css_class'],
1073
+				'desc'  => $action_details['label'],
1074
+			);
1075
+		}
1076
+
1077
+		/** @type array $status_items status legend setup */
1078
+		$status_items = array(
1079
+			'sent_status'                => array(
1080
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
1081
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence'),
1082
+			),
1083
+			'idle_status'                => array(
1084
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
1085
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence'),
1086
+			),
1087
+			'failed_status'              => array(
1088
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
1089
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence'),
1090
+			),
1091
+			'messenger_executing_status' => array(
1092
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
1093
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence'),
1094
+			),
1095
+			'resend_status'              => array(
1096
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
1097
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence'),
1098
+			),
1099
+			'incomplete_status'          => array(
1100
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1101
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence'),
1102
+			),
1103
+			'retry_status'               => array(
1104
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1105
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence'),
1106
+			),
1107
+		);
1108
+		if (EEM_Message::debug()) {
1109
+			$status_items['debug_only_status'] = array(
1110
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1111
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence'),
1112
+			);
1113
+		}
1114
+
1115
+		return array_merge($action_items, $status_items);
1116
+	}
1117
+
1118
+
1119
+	protected function _custom_mtps_preview()
1120
+	{
1121
+		$this->_admin_page_title = esc_html__('Custom Message Templates (Preview)', 'event_espresso');
1122
+		$this->_template_args['preview_img'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png"'
1123
+											   . ' alt="' . esc_attr__(
1124
+												   'Preview Custom Message Templates screenshot',
1125
+												   'event_espresso'
1126
+											   ) . '" />';
1127
+		$this->_template_args['preview_text'] = '<strong>'
1128
+												. esc_html__(
1129
+													'Custom Message Templates is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Custom Message Templates feature, you are able to create custom message templates and assign them on a per-event basis.',
1130
+													'event_espresso'
1131
+												)
1132
+												. '</strong>';
1133
+
1134
+		$this->display_admin_caf_preview_page('custom_message_types', false);
1135
+	}
1136
+
1137
+
1138
+	/**
1139
+	 * get_message_templates
1140
+	 * This gets all the message templates for listing on the overview list.
1141
+	 *
1142
+	 * @access public
1143
+	 * @param int    $perpage the amount of templates groups to show per page
1144
+	 * @param string $type    the current _view we're getting templates for
1145
+	 * @param bool   $count   return count?
1146
+	 * @param bool   $all     disregard any paging info (get all data);
1147
+	 * @param bool   $global  whether to return just global (true) or custom templates (false)
1148
+	 * @return array
1149
+	 * @throws EE_Error
1150
+	 * @throws InvalidArgumentException
1151
+	 * @throws InvalidDataTypeException
1152
+	 * @throws InvalidInterfaceException
1153
+	 */
1154
+	public function get_message_templates(
1155
+		$perpage = 10,
1156
+		$type = 'in_use',
1157
+		$count = false,
1158
+		$all = false,
1159
+		$global = true
1160
+	) {
1161
+
1162
+		$MTP = EEM_Message_Template_Group::instance();
1163
+
1164
+		$this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? 'GRP_ID' : $this->_req_data['orderby'];
1165
+		$orderby = $this->_req_data['orderby'];
1166
+
1167
+		$order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
1168
+			? $this->_req_data['order']
1169
+			: 'ASC';
1170
+
1171
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
1172
+			? $this->_req_data['paged']
1173
+			: 1;
1174
+		$per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
1175
+			? $this->_req_data['perpage']
1176
+			: $perpage;
1177
+
1178
+		$offset = ($current_page - 1) * $per_page;
1179
+		$limit = $all ? null : array($offset, $per_page);
1180
+
1181
+
1182
+		// options will match what is in the _views array property
1183
+		switch ($type) {
1184
+			case 'in_use':
1185
+				$templates = $MTP->get_all_active_message_templates($orderby, $order, $limit, $count, $global, true);
1186
+				break;
1187
+			default:
1188
+				$templates = $MTP->get_all_trashed_grouped_message_templates($orderby, $order, $limit, $count, $global);
1189
+		}
1190
+
1191
+		return $templates;
1192
+	}
1193
+
1194
+
1195
+	/**
1196
+	 * filters etc might need a list of installed message_types
1197
+	 *
1198
+	 * @return array an array of message type objects
1199
+	 */
1200
+	public function get_installed_message_types()
1201
+	{
1202
+		$installed_message_types = $this->_message_resource_manager->installed_message_types();
1203
+		$installed = array();
1204
+
1205
+		foreach ($installed_message_types as $message_type) {
1206
+			$installed[ $message_type->name ] = $message_type;
1207
+		}
1208
+
1209
+		return $installed;
1210
+	}
1211
+
1212
+
1213
+	/**
1214
+	 * _add_message_template
1215
+	 *
1216
+	 * This is used when creating a custom template. All Custom Templates start based off another template.
1217
+	 *
1218
+	 * @param string $message_type
1219
+	 * @param string $messenger
1220
+	 * @param string $GRP_ID
1221
+	 *
1222
+	 * @throws EE_error
1223
+	 */
1224
+	protected function _add_message_template($message_type = '', $messenger = '', $GRP_ID = '')
1225
+	{
1226
+		// set values override any request data
1227
+		$message_type = ! empty($message_type) ? $message_type : '';
1228
+		$message_type = empty($message_type) && ! empty($this->_req_data['message_type'])
1229
+			? $this->_req_data['message_type']
1230
+			: $message_type;
1231
+
1232
+		$messenger = ! empty($messenger) ? $messenger : '';
1233
+		$messenger = empty($messenger) && ! empty($this->_req_data['messenger'])
1234
+			? $this->_req_data['messenger']
1235
+			: $messenger;
1236
+
1237
+		$GRP_ID = ! empty($GRP_ID) ? $GRP_ID : '';
1238
+		$GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : $GRP_ID;
1239
+
1240
+		// we need messenger and message type.  They should be coming from the event editor. If not here then return error
1241
+		if (empty($message_type) || empty($messenger)) {
1242
+			throw new EE_Error(
1243
+				esc_html__(
1244
+					'Sorry, but we can\'t create new templates because we\'re missing the messenger or message type',
1245
+					'event_espresso'
1246
+				)
1247
+			);
1248
+		}
1249
+
1250
+		// we need the GRP_ID for the template being used as the base for the new template
1251
+		if (empty($GRP_ID)) {
1252
+			throw new EE_Error(
1253
+				esc_html__(
1254
+					'In order to create a custom message template the GRP_ID of the template being used as a base is needed',
1255
+					'event_espresso'
1256
+				)
1257
+			);
1258
+		}
1259
+
1260
+		// let's just make sure the template gets generated!
1261
+
1262
+		// we need to reassign some variables for what the insert is expecting
1263
+		$this->_req_data['MTP_messenger'] = $messenger;
1264
+		$this->_req_data['MTP_message_type'] = $message_type;
1265
+		$this->_req_data['GRP_ID'] = $GRP_ID;
1266
+		$this->_insert_or_update_message_template(true);
1267
+	}
1268
+
1269
+
1270
+	/**
1271
+	 * public wrapper for the _add_message_template method
1272
+	 *
1273
+	 * @param string $message_type     message type slug
1274
+	 * @param string $messenger        messenger slug
1275
+	 * @param int    $GRP_ID           GRP_ID for the related message template group this new template will be based
1276
+	 *                                 off of.
1277
+	 * @throws EE_error
1278
+	 */
1279
+	public function add_message_template($message_type, $messenger, $GRP_ID)
1280
+	{
1281
+		$this->_add_message_template($message_type, $messenger, $GRP_ID);
1282
+	}
1283
+
1284
+
1285
+	/**
1286
+	 * _edit_message_template
1287
+	 *
1288
+	 * @access protected
1289
+	 * @return void
1290
+	 * @throws InvalidIdentifierException
1291
+	 * @throws DomainException
1292
+	 * @throws EE_Error
1293
+	 * @throws InvalidArgumentException
1294
+	 * @throws ReflectionException
1295
+	 * @throws InvalidDataTypeException
1296
+	 * @throws InvalidInterfaceException
1297
+	 */
1298
+	protected function _edit_message_template()
1299
+	{
1300
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1301
+		$template_fields = '';
1302
+		$sidebar_fields = '';
1303
+		// we filter the tinyMCE settings to remove the validation since message templates by their nature will not have
1304
+		// valid html in the templates.
1305
+		add_filter('tiny_mce_before_init', array($this, 'filter_tinymce_init'), 10, 2);
1306
+
1307
+		$GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
1308
+			? absint($this->_req_data['id'])
1309
+			: false;
1310
+
1311
+		$this->_set_shortcodes(); // this also sets the _message_template property.
1312
+		$message_template_group = $this->_message_template_group;
1313
+		$c_label = $message_template_group->context_label();
1314
+		$c_config = $message_template_group->contexts_config();
1315
+
1316
+		reset($c_config);
1317
+		$context = isset($this->_req_data['context']) && ! empty($this->_req_data['context'])
1318
+			? strtolower($this->_req_data['context'])
1319
+			: key($c_config);
1320
+
1321
+
1322
+		if (empty($GRP_ID)) {
1323
+			$action = 'insert_message_template';
1324
+			$edit_message_template_form_url = add_query_arg(
1325
+				array('action' => $action, 'noheader' => true),
1326
+				EE_MSG_ADMIN_URL
1327
+			);
1328
+		} else {
1329
+			$action = 'update_message_template';
1330
+			$edit_message_template_form_url = add_query_arg(
1331
+				array('action' => $action, 'noheader' => true),
1332
+				EE_MSG_ADMIN_URL
1333
+			);
1334
+		}
1335
+
1336
+		// set active messenger for this view
1337
+		$this->_active_messenger = $this->_message_resource_manager->get_active_messenger(
1338
+			$message_template_group->messenger()
1339
+		);
1340
+		$this->_active_message_type_name = $message_template_group->message_type();
1341
+
1342
+
1343
+		// Do we have any validation errors?
1344
+		$validators = $this->_get_transient();
1345
+		$v_fields = ! empty($validators) ? array_keys($validators) : array();
1346
+
1347
+
1348
+		// we need to assemble the title from Various details
1349
+		$context_label = sprintf(
1350
+			esc_html__('(%s %s)', 'event_espresso'),
1351
+			$c_config[ $context ]['label'],
1352
+			ucwords($c_label['label'])
1353
+		);
1354
+
1355
+		$title = sprintf(
1356
+			esc_html__(' %s %s Template %s', 'event_espresso'),
1357
+			ucwords($message_template_group->messenger_obj()->label['singular']),
1358
+			ucwords($message_template_group->message_type_obj()->label['singular']),
1359
+			$context_label
1360
+		);
1361
+
1362
+		$this->_template_args['GRP_ID'] = $GRP_ID;
1363
+		$this->_template_args['message_template'] = $message_template_group;
1364
+		$this->_template_args['is_extra_fields'] = false;
1365
+
1366
+
1367
+		// let's get EEH_MSG_Template so we can get template form fields
1368
+		$template_field_structure = EEH_MSG_Template::get_fields(
1369
+			$message_template_group->messenger(),
1370
+			$message_template_group->message_type()
1371
+		);
1372
+
1373
+		if (! $template_field_structure) {
1374
+			$template_field_structure = false;
1375
+			$template_fields = esc_html__(
1376
+				'There was an error in assembling the fields for this display (you should see an error message)',
1377
+				'event_espresso'
1378
+			);
1379
+		}
1380
+
1381
+
1382
+		$message_templates = $message_template_group->context_templates();
1383
+
1384
+
1385
+		// if we have the extra key.. then we need to remove the content index from the template_field_structure as it
1386
+		// will get handled in the "extra" array.
1387
+		if (is_array($template_field_structure[ $context ]) && isset($template_field_structure[ $context ]['extra'])) {
1388
+			foreach ($template_field_structure[ $context ]['extra'] as $reference_field => $new_fields) {
1389
+				unset($template_field_structure[ $context ][ $reference_field ]);
1390
+			}
1391
+		}
1392
+
1393
+		// let's loop through the template_field_structure and actually assemble the input fields!
1394
+		if (! empty($template_field_structure)) {
1395
+			foreach ($template_field_structure[ $context ] as $template_field => $field_setup_array) {
1396
+				// if this is an 'extra' template field then we need to remove any existing fields that are keyed up in
1397
+				// the extra array and reset them.
1398
+				if ($template_field === 'extra') {
1399
+					$this->_template_args['is_extra_fields'] = true;
1400
+					foreach ($field_setup_array as $reference_field => $new_fields_array) {
1401
+						$message_template = $message_templates[ $context ][ $reference_field ];
1402
+						$content = $message_template instanceof EE_Message_Template
1403
+							? $message_template->get('MTP_content')
1404
+							: '';
1405
+						foreach ($new_fields_array as $extra_field => $extra_array) {
1406
+							// let's verify if we need this extra field via the shortcodes parameter.
1407
+							$continue = false;
1408
+							if (isset($extra_array['shortcodes_required'])) {
1409
+								foreach ((array) $extra_array['shortcodes_required'] as $shortcode) {
1410
+									if (! array_key_exists($shortcode, $this->_shortcodes)) {
1411
+										$continue = true;
1412
+									}
1413
+								}
1414
+								if ($continue) {
1415
+									continue;
1416
+								}
1417
+							}
1418
+
1419
+							$field_id = $reference_field
1420
+										. '-'
1421
+										. $extra_field
1422
+										. '-content';
1423
+							$template_form_fields[ $field_id ] = $extra_array;
1424
+							$template_form_fields[ $field_id ]['name'] = 'MTP_template_fields['
1425
+																		 . $reference_field
1426
+																		 . '][content]['
1427
+																		 . $extra_field . ']';
1428
+							$css_class = isset($extra_array['css_class'])
1429
+								? $extra_array['css_class']
1430
+								: '';
1431
+
1432
+							$template_form_fields[ $field_id ]['css_class'] = ! empty($v_fields)
1433
+																			  && in_array($extra_field, $v_fields, true)
1434
+																			  &&
1435
+																			  (
1436
+																				  is_array($validators[ $extra_field ])
1437
+																				  && isset($validators[ $extra_field ]['msg'])
1438
+																			  )
1439
+								? 'validate-error ' . $css_class
1440
+								: $css_class;
1441
+
1442
+							$template_form_fields[ $field_id ]['value'] = ! empty($message_templates)
1443
+																		  && isset($content[ $extra_field ])
1444
+								? $content[ $extra_field ]
1445
+								: '';
1446
+
1447
+							// do we have a validation error?  if we do then let's use that value instead
1448
+							$template_form_fields[ $field_id ]['value'] = isset($validators[ $extra_field ])
1449
+								? $validators[ $extra_field ]['value']
1450
+								: $template_form_fields[ $field_id ]['value'];
1451
+
1452
+
1453
+							$template_form_fields[ $field_id ]['db-col'] = 'MTP_content';
1454
+
1455
+							// shortcode selector
1456
+							$field_name_to_use = $extra_field === 'main'
1457
+								? 'content'
1458
+								: $extra_field;
1459
+							$template_form_fields[ $field_id ]['append_content'] = $this->_get_shortcode_selector(
1460
+								$field_name_to_use,
1461
+								$field_id
1462
+							);
1463
+
1464
+							if (isset($extra_array['input']) && $extra_array['input'] === 'wp_editor') {
1465
+								// we want to decode the entities
1466
+								$template_form_fields[ $field_id ]['value'] = $template_form_fields[ $field_id ]['value'];
1467
+							}/**/
1468
+						}
1469
+						$templatefield_MTP_id = $reference_field . '-MTP_ID';
1470
+						$templatefield_templatename_id = $reference_field . '-name';
1471
+
1472
+						$template_form_fields[ $templatefield_MTP_id ] = array(
1473
+							'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1474
+							'label'      => null,
1475
+							'input'      => 'hidden',
1476
+							'type'       => 'int',
1477
+							'required'   => false,
1478
+							'validation' => false,
1479
+							'value'      => ! empty($message_templates) ? $message_template->ID() : '',
1480
+							'css_class'  => '',
1481
+							'format'     => '%d',
1482
+							'db-col'     => 'MTP_ID',
1483
+						);
1484
+
1485
+						$template_form_fields[ $templatefield_templatename_id ] = array(
1486
+							'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1487
+							'label'      => null,
1488
+							'input'      => 'hidden',
1489
+							'type'       => 'string',
1490
+							'required'   => false,
1491
+							'validation' => true,
1492
+							'value'      => $reference_field,
1493
+							'css_class'  => '',
1494
+							'format'     => '%s',
1495
+							'db-col'     => 'MTP_template_field',
1496
+						);
1497
+					}
1498
+					continue; // skip the next stuff, we got the necessary fields here for this dataset.
1499
+				} else {
1500
+					$field_id = $template_field . '-content';
1501
+					$template_form_fields[ $field_id ] = $field_setup_array;
1502
+					$template_form_fields[ $field_id ]['name'] = 'MTP_template_fields[' . $template_field . '][content]';
1503
+					$message_template = isset($message_templates[ $context ][ $template_field ])
1504
+						? $message_templates[ $context ][ $template_field ]
1505
+						: null;
1506
+					$template_form_fields[ $field_id ]['value'] = ! empty($message_templates)
1507
+																  && is_array($message_templates[ $context ])
1508
+																  && $message_template instanceof EE_Message_Template
1509
+						? $message_template->get('MTP_content')
1510
+						: '';
1511
+
1512
+					// do we have a validator error for this field?  if we do then we'll use that value instead
1513
+					$template_form_fields[ $field_id ]['value'] = isset($validators[ $template_field ])
1514
+						? $validators[ $template_field ]['value']
1515
+						: $template_form_fields[ $field_id ]['value'];
1516
+
1517
+
1518
+					$template_form_fields[ $field_id ]['db-col'] = 'MTP_content';
1519
+					$css_class = isset($field_setup_array['css_class'])
1520
+						? $field_setup_array['css_class']
1521
+						: '';
1522
+					$template_form_fields[ $field_id ]['css_class'] = ! empty($v_fields)
1523
+																	  && in_array($template_field, $v_fields, true)
1524
+																	  && isset($validators[ $template_field ]['msg'])
1525
+						? 'validate-error ' . $css_class
1526
+						: $css_class;
1527
+
1528
+					// shortcode selector
1529
+					$template_form_fields[ $field_id ]['append_content'] = $this->_get_shortcode_selector(
1530
+						$template_field,
1531
+						$field_id
1532
+					);
1533
+				}
1534
+
1535
+				// k took care of content field(s) now let's take care of others.
1536
+
1537
+				$templatefield_MTP_id = $template_field . '-MTP_ID';
1538
+				$templatefield_field_templatename_id = $template_field . '-name';
1539
+
1540
+				// foreach template field there are actually two form fields created
1541
+				$template_form_fields[ $templatefield_MTP_id ] = array(
1542
+					'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1543
+					'label'      => null,
1544
+					'input'      => 'hidden',
1545
+					'type'       => 'int',
1546
+					'required'   => false,
1547
+					'validation' => true,
1548
+					'value'      => $message_template instanceof EE_Message_Template ? $message_template->ID() : '',
1549
+					'css_class'  => '',
1550
+					'format'     => '%d',
1551
+					'db-col'     => 'MTP_ID',
1552
+				);
1553
+
1554
+				$template_form_fields[ $templatefield_field_templatename_id ] = array(
1555
+					'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1556
+					'label'      => null,
1557
+					'input'      => 'hidden',
1558
+					'type'       => 'string',
1559
+					'required'   => false,
1560
+					'validation' => true,
1561
+					'value'      => $template_field,
1562
+					'css_class'  => '',
1563
+					'format'     => '%s',
1564
+					'db-col'     => 'MTP_template_field',
1565
+				);
1566
+			}
1567
+
1568
+			// add other fields
1569
+			$template_form_fields['ee-msg-current-context'] = array(
1570
+				'name'       => 'MTP_context',
1571
+				'label'      => null,
1572
+				'input'      => 'hidden',
1573
+				'type'       => 'string',
1574
+				'required'   => false,
1575
+				'validation' => true,
1576
+				'value'      => $context,
1577
+				'css_class'  => '',
1578
+				'format'     => '%s',
1579
+				'db-col'     => 'MTP_context',
1580
+			);
1581
+
1582
+			$template_form_fields['ee-msg-grp-id'] = array(
1583
+				'name'       => 'GRP_ID',
1584
+				'label'      => null,
1585
+				'input'      => 'hidden',
1586
+				'type'       => 'int',
1587
+				'required'   => false,
1588
+				'validation' => true,
1589
+				'value'      => $GRP_ID,
1590
+				'css_class'  => '',
1591
+				'format'     => '%d',
1592
+				'db-col'     => 'GRP_ID',
1593
+			);
1594
+
1595
+			$template_form_fields['ee-msg-messenger'] = array(
1596
+				'name'       => 'MTP_messenger',
1597
+				'label'      => null,
1598
+				'input'      => 'hidden',
1599
+				'type'       => 'string',
1600
+				'required'   => false,
1601
+				'validation' => true,
1602
+				'value'      => $message_template_group->messenger(),
1603
+				'css_class'  => '',
1604
+				'format'     => '%s',
1605
+				'db-col'     => 'MTP_messenger',
1606
+			);
1607
+
1608
+			$template_form_fields['ee-msg-message-type'] = array(
1609
+				'name'       => 'MTP_message_type',
1610
+				'label'      => null,
1611
+				'input'      => 'hidden',
1612
+				'type'       => 'string',
1613
+				'required'   => false,
1614
+				'validation' => true,
1615
+				'value'      => $message_template_group->message_type(),
1616
+				'css_class'  => '',
1617
+				'format'     => '%s',
1618
+				'db-col'     => 'MTP_message_type',
1619
+			);
1620
+
1621
+			$sidebar_form_fields['ee-msg-is-global'] = array(
1622
+				'name'       => 'MTP_is_global',
1623
+				'label'      => esc_html__('Global Template', 'event_espresso'),
1624
+				'input'      => 'hidden',
1625
+				'type'       => 'int',
1626
+				'required'   => false,
1627
+				'validation' => true,
1628
+				'value'      => $message_template_group->get('MTP_is_global'),
1629
+				'css_class'  => '',
1630
+				'format'     => '%d',
1631
+				'db-col'     => 'MTP_is_global',
1632
+			);
1633
+
1634
+			$sidebar_form_fields['ee-msg-is-override'] = array(
1635
+				'name'       => 'MTP_is_override',
1636
+				'label'      => esc_html__('Override all custom', 'event_espresso'),
1637
+				'input'      => $message_template_group->is_global() ? 'checkbox' : 'hidden',
1638
+				'type'       => 'int',
1639
+				'required'   => false,
1640
+				'validation' => true,
1641
+				'value'      => $message_template_group->get('MTP_is_override'),
1642
+				'css_class'  => '',
1643
+				'format'     => '%d',
1644
+				'db-col'     => 'MTP_is_override',
1645
+			);
1646
+
1647
+			$sidebar_form_fields['ee-msg-is-active'] = array(
1648
+				'name'       => 'MTP_is_active',
1649
+				'label'      => esc_html__('Active Template', 'event_espresso'),
1650
+				'input'      => 'hidden',
1651
+				'type'       => 'int',
1652
+				'required'   => false,
1653
+				'validation' => true,
1654
+				'value'      => $message_template_group->is_active(),
1655
+				'css_class'  => '',
1656
+				'format'     => '%d',
1657
+				'db-col'     => 'MTP_is_active',
1658
+			);
1659
+
1660
+			$sidebar_form_fields['ee-msg-deleted'] = array(
1661
+				'name'       => 'MTP_deleted',
1662
+				'label'      => null,
1663
+				'input'      => 'hidden',
1664
+				'type'       => 'int',
1665
+				'required'   => false,
1666
+				'validation' => true,
1667
+				'value'      => $message_template_group->get('MTP_deleted'),
1668
+				'css_class'  => '',
1669
+				'format'     => '%d',
1670
+				'db-col'     => 'MTP_deleted',
1671
+			);
1672
+			$sidebar_form_fields['ee-msg-author'] = array(
1673
+				'name'       => 'MTP_user_id',
1674
+				'label'      => esc_html__('Author', 'event_espresso'),
1675
+				'input'      => 'hidden',
1676
+				'type'       => 'int',
1677
+				'required'   => false,
1678
+				'validation' => false,
1679
+				'value'      => $message_template_group->user(),
1680
+				'format'     => '%d',
1681
+				'db-col'     => 'MTP_user_id',
1682
+			);
1683
+
1684
+			$sidebar_form_fields['ee-msg-route'] = array(
1685
+				'name'  => 'action',
1686
+				'input' => 'hidden',
1687
+				'type'  => 'string',
1688
+				'value' => $action,
1689
+			);
1690
+
1691
+			$sidebar_form_fields['ee-msg-id'] = array(
1692
+				'name'  => 'id',
1693
+				'input' => 'hidden',
1694
+				'type'  => 'int',
1695
+				'value' => $GRP_ID,
1696
+			);
1697
+			$sidebar_form_fields['ee-msg-evt-nonce'] = array(
1698
+				'name'  => $action . '_nonce',
1699
+				'input' => 'hidden',
1700
+				'type'  => 'string',
1701
+				'value' => wp_create_nonce($action . '_nonce'),
1702
+			);
1703
+
1704
+			if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
1705
+				$sidebar_form_fields['ee-msg-template-switch'] = array(
1706
+					'name'  => 'template_switch',
1707
+					'input' => 'hidden',
1708
+					'type'  => 'int',
1709
+					'value' => 1,
1710
+				);
1711
+			}
1712
+
1713
+
1714
+			$template_fields = $this->_generate_admin_form_fields($template_form_fields);
1715
+			$sidebar_fields = $this->_generate_admin_form_fields($sidebar_form_fields);
1716
+		} //end if ( !empty($template_field_structure) )
1717
+
1718
+		// set extra content for publish box
1719
+		$this->_template_args['publish_box_extra_content'] = $sidebar_fields;
1720
+		$this->_set_publish_post_box_vars(
1721
+			'id',
1722
+			$GRP_ID,
1723
+			false,
1724
+			add_query_arg(
1725
+				array('action' => 'global_mtps'),
1726
+				$this->_admin_base_url
1727
+			)
1728
+		);
1729
+
1730
+		// add preview button
1731
+		$preview_url = parent::add_query_args_and_nonce(
1732
+			array(
1733
+				'message_type' => $message_template_group->message_type(),
1734
+				'messenger'    => $message_template_group->messenger(),
1735
+				'context'      => $context,
1736
+				'GRP_ID'       => $GRP_ID,
1737
+				'action'       => 'preview_message',
1738
+			),
1739
+			$this->_admin_base_url
1740
+		);
1741
+		$preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">'
1742
+						  . esc_html__('Preview', 'event_espresso')
1743
+						  . '</a>';
1744
+
1745
+
1746
+		// setup context switcher
1747
+		$context_switcher_args = array(
1748
+			'page'    => 'espresso_messages',
1749
+			'action'  => 'edit_message_template',
1750
+			'id'      => $GRP_ID,
1751
+			'context' => $context,
1752
+			'extra'   => $preview_button,
1753
+		);
1754
+		$this->_set_context_switcher($message_template_group, $context_switcher_args);
1755
+
1756
+
1757
+		// main box
1758
+		$this->_template_args['template_fields'] = $template_fields;
1759
+		$this->_template_args['sidebar_box_id'] = 'details';
1760
+		$this->_template_args['action'] = $action;
1761
+		$this->_template_args['context'] = $context;
1762
+		$this->_template_args['edit_message_template_form_url'] = $edit_message_template_form_url;
1763
+		$this->_template_args['learn_more_about_message_templates_link'] =
1764
+			$this->_learn_more_about_message_templates_link();
1765
+
1766
+
1767
+		$this->_template_args['before_admin_page_content'] = $this->add_context_switcher();
1768
+		$this->_template_args['before_admin_page_content'] .= $this->add_active_context_element(
1769
+			$message_template_group,
1770
+			$context,
1771
+			$context_label
1772
+		);
1773
+		$this->_template_args['before_admin_page_content'] .= $this->_add_form_element_before();
1774
+		$this->_template_args['after_admin_page_content'] = $this->_add_form_element_after();
1775
+
1776
+		$this->_template_path = $this->_template_args['GRP_ID']
1777
+			? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1778
+			: EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1779
+
1780
+		// send along EE_Message_Template_Group object for further template use.
1781
+		$this->_template_args['MTP'] = $message_template_group;
1782
+
1783
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
1784
+			$this->_template_path,
1785
+			$this->_template_args,
1786
+			true
1787
+		);
1788
+
1789
+
1790
+		// finally, let's set the admin_page title
1791
+		$this->_admin_page_title = sprintf(__('Editing %s', 'event_espresso'), $title);
1792
+
1793
+
1794
+		// we need to take care of setting the shortcodes property for use elsewhere.
1795
+		$this->_set_shortcodes();
1796
+
1797
+
1798
+		// final template wrapper
1799
+		$this->display_admin_page_with_sidebar();
1800
+	}
1801
+
1802
+
1803
+	public function filter_tinymce_init($mceInit, $editor_id)
1804
+	{
1805
+		return $mceInit;
1806
+	}
1807
+
1808
+
1809
+	public function add_context_switcher()
1810
+	{
1811
+		return $this->_context_switcher;
1812
+	}
1813
+
1814
+
1815
+	/**
1816
+	 * Adds the activation/deactivation toggle for the message template context.
1817
+	 *
1818
+	 * @param EE_Message_Template_Group $message_template_group
1819
+	 * @param string                    $context
1820
+	 * @param string                    $context_label
1821
+	 * @return string
1822
+	 * @throws DomainException
1823
+	 * @throws EE_Error
1824
+	 * @throws InvalidIdentifierException
1825
+	 */
1826
+	protected function add_active_context_element(
1827
+		EE_Message_Template_Group $message_template_group,
1828
+		$context,
1829
+		$context_label
1830
+	) {
1831
+		$template_args = array(
1832
+			'context'                   => $context,
1833
+			'nonce'                     => wp_create_nonce('activate_' . $context . '_toggle_nonce'),
1834
+			'is_active'                 => $message_template_group->is_context_active($context),
1835
+			'on_off_action'             => $message_template_group->is_context_active($context)
1836
+				? 'context-off'
1837
+				: 'context-on',
1838
+			'context_label'             => str_replace(array('(', ')'), '', $context_label),
1839
+			'message_template_group_id' => $message_template_group->ID(),
1840
+		);
1841
+		return EEH_Template::display_template(
1842
+			EE_MSG_TEMPLATE_PATH . 'ee_msg_editor_active_context_element.template.php',
1843
+			$template_args,
1844
+			true
1845
+		);
1846
+	}
1847
+
1848
+
1849
+	/**
1850
+	 * Ajax callback for `toggle_context_template` ajax action.
1851
+	 * Handles toggling the message context on or off.
1852
+	 *
1853
+	 * @throws EE_Error
1854
+	 * @throws InvalidArgumentException
1855
+	 * @throws InvalidDataTypeException
1856
+	 * @throws InvalidIdentifierException
1857
+	 * @throws InvalidInterfaceException
1858
+	 */
1859
+	public function toggle_context_template()
1860
+	{
1861
+		$success = true;
1862
+		// check for required data
1863
+		if (! isset(
1864
+			$this->_req_data['message_template_group_id'],
1865
+			$this->_req_data['context'],
1866
+			$this->_req_data['status']
1867
+		)) {
1868
+			EE_Error::add_error(
1869
+				esc_html__('Required data for doing this action is not available.', 'event_espresso'),
1870
+				__FILE__,
1871
+				__FUNCTION__,
1872
+				__LINE__
1873
+			);
1874
+			$success = false;
1875
+		}
1876
+
1877
+		$nonce = isset($this->_req_data['toggle_context_nonce'])
1878
+			? sanitize_text_field($this->_req_data['toggle_context_nonce'])
1879
+			: '';
1880
+		$nonce_ref = 'activate_' . $this->_req_data['context'] . '_toggle_nonce';
1881
+		$this->_verify_nonce($nonce, $nonce_ref);
1882
+		$status = $this->_req_data['status'];
1883
+		if ($status !== 'off' && $status !== 'on') {
1884
+			EE_Error::add_error(
1885
+				sprintf(
1886
+					esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
1887
+					$this->_req_data['status']
1888
+				),
1889
+				__FILE__,
1890
+				__FUNCTION__,
1891
+				__LINE__
1892
+			);
1893
+			$success = false;
1894
+		}
1895
+		$message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID(
1896
+			$this->_req_data['message_template_group_id']
1897
+		);
1898
+		if (! $message_template_group instanceof EE_Message_Template_Group) {
1899
+			EE_Error::add_error(
1900
+				sprintf(
1901
+					esc_html__(
1902
+						'Unable to change the active state because the given id "%1$d" does not match a valid "%2$s"',
1903
+						'event_espresso'
1904
+					),
1905
+					$this->_req_data['message_template_group_id'],
1906
+					'EE_Message_Template_Group'
1907
+				),
1908
+				__FILE__,
1909
+				__FUNCTION__,
1910
+				__LINE__
1911
+			);
1912
+			$success = false;
1913
+		}
1914
+		if ($success) {
1915
+			$success = $status === 'off'
1916
+				? $message_template_group->deactivate_context($this->_req_data['context'])
1917
+				: $message_template_group->activate_context($this->_req_data['context']);
1918
+		}
1919
+		$this->_template_args['success'] = $success;
1920
+		$this->_return_json();
1921
+	}
1922
+
1923
+
1924
+	public function _add_form_element_before()
1925
+	{
1926
+		return '<form method="post" action="'
1927
+			   . $this->_template_args["edit_message_template_form_url"]
1928
+			   . '" id="ee-msg-edit-frm">';
1929
+	}
1930
+
1931
+	public function _add_form_element_after()
1932
+	{
1933
+		return '</form>';
1934
+	}
1935
+
1936
+
1937
+	/**
1938
+	 * This executes switching the template pack for a message template.
1939
+	 *
1940
+	 * @since 4.5.0
1941
+	 * @throws EE_Error
1942
+	 * @throws InvalidDataTypeException
1943
+	 * @throws InvalidInterfaceException
1944
+	 * @throws InvalidArgumentException
1945
+	 * @throws ReflectionException
1946
+	 */
1947
+	public function switch_template_pack()
1948
+	{
1949
+		$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1950
+		$template_pack = ! empty($this->_req_data['template_pack']) ? $this->_req_data['template_pack'] : '';
1951
+
1952
+		// verify we have needed values.
1953
+		if (empty($GRP_ID) || empty($template_pack)) {
1954
+			$this->_template_args['error'] = true;
1955
+			EE_Error::add_error(
1956
+				esc_html__('The required date for switching templates is not available.', 'event_espresso'),
1957
+				__FILE__,
1958
+				__FUNCTION__,
1959
+				__LINE__
1960
+			);
1961
+		} else {
1962
+			// get template, set the new template_pack and then reset to default
1963
+			/** @type EE_Message_Template_Group $message_template_group */
1964
+			$message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1965
+
1966
+			$message_template_group->set_template_pack_name($template_pack);
1967
+			$this->_req_data['msgr'] = $message_template_group->messenger();
1968
+			$this->_req_data['mt'] = $message_template_group->message_type();
1969
+
1970
+			$query_args = $this->_reset_to_default_template();
1971
+
1972
+			if (empty($query_args['id'])) {
1973
+				EE_Error::add_error(
1974
+					esc_html__(
1975
+						'Something went wrong with switching the template pack. Please try again or contact EE support',
1976
+						'event_espresso'
1977
+					),
1978
+					__FILE__,
1979
+					__FUNCTION__,
1980
+					__LINE__
1981
+				);
1982
+				$this->_template_args['error'] = true;
1983
+			} else {
1984
+				$template_label = $message_template_group->get_template_pack()->label;
1985
+				$template_pack_labels = $message_template_group->messenger_obj()->get_supports_labels();
1986
+				EE_Error::add_success(
1987
+					sprintf(
1988
+						esc_html__(
1989
+							'This message template has been successfully switched to use the %1$s %2$s.  Please wait while the page reloads with your new template.',
1990
+							'event_espresso'
1991
+						),
1992
+						$template_label,
1993
+						$template_pack_labels->template_pack
1994
+					)
1995
+				);
1996
+				// generate the redirect url for js.
1997
+				$url = self::add_query_args_and_nonce(
1998
+					$query_args,
1999
+					$this->_admin_base_url
2000
+				);
2001
+				$this->_template_args['data']['redirect_url'] = $url;
2002
+				$this->_template_args['success'] = true;
2003
+			}
2004
+
2005
+			$this->_return_json();
2006
+		}
2007
+	}
2008
+
2009
+
2010
+	/**
2011
+	 * This handles resetting the template for the given messenger/message_type so that users can start from scratch if
2012
+	 * they want.
2013
+	 *
2014
+	 * @access protected
2015
+	 * @return array|null
2016
+	 * @throws EE_Error
2017
+	 * @throws InvalidArgumentException
2018
+	 * @throws InvalidDataTypeException
2019
+	 * @throws InvalidInterfaceException
2020
+	 */
2021
+	protected function _reset_to_default_template()
2022
+	{
2023
+
2024
+		$templates = array();
2025
+		$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2026
+		// we need to make sure we've got the info we need.
2027
+		if (! isset($this->_req_data['msgr'], $this->_req_data['mt'], $this->_req_data['GRP_ID'])) {
2028
+			EE_Error::add_error(
2029
+				esc_html__(
2030
+					'In order to reset the template to its default we require the messenger, message type, and message template GRP_ID to know what is being reset.  At least one of these is missing.',
2031
+					'event_espresso'
2032
+				),
2033
+				__FILE__,
2034
+				__FUNCTION__,
2035
+				__LINE__
2036
+			);
2037
+		}
2038
+
2039
+		// all templates will be reset to whatever the defaults are
2040
+		// for the global template matching the messenger and message type.
2041
+		$success = ! empty($GRP_ID) ? true : false;
2042
+
2043
+		if ($success) {
2044
+			// let's first determine if the incoming template is a global template,
2045
+			// if it isn't then we need to get the global template matching messenger and message type.
2046
+			// $MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID( $GRP_ID );
2047
+
2048
+
2049
+			// note this is ONLY deleting the template fields (Message Template rows) NOT the message template group.
2050
+			$success = $this->_delete_mtp_permanently($GRP_ID, false);
2051
+
2052
+			if ($success) {
2053
+				// if successfully deleted, lets generate the new ones.
2054
+				// Note. We set GLOBAL to true, because resets on ANY template
2055
+				// will use the related global template defaults for regeneration.
2056
+				// This means that if a custom template is reset it resets to whatever the related global template is.
2057
+				// HOWEVER, we DO keep the template pack and template variation set
2058
+				// for the current custom template when resetting.
2059
+				$templates = $this->_generate_new_templates(
2060
+					$this->_req_data['msgr'],
2061
+					$this->_req_data['mt'],
2062
+					$GRP_ID,
2063
+					true
2064
+				);
2065
+			}
2066
+		}
2067
+
2068
+		// any error messages?
2069
+		if (! $success) {
2070
+			EE_Error::add_error(
2071
+				esc_html__(
2072
+					'Something went wrong with deleting existing templates. Unable to reset to default',
2073
+					'event_espresso'
2074
+				),
2075
+				__FILE__,
2076
+				__FUNCTION__,
2077
+				__LINE__
2078
+			);
2079
+		}
2080
+
2081
+		// all good, let's add a success message!
2082
+		if ($success && ! empty($templates)) {
2083
+			// the info for the template we generated is the first element in the returned array
2084
+			// $templates = $templates[0];
2085
+			EE_Error::overwrite_success();
2086
+			EE_Error::add_success(__('Templates have been reset to defaults.', 'event_espresso'));
2087
+		}
2088
+
2089
+
2090
+		$query_args = array(
2091
+			'id'      => isset($templates[0]['GRP_ID']) ? $templates[0]['GRP_ID'] : null,
2092
+			'context' => isset($templates[0]['MTP_context']) ? $templates[0]['MTP_context'] : null,
2093
+			'action'  => isset($templates[0]['GRP_ID']) ? 'edit_message_template' : 'global_mtps',
2094
+		);
2095
+
2096
+		// if called via ajax then we return query args otherwise redirect
2097
+		if (defined('DOING_AJAX') && DOING_AJAX) {
2098
+			return $query_args;
2099
+		} else {
2100
+			$this->_redirect_after_action(false, '', '', $query_args, true);
2101
+
2102
+			return null;
2103
+		}
2104
+	}
2105
+
2106
+
2107
+	/**
2108
+	 * Retrieve and set the message preview for display.
2109
+	 *
2110
+	 * @param bool $send if TRUE then we are doing an actual TEST send with the results of the preview.
2111
+	 * @return string
2112
+	 * @throws ReflectionException
2113
+	 * @throws EE_Error
2114
+	 * @throws InvalidArgumentException
2115
+	 * @throws InvalidDataTypeException
2116
+	 * @throws InvalidInterfaceException
2117
+	 */
2118
+	public function _preview_message($send = false)
2119
+	{
2120
+		// first make sure we've got the necessary parameters
2121
+		if (! isset(
2122
+			$this->_req_data['message_type'],
2123
+			$this->_req_data['messenger'],
2124
+			$this->_req_data['messenger'],
2125
+			$this->_req_data['GRP_ID']
2126
+		)) {
2127
+			EE_Error::add_error(
2128
+				esc_html__('Missing necessary parameters for displaying preview', 'event_espresso'),
2129
+				__FILE__,
2130
+				__FUNCTION__,
2131
+				__LINE__
2132
+			);
2133
+		}
2134
+
2135
+		EE_Registry::instance()->REQ->set('GRP_ID', $this->_req_data['GRP_ID']);
2136
+
2137
+
2138
+		// get the preview!
2139
+		$preview = EED_Messages::preview_message(
2140
+			$this->_req_data['message_type'],
2141
+			$this->_req_data['context'],
2142
+			$this->_req_data['messenger'],
2143
+			$send
2144
+		);
2145
+
2146
+		if ($send) {
2147
+			return $preview;
2148
+		}
2149
+
2150
+		// let's add a button to go back to the edit view
2151
+		$query_args = array(
2152
+			'id'      => $this->_req_data['GRP_ID'],
2153
+			'context' => $this->_req_data['context'],
2154
+			'action'  => 'edit_message_template',
2155
+		);
2156
+		$go_back_url = parent::add_query_args_and_nonce($query_args, $this->_admin_base_url);
2157
+		$preview_button = '<a href="'
2158
+						  . $go_back_url
2159
+						  . '" class="button-secondary messages-preview-go-back-button">'
2160
+						  . esc_html__('Go Back to Edit', 'event_espresso')
2161
+						  . '</a>';
2162
+		$message_types = $this->get_installed_message_types();
2163
+		$active_messenger = $this->_message_resource_manager->get_active_messenger(
2164
+			$this->_req_data['messenger']
2165
+		);
2166
+		$active_messenger_label = $active_messenger instanceof EE_messenger
2167
+			? ucwords($active_messenger->label['singular'])
2168
+			: esc_html__('Unknown Messenger', 'event_espresso');
2169
+		// let's provide a helpful title for context
2170
+		$preview_title = sprintf(
2171
+			esc_html__('Viewing Preview for %s %s Message Template', 'event_espresso'),
2172
+			$active_messenger_label,
2173
+			ucwords($message_types[ $this->_req_data['message_type'] ]->label['singular'])
2174
+		);
2175
+		// setup display of preview.
2176
+		$this->_admin_page_title = $preview_title;
2177
+		$this->_template_args['admin_page_content'] = $preview_button . '<br />' . $preview;
2178
+		$this->_template_args['data']['force_json'] = true;
2179
+
2180
+		return '';
2181
+	}
2182
+
2183
+
2184
+	/**
2185
+	 * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
2186
+	 * gets called automatically.
2187
+	 *
2188
+	 * @since 4.5.0
2189
+	 *
2190
+	 * @return string
2191
+	 */
2192
+	protected function _display_preview_message()
2193
+	{
2194
+		$this->display_admin_page_with_no_sidebar();
2195
+	}
2196
+
2197
+
2198
+	/**
2199
+	 * registers metaboxes that should show up on the "edit_message_template" page
2200
+	 *
2201
+	 * @access protected
2202
+	 * @return void
2203
+	 */
2204
+	protected function _register_edit_meta_boxes()
2205
+	{
2206
+		add_meta_box(
2207
+			'mtp_valid_shortcodes',
2208
+			esc_html__('Valid Shortcodes', 'event_espresso'),
2209
+			array($this, 'shortcode_meta_box'),
2210
+			$this->_current_screen->id,
2211
+			'side',
2212
+			'default'
2213
+		);
2214
+		add_meta_box(
2215
+			'mtp_extra_actions',
2216
+			esc_html__('Extra Actions', 'event_espresso'),
2217
+			array($this, 'extra_actions_meta_box'),
2218
+			$this->_current_screen->id,
2219
+			'side',
2220
+			'high'
2221
+		);
2222
+		add_meta_box(
2223
+			'mtp_templates',
2224
+			esc_html__('Template Styles', 'event_espresso'),
2225
+			array($this, 'template_pack_meta_box'),
2226
+			$this->_current_screen->id,
2227
+			'side',
2228
+			'high'
2229
+		);
2230
+	}
2231
+
2232
+
2233
+	/**
2234
+	 * metabox content for all template pack and variation selection.
2235
+	 *
2236
+	 * @since 4.5.0
2237
+	 * @return string
2238
+	 * @throws DomainException
2239
+	 * @throws EE_Error
2240
+	 * @throws InvalidArgumentException
2241
+	 * @throws ReflectionException
2242
+	 * @throws InvalidDataTypeException
2243
+	 * @throws InvalidInterfaceException
2244
+	 */
2245
+	public function template_pack_meta_box()
2246
+	{
2247
+		$this->_set_message_template_group();
2248
+
2249
+		$tp_collection = EEH_MSG_Template::get_template_pack_collection();
2250
+
2251
+		$tp_select_values = array();
2252
+
2253
+		foreach ($tp_collection as $tp) {
2254
+			// only include template packs that support this messenger and message type!
2255
+			$supports = $tp->get_supports();
2256
+			if (! isset($supports[ $this->_message_template_group->messenger() ])
2257
+				|| ! in_array(
2258
+					$this->_message_template_group->message_type(),
2259
+					$supports[ $this->_message_template_group->messenger() ],
2260
+					true
2261
+				)
2262
+			) {
2263
+				// not supported
2264
+				continue;
2265
+			}
2266
+
2267
+			$tp_select_values[] = array(
2268
+				'text' => $tp->label,
2269
+				'id'   => $tp->dbref,
2270
+			);
2271
+		}
2272
+
2273
+		// if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by
2274
+		// the default template pack.  This still allows for the odd template pack to override.
2275
+		if (empty($tp_select_values)) {
2276
+			$tp_select_values[] = array(
2277
+				'text' => esc_html__('Default', 'event_espresso'),
2278
+				'id'   => 'default',
2279
+			);
2280
+		}
2281
+
2282
+		// setup variation select values for the currently selected template.
2283
+		$variations = $this->_message_template_group->get_template_pack()->get_variations(
2284
+			$this->_message_template_group->messenger(),
2285
+			$this->_message_template_group->message_type()
2286
+		);
2287
+		$variations_select_values = array();
2288
+		foreach ($variations as $variation => $label) {
2289
+			$variations_select_values[] = array(
2290
+				'text' => $label,
2291
+				'id'   => $variation,
2292
+			);
2293
+		}
2294
+
2295
+		$template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
2296
+
2297
+		$template_args['template_packs_selector'] = EEH_Form_Fields::select_input(
2298
+			'MTP_template_pack',
2299
+			$tp_select_values,
2300
+			$this->_message_template_group->get_template_pack_name()
2301
+		);
2302
+		$template_args['variations_selector'] = EEH_Form_Fields::select_input(
2303
+			'MTP_template_variation',
2304
+			$variations_select_values,
2305
+			$this->_message_template_group->get_template_pack_variation()
2306
+		);
2307
+		$template_args['template_pack_label'] = $template_pack_labels->template_pack;
2308
+		$template_args['template_variation_label'] = $template_pack_labels->template_variation;
2309
+		$template_args['template_pack_description'] = $template_pack_labels->template_pack_description;
2310
+		$template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
2311
+
2312
+		$template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
2313
+
2314
+		EEH_Template::display_template($template, $template_args);
2315
+	}
2316
+
2317
+
2318
+	/**
2319
+	 * This meta box holds any extra actions related to Message Templates
2320
+	 * For now, this includes Resetting templates to defaults and sending a test email.
2321
+	 *
2322
+	 * @access  public
2323
+	 * @return void
2324
+	 * @throws EE_Error
2325
+	 */
2326
+	public function extra_actions_meta_box()
2327
+	{
2328
+		$template_form_fields = array();
2329
+
2330
+		$extra_args = array(
2331
+			'msgr'   => $this->_message_template_group->messenger(),
2332
+			'mt'     => $this->_message_template_group->message_type(),
2333
+			'GRP_ID' => $this->_message_template_group->GRP_ID(),
2334
+		);
2335
+		// first we need to see if there are any fields
2336
+		$fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2337
+
2338
+		if (! empty($fields)) {
2339
+			// yup there be fields
2340
+			foreach ($fields as $field => $config) {
2341
+				$field_id = $this->_message_template_group->messenger() . '_' . $field;
2342
+				$existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2343
+				$default = isset($config['default']) ? $config['default'] : '';
2344
+				$default = isset($config['value']) ? $config['value'] : $default;
2345
+
2346
+				// if type is hidden and the value is empty
2347
+				// something may have gone wrong so let's correct with the defaults
2348
+				$fix = $config['input'] === 'hidden'
2349
+					   && isset($existing[ $field ])
2350
+					   && empty($existing[ $field ])
2351
+					? $default
2352
+					: '';
2353
+				$existing[ $field ] = isset($existing[ $field ]) && empty($fix)
2354
+					? $existing[ $field ]
2355
+					: $fix;
2356
+
2357
+				$template_form_fields[ $field_id ] = array(
2358
+					'name'       => 'test_settings_fld[' . $field . ']',
2359
+					'label'      => $config['label'],
2360
+					'input'      => $config['input'],
2361
+					'type'       => $config['type'],
2362
+					'required'   => $config['required'],
2363
+					'validation' => $config['validation'],
2364
+					'value'      => isset($existing[ $field ]) ? $existing[ $field ] : $default,
2365
+					'css_class'  => $config['css_class'],
2366
+					'options'    => isset($config['options']) ? $config['options'] : array(),
2367
+					'default'    => $default,
2368
+					'format'     => $config['format'],
2369
+				);
2370
+			}
2371
+		}
2372
+
2373
+		$test_settings_fields = ! empty($template_form_fields)
2374
+			? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2375
+			: '';
2376
+
2377
+		$test_settings_html = '';
2378
+		// print out $test_settings_fields
2379
+		if (! empty($test_settings_fields)) {
2380
+			echo $test_settings_fields;
2381
+			$test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2382
+			$test_settings_html .= 'name="test_button" value="';
2383
+			$test_settings_html .= esc_html__('Test Send', 'event_espresso');
2384
+			$test_settings_html .= '" /><div style="clear:both"></div>';
2385
+		}
2386
+
2387
+		// and button
2388
+		$test_settings_html .= '<p>'
2389
+							   . esc_html__('Need to reset this message type and start over?', 'event_espresso')
2390
+							   . '</p>';
2391
+		$test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2392
+		$test_settings_html .= $this->get_action_link_or_button(
2393
+			'reset_to_default',
2394
+			'reset',
2395
+			$extra_args,
2396
+			'button-primary reset-default-button'
2397
+		);
2398
+		$test_settings_html .= '</div><div style="clear:both"></div>';
2399
+		echo $test_settings_html;
2400
+	}
2401
+
2402
+
2403
+	/**
2404
+	 * This returns the shortcode selector skeleton for a given context and field.
2405
+	 *
2406
+	 * @since 4.9.rc.000
2407
+	 * @param string $field           The name of the field retrieving shortcodes for.
2408
+	 * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2409
+	 * @return string
2410
+	 * @throws DomainException
2411
+	 * @throws EE_Error
2412
+	 * @throws InvalidArgumentException
2413
+	 * @throws ReflectionException
2414
+	 * @throws InvalidDataTypeException
2415
+	 * @throws InvalidInterfaceException
2416
+	 */
2417
+	protected function _get_shortcode_selector($field, $linked_input_id)
2418
+	{
2419
+		$template_args = array(
2420
+			'shortcodes'      => $this->_get_shortcodes(array($field), true),
2421
+			'fieldname'       => $field,
2422
+			'linked_input_id' => $linked_input_id,
2423
+		);
2424
+
2425
+		return EEH_Template::display_template(
2426
+			EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2427
+			$template_args,
2428
+			true
2429
+		);
2430
+	}
2431
+
2432
+
2433
+	/**
2434
+	 * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2435
+	 * page)
2436
+	 *
2437
+	 * @access public
2438
+	 * @return void
2439
+	 * @throws EE_Error
2440
+	 * @throws InvalidArgumentException
2441
+	 * @throws ReflectionException
2442
+	 * @throws InvalidDataTypeException
2443
+	 * @throws InvalidInterfaceException
2444
+	 */
2445
+	public function shortcode_meta_box()
2446
+	{
2447
+		$shortcodes = $this->_get_shortcodes(array(), false); // just make sure shortcodes property is set
2448
+		// $messenger = $this->_message_template_group->messenger_obj();
2449
+		// now let's set the content depending on the status of the shortcodes array
2450
+		if (empty($shortcodes)) {
2451
+			$content = '<p>' . esc_html__('There are no valid shortcodes available', 'event_espresso') . '</p>';
2452
+			echo $content;
2453
+		} else {
2454
+			// $alt = 0;
2455
+			?>
2456 2456
             <div style="float:right; margin-top:10px"><?php
2457
-                            echo $this->_get_help_tab_link('message_template_shortcodes');
2458
-                            ?></div>
2457
+							echo $this->_get_help_tab_link('message_template_shortcodes');
2458
+							?></div>
2459 2459
             <p class="small-text"><?php
2460
-                                  printf(
2461
-                                      esc_html__(
2462
-                                          'You can view the shortcodes usable in your template by clicking the %s icon next to each field.',
2463
-                                          'event_espresso'
2464
-                                      ),
2465
-                                      '<span class="dashicons dashicons-menu"></span>'
2466
-                                  );
2467
-                                ?>
2460
+								  printf(
2461
+									  esc_html__(
2462
+										  'You can view the shortcodes usable in your template by clicking the %s icon next to each field.',
2463
+										  'event_espresso'
2464
+									  ),
2465
+									  '<span class="dashicons dashicons-menu"></span>'
2466
+								  );
2467
+								?>
2468 2468
             </p>
2469 2469
             <?php
2470
-        }
2471
-    }
2472
-
2473
-
2474
-    /**
2475
-     * used to set the $_shortcodes property for when its needed elsewhere.
2476
-     *
2477
-     * @access protected
2478
-     * @return void
2479
-     * @throws EE_Error
2480
-     * @throws InvalidArgumentException
2481
-     * @throws ReflectionException
2482
-     * @throws InvalidDataTypeException
2483
-     * @throws InvalidInterfaceException
2484
-     */
2485
-    protected function _set_shortcodes()
2486
-    {
2487
-
2488
-        // no need to run this if the property is already set
2489
-        if (! empty($this->_shortcodes)) {
2490
-            return;
2491
-        }
2492
-
2493
-        $this->_shortcodes = $this->_get_shortcodes();
2494
-    }
2495
-
2496
-
2497
-    /**
2498
-     * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2499
-     * property)
2500
-     *
2501
-     * @access  protected
2502
-     * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2503
-     *                         for. Defaults to all (for the given context)
2504
-     * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2505
-     * @return array Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2506
-     *                         true just an array of shortcode/label pairs.
2507
-     * @throws EE_Error
2508
-     * @throws InvalidArgumentException
2509
-     * @throws ReflectionException
2510
-     * @throws InvalidDataTypeException
2511
-     * @throws InvalidInterfaceException
2512
-     */
2513
-    protected function _get_shortcodes($fields = array(), $merged = true)
2514
-    {
2515
-        $this->_set_message_template_group();
2516
-
2517
-        // we need the messenger and message template to retrieve the valid shortcodes array.
2518
-        $GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
2519
-            ? absint($this->_req_data['id'])
2520
-            : false;
2521
-        $context = isset($this->_req_data['context'])
2522
-            ? $this->_req_data['context']
2523
-            : key($this->_message_template_group->contexts_config());
2524
-
2525
-        return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2526
-    }
2527
-
2528
-
2529
-    /**
2530
-     * This sets the _message_template property (containing the called message_template object)
2531
-     *
2532
-     * @access protected
2533
-     * @return void
2534
-     * @throws EE_Error
2535
-     * @throws InvalidArgumentException
2536
-     * @throws ReflectionException
2537
-     * @throws InvalidDataTypeException
2538
-     * @throws InvalidInterfaceException
2539
-     */
2540
-    protected function _set_message_template_group()
2541
-    {
2542
-
2543
-        if (! empty($this->_message_template_group)) {
2544
-            return;
2545
-        } //get out if this is already set.
2546
-
2547
-        $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2548
-        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2549
-
2550
-        // let's get the message templates
2551
-        $MTP = EEM_Message_Template_Group::instance();
2552
-
2553
-        if (empty($GRP_ID)) {
2554
-            $this->_message_template_group = $MTP->create_default_object();
2555
-        } else {
2556
-            $this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2557
-        }
2558
-
2559
-        $this->_template_pack = $this->_message_template_group->get_template_pack();
2560
-        $this->_variation = $this->_message_template_group->get_template_pack_variation();
2561
-    }
2562
-
2563
-
2564
-    /**
2565
-     * sets up a context switcher for edit forms
2566
-     *
2567
-     * @access  protected
2568
-     * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2569
-     * @param array                      $args                  various things the context switcher needs.
2570
-     * @throws EE_Error
2571
-     */
2572
-    protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2573
-    {
2574
-        $context_details = $template_group_object->contexts_config();
2575
-        $context_label = $template_group_object->context_label();
2576
-        ob_start();
2577
-        ?>
2470
+		}
2471
+	}
2472
+
2473
+
2474
+	/**
2475
+	 * used to set the $_shortcodes property for when its needed elsewhere.
2476
+	 *
2477
+	 * @access protected
2478
+	 * @return void
2479
+	 * @throws EE_Error
2480
+	 * @throws InvalidArgumentException
2481
+	 * @throws ReflectionException
2482
+	 * @throws InvalidDataTypeException
2483
+	 * @throws InvalidInterfaceException
2484
+	 */
2485
+	protected function _set_shortcodes()
2486
+	{
2487
+
2488
+		// no need to run this if the property is already set
2489
+		if (! empty($this->_shortcodes)) {
2490
+			return;
2491
+		}
2492
+
2493
+		$this->_shortcodes = $this->_get_shortcodes();
2494
+	}
2495
+
2496
+
2497
+	/**
2498
+	 * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2499
+	 * property)
2500
+	 *
2501
+	 * @access  protected
2502
+	 * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2503
+	 *                         for. Defaults to all (for the given context)
2504
+	 * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2505
+	 * @return array Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2506
+	 *                         true just an array of shortcode/label pairs.
2507
+	 * @throws EE_Error
2508
+	 * @throws InvalidArgumentException
2509
+	 * @throws ReflectionException
2510
+	 * @throws InvalidDataTypeException
2511
+	 * @throws InvalidInterfaceException
2512
+	 */
2513
+	protected function _get_shortcodes($fields = array(), $merged = true)
2514
+	{
2515
+		$this->_set_message_template_group();
2516
+
2517
+		// we need the messenger and message template to retrieve the valid shortcodes array.
2518
+		$GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
2519
+			? absint($this->_req_data['id'])
2520
+			: false;
2521
+		$context = isset($this->_req_data['context'])
2522
+			? $this->_req_data['context']
2523
+			: key($this->_message_template_group->contexts_config());
2524
+
2525
+		return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2526
+	}
2527
+
2528
+
2529
+	/**
2530
+	 * This sets the _message_template property (containing the called message_template object)
2531
+	 *
2532
+	 * @access protected
2533
+	 * @return void
2534
+	 * @throws EE_Error
2535
+	 * @throws InvalidArgumentException
2536
+	 * @throws ReflectionException
2537
+	 * @throws InvalidDataTypeException
2538
+	 * @throws InvalidInterfaceException
2539
+	 */
2540
+	protected function _set_message_template_group()
2541
+	{
2542
+
2543
+		if (! empty($this->_message_template_group)) {
2544
+			return;
2545
+		} //get out if this is already set.
2546
+
2547
+		$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2548
+		$GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2549
+
2550
+		// let's get the message templates
2551
+		$MTP = EEM_Message_Template_Group::instance();
2552
+
2553
+		if (empty($GRP_ID)) {
2554
+			$this->_message_template_group = $MTP->create_default_object();
2555
+		} else {
2556
+			$this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2557
+		}
2558
+
2559
+		$this->_template_pack = $this->_message_template_group->get_template_pack();
2560
+		$this->_variation = $this->_message_template_group->get_template_pack_variation();
2561
+	}
2562
+
2563
+
2564
+	/**
2565
+	 * sets up a context switcher for edit forms
2566
+	 *
2567
+	 * @access  protected
2568
+	 * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2569
+	 * @param array                      $args                  various things the context switcher needs.
2570
+	 * @throws EE_Error
2571
+	 */
2572
+	protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2573
+	{
2574
+		$context_details = $template_group_object->contexts_config();
2575
+		$context_label = $template_group_object->context_label();
2576
+		ob_start();
2577
+		?>
2578 2578
         <div class="ee-msg-switcher-container">
2579 2579
             <form method="get" action="<?php echo EE_MSG_ADMIN_URL; ?>" id="ee-msg-context-switcher-frm">
2580 2580
                 <?php
2581
-                foreach ($args as $name => $value) {
2582
-                    if ($name === 'context' || empty($value) || $name === 'extra') {
2583
-                        continue;
2584
-                    }
2585
-                    ?>
2581
+				foreach ($args as $name => $value) {
2582
+					if ($name === 'context' || empty($value) || $name === 'extra') {
2583
+						continue;
2584
+					}
2585
+					?>
2586 2586
                     <input type="hidden" name="<?php echo $name; ?>" value="<?php echo $value; ?>"/>
2587 2587
                     <?php
2588
-                }
2589
-                // setup nonce_url
2590
-                wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2591
-                ?>
2588
+				}
2589
+				// setup nonce_url
2590
+				wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2591
+				?>
2592 2592
                 <select name="context">
2593 2593
                     <?php
2594
-                    $context_templates = $template_group_object->context_templates();
2595
-                    if (is_array($context_templates)) :
2596
-                        foreach ($context_templates as $context => $template_fields) :
2597
-                            $checked = ($context === $args['context']) ? 'selected="selected"' : '';
2598
-                            ?>
2594
+					$context_templates = $template_group_object->context_templates();
2595
+					if (is_array($context_templates)) :
2596
+						foreach ($context_templates as $context => $template_fields) :
2597
+							$checked = ($context === $args['context']) ? 'selected="selected"' : '';
2598
+							?>
2599 2599
                             <option value="<?php echo $context; ?>" <?php echo $checked; ?>>
2600 2600
                                 <?php echo $context_details[ $context ]['label']; ?>
2601 2601
                             </option>
2602 2602
                         <?php endforeach;
2603
-                    endif; ?>
2603
+					endif; ?>
2604 2604
                 </select>
2605 2605
                 <?php $button_text = sprintf(__('Switch %s', 'event_espresso'), ucwords($context_label['label'])); ?>
2606 2606
                 <input id="submit-msg-context-switcher-sbmt" class="button-secondary" type="submit"
@@ -2609,1921 +2609,1921 @@  discard block
 block discarded – undo
2609 2609
             <?php echo $args['extra']; ?>
2610 2610
         </div> <!-- end .ee-msg-switcher-container -->
2611 2611
         <?php
2612
-        $output = ob_get_contents();
2613
-        ob_clean();
2614
-        $this->_context_switcher = $output;
2615
-    }
2616
-
2617
-
2618
-    /**
2619
-     * utility for sanitizing new values coming in.
2620
-     * Note: this is only used when updating a context.
2621
-     *
2622
-     * @access protected
2623
-     *
2624
-     * @param int $index This helps us know which template field to select from the request array.
2625
-     *
2626
-     * @return array
2627
-     */
2628
-    protected function _set_message_template_column_values($index)
2629
-    {
2630
-        if (is_array($this->_req_data['MTP_template_fields'][ $index ]['content'])) {
2631
-            foreach ($this->_req_data['MTP_template_fields'][ $index ]['content'] as $field => $value) {
2632
-                $this->_req_data['MTP_template_fields'][ $index ]['content'][ $field ] = $value;
2633
-            }
2634
-        }
2635
-
2636
-
2637
-        $set_column_values = array(
2638
-            'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][ $index ]['MTP_ID']),
2639
-            'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2640
-            'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2641
-            'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2642
-            'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2643
-            'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][ $index ]['name']),
2644
-            'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2645
-            'MTP_content'        => $this->_req_data['MTP_template_fields'][ $index ]['content'],
2646
-            'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2647
-                ? absint($this->_req_data['MTP_is_global'])
2648
-                : 0,
2649
-            'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2650
-                ? absint($this->_req_data['MTP_is_override'])
2651
-                : 0,
2652
-            'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2653
-            'MTP_is_active'      => absint($this->_req_data['MTP_is_active']),
2654
-        );
2655
-
2656
-
2657
-        return $set_column_values;
2658
-    }
2659
-
2660
-
2661
-    protected function _insert_or_update_message_template($new = false)
2662
-    {
2663
-
2664
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2665
-        $success = 0;
2666
-        $override = false;
2667
-
2668
-        // setup notices description
2669
-        $messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2670
-
2671
-        // need the message type and messenger objects to be able to use the labels for the notices
2672
-        $messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2673
-        $messenger_label = $messenger_object instanceof EE_messenger
2674
-            ? ucwords($messenger_object->label['singular'])
2675
-            : '';
2676
-
2677
-        $message_type_slug = ! empty($this->_req_data['MTP_message_type'])
2678
-            ? $this->_req_data['MTP_message_type']
2679
-            : '';
2680
-        $message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2681
-
2682
-        $message_type_label = $message_type_object instanceof EE_message_type
2683
-            ? ucwords($message_type_object->label['singular'])
2684
-            : '';
2685
-
2686
-        $context_slug = ! empty($this->_req_data['MTP_context'])
2687
-            ? $this->_req_data['MTP_context']
2688
-            : '';
2689
-        $context = ucwords(str_replace('_', ' ', $context_slug));
2690
-
2691
-        $item_desc = $messenger_label && $message_type_label
2692
-            ? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' '
2693
-            : '';
2694
-        $item_desc .= 'Message Template';
2695
-        $query_args = array();
2696
-        $edit_array = array();
2697
-        $action_desc = '';
2698
-
2699
-        // if this is "new" then we need to generate the default contexts for the selected messenger/message_type for
2700
-        // user to edit.
2701
-        if ($new) {
2702
-            $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2703
-            if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2704
-                if (empty($edit_array)) {
2705
-                    $success = 0;
2706
-                } else {
2707
-                    $success = 1;
2708
-                    $edit_array = $edit_array[0];
2709
-                    $query_args = array(
2710
-                        'id'      => $edit_array['GRP_ID'],
2711
-                        'context' => $edit_array['MTP_context'],
2712
-                        'action'  => 'edit_message_template',
2713
-                    );
2714
-                }
2715
-            }
2716
-            $action_desc = 'created';
2717
-        } else {
2718
-            $MTPG = EEM_Message_Template_Group::instance();
2719
-            $MTP = EEM_Message_Template::instance();
2720
-
2721
-
2722
-            // run update for each template field in displayed context
2723
-            if (! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2724
-                EE_Error::add_error(
2725
-                    esc_html__(
2726
-                        'There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2727
-                        'event_espresso'
2728
-                    ),
2729
-                    __FILE__,
2730
-                    __FUNCTION__,
2731
-                    __LINE__
2732
-                );
2733
-                $success = 0;
2734
-            } else {
2735
-                // first validate all fields!
2736
-                // this filter allows client code to add its own validation to the template fields as well.
2737
-                // returning an empty array means everything passed validation.
2738
-                // errors in validation should be represented in an array with the following shape:
2739
-                // array(
2740
-                //   'fieldname' => array(
2741
-                //          'msg' => 'error message'
2742
-                //          'value' => 'value for field producing error'
2743
-                // )
2744
-                $custom_validation = (array) apply_filters(
2745
-                    'FHEE__Messages_Admin_Page___insert_or_update_message_template__validates',
2746
-                    array(),
2747
-                    $this->_req_data['MTP_template_fields'],
2748
-                    $context_slug,
2749
-                    $messenger_slug,
2750
-                    $message_type_slug
2751
-                );
2752
-
2753
-                $system_validation = $MTPG->validate(
2754
-                    $this->_req_data['MTP_template_fields'],
2755
-                    $context_slug,
2756
-                    $messenger_slug,
2757
-                    $message_type_slug
2758
-                );
2759
-
2760
-                $system_validation = ! is_array($system_validation) && $system_validation ? array()
2761
-                    : $system_validation;
2762
-                $validates = array_merge($custom_validation, $system_validation);
2763
-
2764
-                // if $validate returned error messages (i.e. is_array()) then we need to process them and setup an
2765
-                // appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.
2766
-                //  WE need to make sure there is no actual error messages in validates.
2767
-                if (is_array($validates) && ! empty($validates)) {
2768
-                    // add the transient so when the form loads we know which fields to highlight
2769
-                    $this->_add_transient('edit_message_template', $validates);
2770
-
2771
-                    $success = 0;
2772
-
2773
-                    // setup notices
2774
-                    foreach ($validates as $field => $error) {
2775
-                        if (isset($error['msg'])) {
2776
-                            EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2777
-                        }
2778
-                    }
2779
-                } else {
2780
-                    $set_column_values = array();
2781
-                    foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2782
-                        $set_column_values = $this->_set_message_template_column_values($template_field);
2783
-
2784
-                        $where_cols_n_values = array(
2785
-                            'MTP_ID' => $this->_req_data['MTP_template_fields'][ $template_field ]['MTP_ID'],
2786
-                        );
2787
-                        // if they aren't allowed to use all JS, restrict them to just posty-y tags
2788
-                        if (! current_user_can('unfiltered_html')) {
2789
-                            if (is_array($set_column_values['MTP_content'])) {
2790
-                                foreach ($set_column_values['MTP_content'] as $key => $value) {
2791
-                                    // remove slashes so wp_kses works properly (its wp_kses_stripslashes() function
2792
-                                    // only removes slashes from double-quotes, so attributes using single quotes always
2793
-                                    // appear invalid.) But currently the models expect slashed data, so after wp_kses
2794
-                                    // runs we need to re-slash the data. Sheesh. See
2795
-                                    // https://events.codebasehq.com/projects/event-espresso/tickets/11211#update-47321587
2796
-                                    $set_column_values['MTP_content'][ $key ] = addslashes(
2797
-                                        wp_kses(
2798
-                                            stripslashes($value),
2799
-                                            wp_kses_allowed_html('post')
2800
-                                        )
2801
-                                    );
2802
-                                }
2803
-                            } else {
2804
-                                $set_column_values['MTP_content'] = wp_kses(
2805
-                                    $set_column_values['MTP_content'],
2806
-                                    wp_kses_allowed_html('post')
2807
-                                );
2808
-                            }
2809
-                        }
2810
-                        $message_template_fields = array(
2811
-                            'GRP_ID'             => $set_column_values['GRP_ID'],
2812
-                            'MTP_template_field' => $set_column_values['MTP_template_field'],
2813
-                            'MTP_context'        => $set_column_values['MTP_context'],
2814
-                            'MTP_content'        => $set_column_values['MTP_content'],
2815
-                        );
2816
-                        if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2817
-                            if ($updated === false) {
2818
-                                EE_Error::add_error(
2819
-                                    sprintf(
2820
-                                        esc_html__('%s field was NOT updated for some reason', 'event_espresso'),
2821
-                                        $template_field
2822
-                                    ),
2823
-                                    __FILE__,
2824
-                                    __FUNCTION__,
2825
-                                    __LINE__
2826
-                                );
2827
-                            } else {
2828
-                                $success = 1;
2829
-                            }
2830
-                        } else {
2831
-                            // only do this logic if we don't have a MTP_ID for this field
2832
-                            if (empty($this->_req_data['MTP_template_fields'][ $template_field ]['MTP_ID'])) {
2833
-                                // this has already been through the template field validator and sanitized, so it will be
2834
-                                // safe to insert this field.  Why insert?  This typically happens when we introduce a new
2835
-                                // message template field in a messenger/message type and existing users don't have the
2836
-                                // default setup for it.
2837
-                                // @link https://events.codebasehq.com/projects/event-espresso/tickets/9465
2838
-                                $updated = $MTP->insert($message_template_fields);
2839
-                                if (! $updated || is_wp_error($updated)) {
2840
-                                    EE_Error::add_error(
2841
-                                        sprintf(
2842
-                                            esc_html__('%s field could not be updated.', 'event_espresso'),
2843
-                                            $template_field
2844
-                                        ),
2845
-                                        __FILE__,
2846
-                                        __FUNCTION__,
2847
-                                        __LINE__
2848
-                                    );
2849
-                                    $success = 0;
2850
-                                } else {
2851
-                                    $success = 1;
2852
-                                }
2853
-                            }
2854
-                        }
2855
-                        $action_desc = 'updated';
2856
-                    }
2857
-
2858
-                    // we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2859
-                    $mtpg_fields = array(
2860
-                        'MTP_user_id'      => $set_column_values['MTP_user_id'],
2861
-                        'MTP_messenger'    => $set_column_values['MTP_messenger'],
2862
-                        'MTP_message_type' => $set_column_values['MTP_message_type'],
2863
-                        'MTP_is_global'    => $set_column_values['MTP_is_global'],
2864
-                        'MTP_is_override'  => $set_column_values['MTP_is_override'],
2865
-                        'MTP_deleted'      => $set_column_values['MTP_deleted'],
2866
-                        'MTP_is_active'    => $set_column_values['MTP_is_active'],
2867
-                        'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2868
-                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2869
-                            : '',
2870
-                        'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2871
-                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2872
-                            : '',
2873
-                    );
2874
-
2875
-                    $mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2876
-                    $updated = $MTPG->update($mtpg_fields, array($mtpg_where));
2877
-
2878
-                    if ($updated === false) {
2879
-                        EE_Error::add_error(
2880
-                            sprintf(
2881
-                                esc_html__(
2882
-                                    'The Message Template Group (%d) was NOT updated for some reason',
2883
-                                    'event_espresso'
2884
-                                ),
2885
-                                $set_column_values['GRP_ID']
2886
-                            ),
2887
-                            __FILE__,
2888
-                            __FUNCTION__,
2889
-                            __LINE__
2890
-                        );
2891
-                    } else {
2892
-                        // k now we need to ensure the template_pack and template_variation fields are set.
2893
-                        $template_pack = ! empty($this->_req_data['MTP_template_pack'])
2894
-                            ? $this->_req_data['MTP_template_pack']
2895
-                            : 'default';
2896
-
2897
-                        $template_variation = ! empty($this->_req_data['MTP_template_variation'])
2898
-                            ? $this->_req_data['MTP_template_variation']
2899
-                            : 'default';
2900
-
2901
-                        $mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2902
-                        if ($mtpg_obj instanceof EE_Message_Template_Group) {
2903
-                            $mtpg_obj->set_template_pack_name($template_pack);
2904
-                            $mtpg_obj->set_template_pack_variation($template_variation);
2905
-                        }
2906
-                        $success = 1;
2907
-                    }
2908
-                }
2909
-            }
2910
-        }
2911
-
2912
-        // we return things differently if doing ajax
2913
-        if (defined('DOING_AJAX') && DOING_AJAX) {
2914
-            $this->_template_args['success'] = $success;
2915
-            $this->_template_args['error'] = ! $success ? true : false;
2916
-            $this->_template_args['content'] = '';
2917
-            $this->_template_args['data'] = array(
2918
-                'grpID'        => $edit_array['GRP_ID'],
2919
-                'templateName' => $edit_array['template_name'],
2920
-            );
2921
-            if ($success) {
2922
-                EE_Error::overwrite_success();
2923
-                EE_Error::add_success(
2924
-                    esc_html__(
2925
-                        'The new template has been created and automatically selected for this event.  You can edit the new template by clicking the edit button.  Note before this template is assigned to this event, the event must be saved.',
2926
-                        'event_espresso'
2927
-                    )
2928
-                );
2929
-            }
2930
-
2931
-            $this->_return_json();
2932
-        }
2933
-
2934
-
2935
-        // was a test send triggered?
2936
-        if (isset($this->_req_data['test_button'])) {
2937
-            EE_Error::overwrite_success();
2938
-            $this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2939
-            $override = true;
2940
-        }
2941
-
2942
-        if (empty($query_args)) {
2943
-            $query_args = array(
2944
-                'id'      => $this->_req_data['GRP_ID'],
2945
-                'context' => $context_slug,
2946
-                'action'  => 'edit_message_template',
2947
-            );
2948
-        }
2949
-
2950
-        $this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2951
-    }
2952
-
2953
-
2954
-    /**
2955
-     * processes a test send request to do an actual messenger delivery test for the given message template being tested
2956
-     *
2957
-     * @param  string $context      what context being tested
2958
-     * @param  string $messenger    messenger being tested
2959
-     * @param  string $message_type message type being tested
2960
-     * @throws EE_Error
2961
-     * @throws InvalidArgumentException
2962
-     * @throws InvalidDataTypeException
2963
-     * @throws InvalidInterfaceException
2964
-     */
2965
-    protected function _do_test_send($context, $messenger, $message_type)
2966
-    {
2967
-        // set things up for preview
2968
-        $this->_req_data['messenger'] = $messenger;
2969
-        $this->_req_data['message_type'] = $message_type;
2970
-        $this->_req_data['context'] = $context;
2971
-        $this->_req_data['GRP_ID'] = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
2972
-        $active_messenger = $this->_message_resource_manager->get_active_messenger($messenger);
2973
-
2974
-        // let's save any existing fields that might be required by the messenger
2975
-        if (isset($this->_req_data['test_settings_fld'])
2976
-            && $active_messenger instanceof EE_messenger
2977
-            && apply_filters(
2978
-                'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
2979
-                true,
2980
-                $this->_req_data['test_settings_fld'],
2981
-                $active_messenger
2982
-            )
2983
-        ) {
2984
-            $active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
2985
-        }
2986
-
2987
-        /**
2988
-         * Use filter to add additional controls on whether message can send or not
2989
-         */
2990
-        if (apply_filters(
2991
-            'FHEE__Messages_Admin_Page__do_test_send__can_send',
2992
-            true,
2993
-            $context,
2994
-            $this->_req_data,
2995
-            $messenger,
2996
-            $message_type
2997
-        )) {
2998
-            $success = $this->_preview_message(true);
2999
-            if ($success) {
3000
-                EE_Error::add_success(__('Test message sent', 'event_espresso'));
3001
-            } else {
3002
-                EE_Error::add_error(
3003
-                    esc_html__('The test message was not sent', 'event_espresso'),
3004
-                    __FILE__,
3005
-                    __FUNCTION__,
3006
-                    __LINE__
3007
-                );
3008
-            }
3009
-        }
3010
-    }
3011
-
3012
-
3013
-    /**
3014
-     * _generate_new_templates
3015
-     * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
3016
-     * automatically create the defaults for the event.  The user would then be redirected to edit the default context
3017
-     * for the event.
3018
-     *
3019
-     *
3020
-     * @param  string $messenger     the messenger we are generating templates for
3021
-     * @param array   $message_types array of message types that the templates are generated for.
3022
-     * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
3023
-     *                               indicate the message_template_group being used as the base.
3024
-     *
3025
-     * @param bool    $global
3026
-     *
3027
-     * @return array|bool array of data required for the redirect to the correct edit page or bool if
3028
-     *                               encountering problems.
3029
-     * @throws EE_Error
3030
-     */
3031
-    protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
3032
-    {
3033
-
3034
-        // if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we
3035
-        // just don't generate any templates.
3036
-        if (empty($message_types)) {
3037
-            return true;
3038
-        }
3039
-
3040
-        return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
3041
-    }
3042
-
3043
-
3044
-    /**
3045
-     * [_trash_or_restore_message_template]
3046
-     *
3047
-     * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
3048
-     * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
3049
-     *                        an individual context (FALSE).
3050
-     * @return void
3051
-     * @throws EE_Error
3052
-     * @throws InvalidArgumentException
3053
-     * @throws InvalidDataTypeException
3054
-     * @throws InvalidInterfaceException
3055
-     */
3056
-    protected function _trash_or_restore_message_template($trash = true, $all = false)
3057
-    {
3058
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3059
-        $MTP = EEM_Message_Template_Group::instance();
3060
-
3061
-        $success = 1;
3062
-
3063
-        // incoming GRP_IDs
3064
-        if ($all) {
3065
-            // Checkboxes
3066
-            if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3067
-                // if array has more than one element then success message should be plural.
3068
-                // todo: what about nonce?
3069
-                $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3070
-
3071
-                // cycle through checkboxes
3072
-                while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3073
-                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3074
-                    if (! $trashed_or_restored) {
3075
-                        $success = 0;
3076
-                    }
3077
-                }
3078
-            } else {
3079
-                // grab single GRP_ID and handle
3080
-                $GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
3081
-                if (! empty($GRP_ID)) {
3082
-                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3083
-                    if (! $trashed_or_restored) {
3084
-                        $success = 0;
3085
-                    }
3086
-                } else {
3087
-                    $success = 0;
3088
-                }
3089
-            }
3090
-        }
3091
-
3092
-        $action_desc = $trash
3093
-            ? esc_html__('moved to the trash', 'event_espresso')
3094
-            : esc_html__('restored', 'event_espresso');
3095
-
3096
-        $action_desc = ! empty($this->_req_data['template_switch']) ? esc_html__('switched', 'event_espresso') : $action_desc;
3097
-
3098
-        $item_desc = $all ? _n(
3099
-            'Message Template Group',
3100
-            'Message Template Groups',
3101
-            $success,
3102
-            'event_espresso'
3103
-        ) : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
3104
-
3105
-        $item_desc = ! empty($this->_req_data['template_switch']) ? _n(
3106
-            'template',
3107
-            'templates',
3108
-            $success,
3109
-            'event_espresso'
3110
-        ) : $item_desc;
3111
-
3112
-        $this->_redirect_after_action($success, $item_desc, $action_desc, array());
3113
-    }
3114
-
3115
-
3116
-    /**
3117
-     * [_delete_message_template]
3118
-     * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
3119
-     *
3120
-     * @return void
3121
-     * @throws EE_Error
3122
-     * @throws InvalidArgumentException
3123
-     * @throws InvalidDataTypeException
3124
-     * @throws InvalidInterfaceException
3125
-     */
3126
-    protected function _delete_message_template()
3127
-    {
3128
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3129
-
3130
-        // checkboxes
3131
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3132
-            // if array has more than one element then success message should be plural
3133
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3134
-
3135
-            // cycle through bulk action checkboxes
3136
-            while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3137
-                $success = $this->_delete_mtp_permanently($GRP_ID);
3138
-            }
3139
-        } else {
3140
-            // grab single grp_id and delete
3141
-            $GRP_ID = absint($this->_req_data['id']);
3142
-            $success = $this->_delete_mtp_permanently($GRP_ID);
3143
-        }
3144
-
3145
-        $this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
3146
-    }
3147
-
3148
-
3149
-    /**
3150
-     * helper for permanently deleting a mtP group and all related message_templates
3151
-     *
3152
-     * @param  int  $GRP_ID        The group being deleted
3153
-     * @param  bool $include_group whether to delete the Message Template Group as well.
3154
-     * @return bool boolean to indicate the success of the deletes or not.
3155
-     * @throws EE_Error
3156
-     * @throws InvalidArgumentException
3157
-     * @throws InvalidDataTypeException
3158
-     * @throws InvalidInterfaceException
3159
-     */
3160
-    private function _delete_mtp_permanently($GRP_ID, $include_group = true)
3161
-    {
3162
-        $success = 1;
3163
-        $MTPG = EEM_Message_Template_Group::instance();
3164
-        // first let's GET this group
3165
-        $MTG = $MTPG->get_one_by_ID($GRP_ID);
3166
-        // then delete permanently all the related Message Templates
3167
-        $deleted = $MTG->delete_related_permanently('Message_Template');
3168
-
3169
-        if ($deleted === 0) {
3170
-            $success = 0;
3171
-        }
3172
-
3173
-        // now delete permanently this particular group
3174
-
3175
-        if ($include_group && ! $MTG->delete_permanently()) {
3176
-            $success = 0;
3177
-        }
3178
-
3179
-        return $success;
3180
-    }
3181
-
3182
-
3183
-    /**
3184
-     *    _learn_more_about_message_templates_link
3185
-     *
3186
-     * @access protected
3187
-     * @return string
3188
-     */
3189
-    protected function _learn_more_about_message_templates_link()
3190
-    {
3191
-        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >'
3192
-               . esc_html__('learn more about how message templates works', 'event_espresso')
3193
-               . '</a>';
3194
-    }
3195
-
3196
-
3197
-    /**
3198
-     * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
3199
-     * ajax and other routes.
3200
-     *
3201
-     * @return void
3202
-     * @throws DomainException
3203
-     */
3204
-    protected function _settings()
3205
-    {
3206
-
3207
-
3208
-        $this->_set_m_mt_settings();
3209
-
3210
-        $selected_messenger = isset($this->_req_data['selected_messenger'])
3211
-            ? $this->_req_data['selected_messenger']
3212
-            : 'email';
3213
-
3214
-        // let's setup the messenger tabs
3215
-        $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
3216
-            $this->_m_mt_settings['messenger_tabs'],
3217
-            'messenger_links',
3218
-            '|',
3219
-            $selected_messenger
3220
-        );
3221
-        $this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
3222
-        $this->_template_args['after_admin_page_content'] = '</div><!-- end .ui-widget -->';
3223
-
3224
-        $this->display_admin_page_with_sidebar();
3225
-    }
3226
-
3227
-
3228
-    /**
3229
-     * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
3230
-     *
3231
-     * @access protected
3232
-     * @return void
3233
-     * @throws DomainException
3234
-     */
3235
-    protected function _set_m_mt_settings()
3236
-    {
3237
-        // first if this is already set then lets get out no need to regenerate data.
3238
-        if (! empty($this->_m_mt_settings)) {
3239
-            return;
3240
-        }
3241
-
3242
-        // get all installed messengers and message_types
3243
-        /** @type EE_messenger[] $messengers */
3244
-        $messengers = $this->_message_resource_manager->installed_messengers();
3245
-        /** @type EE_message_type[] $message_types */
3246
-        $message_types = $this->_message_resource_manager->installed_message_types();
3247
-
3248
-
3249
-        // assemble the array for the _tab_text_links helper
3250
-
3251
-        foreach ($messengers as $messenger) {
3252
-            $this->_m_mt_settings['messenger_tabs'][ $messenger->name ] = array(
3253
-                'label' => ucwords($messenger->label['singular']),
3254
-                'class' => $this->_message_resource_manager->is_messenger_active($messenger->name)
3255
-                    ? 'messenger-active'
3256
-                    : '',
3257
-                'href'  => $messenger->name,
3258
-                'title' => esc_html__('Modify this Messenger', 'event_espresso'),
3259
-                'slug'  => $messenger->name,
3260
-                'obj'   => $messenger,
3261
-            );
3262
-
3263
-
3264
-            $message_types_for_messenger = $messenger->get_valid_message_types();
3265
-
3266
-            foreach ($message_types as $message_type) {
3267
-                // first we need to verify that this message type is valid with this messenger. Cause if it isn't then
3268
-                // it shouldn't show in either the inactive OR active metabox.
3269
-                if (! in_array($message_type->name, $message_types_for_messenger, true)) {
3270
-                    continue;
3271
-                }
3272
-
3273
-                $a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger(
3274
-                    $messenger->name,
3275
-                    $message_type->name
3276
-                )
3277
-                    ? 'active'
3278
-                    : 'inactive';
3279
-
3280
-                $this->_m_mt_settings['message_type_tabs'][ $messenger->name ][ $a_or_i ][ $message_type->name ] = array(
3281
-                    'label'    => ucwords($message_type->label['singular']),
3282
-                    'class'    => 'message-type-' . $a_or_i,
3283
-                    'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
3284
-                    'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
3285
-                    'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
3286
-                    'title'    => $a_or_i === 'active'
3287
-                        ? esc_html__('Drag this message type to the Inactive window to deactivate', 'event_espresso')
3288
-                        : esc_html__('Drag this message type to the messenger to activate', 'event_espresso'),
3289
-                    'content'  => $a_or_i === 'active'
3290
-                        ? $this->_message_type_settings_content($message_type, $messenger, true)
3291
-                        : $this->_message_type_settings_content($message_type, $messenger),
3292
-                    'slug'     => $message_type->name,
3293
-                    'active'   => $a_or_i === 'active',
3294
-                    'obj'      => $message_type,
3295
-                );
3296
-            }
3297
-        }
3298
-    }
3299
-
3300
-
3301
-    /**
3302
-     * This just prepares the content for the message type settings
3303
-     *
3304
-     * @param  EE_message_type $message_type The message type object
3305
-     * @param  EE_messenger    $messenger    The messenger object
3306
-     * @param  boolean         $active       Whether the message type is active or not
3307
-     * @return string html output for the content
3308
-     * @throws DomainException
3309
-     */
3310
-    protected function _message_type_settings_content($message_type, $messenger, $active = false)
3311
-    {
3312
-        // get message type fields
3313
-        $fields = $message_type->get_admin_settings_fields();
3314
-        $settings_template_args['template_form_fields'] = '';
3315
-
3316
-        if (! empty($fields) && $active) {
3317
-            $existing_settings = $message_type->get_existing_admin_settings($messenger->name);
3318
-            foreach ($fields as $fldname => $fldprops) {
3319
-                $field_id = $messenger->name . '-' . $message_type->name . '-' . $fldname;
3320
-                $template_form_field[ $field_id ] = array(
3321
-                    'name'       => 'message_type_settings[' . $fldname . ']',
3322
-                    'label'      => $fldprops['label'],
3323
-                    'input'      => $fldprops['field_type'],
3324
-                    'type'       => $fldprops['value_type'],
3325
-                    'required'   => $fldprops['required'],
3326
-                    'validation' => $fldprops['validation'],
3327
-                    'value'      => isset($existing_settings[ $fldname ])
3328
-                        ? $existing_settings[ $fldname ]
3329
-                        : $fldprops['default'],
3330
-                    'options'    => isset($fldprops['options'])
3331
-                        ? $fldprops['options']
3332
-                        : array(),
3333
-                    'default'    => isset($existing_settings[ $fldname ])
3334
-                        ? $existing_settings[ $fldname ]
3335
-                        : $fldprops['default'],
3336
-                    'css_class'  => 'no-drag',
3337
-                    'format'     => $fldprops['format'],
3338
-                );
3339
-            }
3340
-
3341
-
3342
-            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3343
-                ? $this->_generate_admin_form_fields(
3344
-                    $template_form_field,
3345
-                    'string',
3346
-                    'ee_mt_activate_form'
3347
-                )
3348
-                : '';
3349
-        }
3350
-
3351
-        $settings_template_args['description'] = $message_type->description;
3352
-        // we also need some hidden fields
3353
-        $settings_template_args['hidden_fields'] = array(
3354
-            'message_type_settings[messenger]'    => array(
3355
-                'type'  => 'hidden',
3356
-                'value' => $messenger->name,
3357
-            ),
3358
-            'message_type_settings[message_type]' => array(
3359
-                'type'  => 'hidden',
3360
-                'value' => $message_type->name,
3361
-            ),
3362
-            'type'                                => array(
3363
-                'type'  => 'hidden',
3364
-                'value' => 'message_type',
3365
-            ),
3366
-        );
3367
-
3368
-        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3369
-            $settings_template_args['hidden_fields'],
3370
-            'array'
3371
-        );
3372
-        $settings_template_args['show_form'] = empty($settings_template_args['template_form_fields'])
3373
-            ? ' hidden'
3374
-            : '';
3375
-
3376
-
3377
-        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
3378
-        $content = EEH_Template::display_template($template, $settings_template_args, true);
3379
-
3380
-        return $content;
3381
-    }
3382
-
3383
-
3384
-    /**
3385
-     * Generate all the metaboxes for the message types and register them for the messages settings page.
3386
-     *
3387
-     * @access protected
3388
-     * @return void
3389
-     * @throws DomainException
3390
-     */
3391
-    protected function _messages_settings_metaboxes()
3392
-    {
3393
-        $this->_set_m_mt_settings();
3394
-        $m_boxes = $mt_boxes = array();
3395
-        $m_template_args = $mt_template_args = array();
3396
-
3397
-        $selected_messenger = isset($this->_req_data['selected_messenger'])
3398
-            ? $this->_req_data['selected_messenger']
3399
-            : 'email';
3400
-
3401
-        if (isset($this->_m_mt_settings['messenger_tabs'])) {
3402
-            foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
3403
-                $hide_on_message = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
3404
-                $hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
3405
-                // messenger meta boxes
3406
-                $active = $selected_messenger === $messenger;
3407
-                $active_mt_tabs = isset(
3408
-                    $this->_m_mt_settings['message_type_tabs'][ $messenger ]['active']
3409
-                )
3410
-                    ? $this->_m_mt_settings['message_type_tabs'][ $messenger ]['active']
3411
-                    : '';
3412
-                $m_boxes[ $messenger . '_a_box' ] = sprintf(
3413
-                    esc_html__('%s Settings', 'event_espresso'),
3414
-                    $tab_array['label']
3415
-                );
3416
-                $m_template_args[ $messenger . '_a_box' ] = array(
3417
-                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3418
-                    'inactive_message_types' => isset(
3419
-                        $this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive']
3420
-                    )
3421
-                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive'])
3422
-                        : '',
3423
-                    'content'                => $this->_get_messenger_box_content($tab_array['obj']),
3424
-                    'hidden'                 => $active ? '' : ' hidden',
3425
-                    'hide_on_message'        => $hide_on_message,
3426
-                    'messenger'              => $messenger,
3427
-                    'active'                 => $active,
3428
-                );
3429
-                // message type meta boxes
3430
-                // (which is really just the inactive container for each messenger
3431
-                // showing inactive message types for that messenger)
3432
-                $mt_boxes[ $messenger . '_i_box' ] = esc_html__('Inactive Message Types', 'event_espresso');
3433
-                $mt_template_args[ $messenger . '_i_box' ] = array(
3434
-                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3435
-                    'inactive_message_types' => isset(
3436
-                        $this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive']
3437
-                    )
3438
-                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive'])
3439
-                        : '',
3440
-                    'hidden'                 => $active ? '' : ' hidden',
3441
-                    'hide_on_message'        => $hide_on_message,
3442
-                    'hide_off_message'       => $hide_off_message,
3443
-                    'messenger'              => $messenger,
3444
-                    'active'                 => $active,
3445
-                );
3446
-            }
3447
-        }
3448
-
3449
-
3450
-        // register messenger metaboxes
3451
-        $m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
3452
-        foreach ($m_boxes as $box => $label) {
3453
-            $callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[ $box ]);
3454
-            $msgr = str_replace('_a_box', '', $box);
3455
-            add_meta_box(
3456
-                'espresso_' . $msgr . '_settings',
3457
-                $label,
3458
-                function ($post, $metabox) {
3459
-                    echo EEH_Template::display_template(
3460
-                        $metabox["args"]["template_path"],
3461
-                        $metabox["args"]["template_args"],
3462
-                        true
3463
-                    );
3464
-                },
3465
-                $this->_current_screen->id,
3466
-                'normal',
3467
-                'high',
3468
-                $callback_args
3469
-            );
3470
-        }
3471
-
3472
-        // register message type metaboxes
3473
-        $mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
3474
-        foreach ($mt_boxes as $box => $label) {
3475
-            $callback_args = array(
3476
-                'template_path' => $mt_template_path,
3477
-                'template_args' => $mt_template_args[ $box ],
3478
-            );
3479
-            $mt = str_replace('_i_box', '', $box);
3480
-            add_meta_box(
3481
-                'espresso_' . $mt . '_inactive_mts',
3482
-                $label,
3483
-                function ($post, $metabox) {
3484
-                    echo EEH_Template::display_template(
3485
-                        $metabox["args"]["template_path"],
3486
-                        $metabox["args"]["template_args"],
3487
-                        true
3488
-                    );
3489
-                },
3490
-                $this->_current_screen->id,
3491
-                'side',
3492
-                'high',
3493
-                $callback_args
3494
-            );
3495
-        }
3496
-
3497
-        // register metabox for global messages settings but only when on the main site.  On single site installs this
3498
-        // will always result in the metabox showing, on multisite installs the metabox will only show on the main site.
3499
-        if (is_main_site()) {
3500
-            add_meta_box(
3501
-                'espresso_global_message_settings',
3502
-                esc_html__('Global Message Settings', 'event_espresso'),
3503
-                array($this, 'global_messages_settings_metabox_content'),
3504
-                $this->_current_screen->id,
3505
-                'normal',
3506
-                'low',
3507
-                array()
3508
-            );
3509
-        }
3510
-    }
3511
-
3512
-
3513
-    /**
3514
-     *  This generates the content for the global messages settings metabox.
3515
-     *
3516
-     * @return string
3517
-     * @throws EE_Error
3518
-     * @throws InvalidArgumentException
3519
-     * @throws ReflectionException
3520
-     * @throws InvalidDataTypeException
3521
-     * @throws InvalidInterfaceException
3522
-     */
3523
-    public function global_messages_settings_metabox_content()
3524
-    {
3525
-        $form = $this->_generate_global_settings_form();
3526
-        echo $form->form_open(
3527
-            $this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
3528
-            'POST'
3529
-        )
3530
-             . $form->get_html()
3531
-             . $form->form_close();
3532
-    }
3533
-
3534
-
3535
-    /**
3536
-     * This generates and returns the form object for the global messages settings.
3537
-     *
3538
-     * @return EE_Form_Section_Proper
3539
-     * @throws EE_Error
3540
-     * @throws InvalidArgumentException
3541
-     * @throws ReflectionException
3542
-     * @throws InvalidDataTypeException
3543
-     * @throws InvalidInterfaceException
3544
-     */
3545
-    protected function _generate_global_settings_form()
3546
-    {
3547
-        EE_Registry::instance()->load_helper('HTML');
3548
-        /** @var EE_Network_Core_Config $network_config */
3549
-        $network_config = EE_Registry::instance()->NET_CFG->core;
3550
-
3551
-        return new EE_Form_Section_Proper(
3552
-            array(
3553
-                'name'            => 'global_messages_settings',
3554
-                'html_id'         => 'global_messages_settings',
3555
-                'html_class'      => 'form-table',
3556
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3557
-                'subsections'     => apply_filters(
3558
-                    'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3559
-                    array(
3560
-                        'do_messages_on_same_request' => new EE_Select_Input(
3561
-                            array(
3562
-                                true  => esc_html__("On the same request", "event_espresso"),
3563
-                                false => esc_html__("On a separate request", "event_espresso"),
3564
-                            ),
3565
-                            array(
3566
-                                'default'         => $network_config->do_messages_on_same_request,
3567
-                                'html_label_text' => esc_html__(
3568
-                                    'Generate and send all messages:',
3569
-                                    'event_espresso'
3570
-                                ),
3571
-                                'html_help_text'  => esc_html__(
3572
-                                    'By default the messages system uses a more efficient means of processing messages on separate requests and utilizes the wp-cron scheduling system.  This makes things execute faster for people registering for your events.  However, if the wp-cron system is disabled on your site and there is no alternative in place, then you can change this so messages are always executed on the same request.',
3573
-                                    'event_espresso'
3574
-                                ),
3575
-                            )
3576
-                        ),
3577
-                        'delete_threshold'            => new EE_Select_Input(
3578
-                            array(
3579
-                                0  => esc_html__('Forever', 'event_espresso'),
3580
-                                3  => esc_html__('3 Months', 'event_espresso'),
3581
-                                6  => esc_html__('6 Months', 'event_espresso'),
3582
-                                9  => esc_html__('9 Months', 'event_espresso'),
3583
-                                12 => esc_html__('12 Months', 'event_espresso'),
3584
-                                24 => esc_html__('24 Months', 'event_espresso'),
3585
-                                36 => esc_html__('36 Months', 'event_espresso'),
3586
-                            ),
3587
-                            array(
3588
-                                'default'         => EE_Registry::instance()->CFG->messages->delete_threshold,
3589
-                                'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3590
-                                'html_help_text'  => esc_html__(
3591
-                                    'You can control how long a record of processed messages is kept via this option.',
3592
-                                    'event_espresso'
3593
-                                ),
3594
-                            )
3595
-                        ),
3596
-                        'update_settings'             => new EE_Submit_Input(
3597
-                            array(
3598
-                                'default'         => esc_html__('Update', 'event_espresso'),
3599
-                                'html_label_text' => '&nbsp',
3600
-                            )
3601
-                        ),
3602
-                    )
3603
-                ),
3604
-            )
3605
-        );
3606
-    }
3607
-
3608
-
3609
-    /**
3610
-     * This handles updating the global settings set on the admin page.
3611
-     *
3612
-     * @throws EE_Error
3613
-     * @throws InvalidDataTypeException
3614
-     * @throws InvalidInterfaceException
3615
-     * @throws InvalidArgumentException
3616
-     * @throws ReflectionException
3617
-     */
3618
-    protected function _update_global_settings()
3619
-    {
3620
-        /** @var EE_Network_Core_Config $network_config */
3621
-        $network_config = EE_Registry::instance()->NET_CFG->core;
3622
-        $messages_config = EE_Registry::instance()->CFG->messages;
3623
-        $form = $this->_generate_global_settings_form();
3624
-        if ($form->was_submitted()) {
3625
-            $form->receive_form_submission();
3626
-            if ($form->is_valid()) {
3627
-                $valid_data = $form->valid_data();
3628
-                foreach ($valid_data as $property => $value) {
3629
-                    $setter = 'set_' . $property;
3630
-                    if (method_exists($network_config, $setter)) {
3631
-                        $network_config->{$setter}($value);
3632
-                    } elseif (property_exists($network_config, $property)
3633
-                        && $network_config->{$property} !== $value
3634
-                    ) {
3635
-                        $network_config->{$property} = $value;
3636
-                    } elseif (property_exists($messages_config, $property)
3637
-                        && $messages_config->{$property} !== $value
3638
-                    ) {
3639
-                        $messages_config->{$property} = $value;
3640
-                    }
3641
-                }
3642
-                // only update if the form submission was valid!
3643
-                EE_Registry::instance()->NET_CFG->update_config(true, false);
3644
-                EE_Registry::instance()->CFG->update_espresso_config();
3645
-                EE_Error::overwrite_success();
3646
-                EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3647
-            }
3648
-        }
3649
-        $this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3650
-    }
3651
-
3652
-
3653
-    /**
3654
-     * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3655
-     *
3656
-     * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3657
-     * @return string html formatted tabs
3658
-     * @throws DomainException
3659
-     */
3660
-    protected function _get_mt_tabs($tab_array)
3661
-    {
3662
-        $tab_array = (array) $tab_array;
3663
-        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3664
-        $tabs = '';
3665
-
3666
-        foreach ($tab_array as $tab) {
3667
-            $tabs .= EEH_Template::display_template($template, $tab, true);
3668
-        }
3669
-
3670
-        return $tabs;
3671
-    }
3672
-
3673
-
3674
-    /**
3675
-     * This prepares the content of the messenger meta box admin settings
3676
-     *
3677
-     * @param  EE_messenger $messenger The messenger we're setting up content for
3678
-     * @return string html formatted content
3679
-     * @throws DomainException
3680
-     */
3681
-    protected function _get_messenger_box_content(EE_messenger $messenger)
3682
-    {
3683
-
3684
-        $fields = $messenger->get_admin_settings_fields();
3685
-        $settings_template_args['template_form_fields'] = '';
3686
-
3687
-        // is $messenger active?
3688
-        $settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3689
-
3690
-
3691
-        if (! empty($fields)) {
3692
-            $existing_settings = $messenger->get_existing_admin_settings();
3693
-
3694
-            foreach ($fields as $fldname => $fldprops) {
3695
-                $field_id = $messenger->name . '-' . $fldname;
3696
-                $template_form_field[ $field_id ] = array(
3697
-                    'name'       => 'messenger_settings[' . $field_id . ']',
3698
-                    'label'      => $fldprops['label'],
3699
-                    'input'      => $fldprops['field_type'],
3700
-                    'type'       => $fldprops['value_type'],
3701
-                    'required'   => $fldprops['required'],
3702
-                    'validation' => $fldprops['validation'],
3703
-                    'value'      => isset($existing_settings[ $field_id ])
3704
-                        ? $existing_settings[ $field_id ]
3705
-                        : $fldprops['default'],
3706
-                    'css_class'  => '',
3707
-                    'format'     => $fldprops['format'],
3708
-                );
3709
-            }
3710
-
3711
-
3712
-            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3713
-                ? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3714
-                : '';
3715
-        }
3716
-
3717
-        // we also need some hidden fields
3718
-        $settings_template_args['hidden_fields'] = array(
3719
-            'messenger_settings[messenger]' => array(
3720
-                'type'  => 'hidden',
3721
-                'value' => $messenger->name,
3722
-            ),
3723
-            'type'                          => array(
3724
-                'type'  => 'hidden',
3725
-                'value' => 'messenger',
3726
-            ),
3727
-        );
3728
-
3729
-        // make sure any active message types that are existing are included in the hidden fields
3730
-        if (isset($this->_m_mt_settings['message_type_tabs'][ $messenger->name ]['active'])) {
3731
-            foreach ($this->_m_mt_settings['message_type_tabs'][ $messenger->name ]['active'] as $mt => $values) {
3732
-                $settings_template_args['hidden_fields'][ 'messenger_settings[message_types][' . $mt . ']' ] = array(
3733
-                    'type'  => 'hidden',
3734
-                    'value' => $mt,
3735
-                );
3736
-            }
3737
-        }
3738
-        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3739
-            $settings_template_args['hidden_fields'],
3740
-            'array'
3741
-        );
3742
-        $active = $this->_message_resource_manager->is_messenger_active($messenger->name);
3743
-
3744
-        $settings_template_args['messenger'] = $messenger->name;
3745
-        $settings_template_args['description'] = $messenger->description;
3746
-        $settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3747
-
3748
-
3749
-        $settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active(
3750
-            $messenger->name
3751
-        )
3752
-            ? $settings_template_args['show_hide_edit_form']
3753
-            : ' hidden';
3754
-
3755
-        $settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3756
-            ? ' hidden'
3757
-            : $settings_template_args['show_hide_edit_form'];
3758
-
3759
-
3760
-        $settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3761
-        $settings_template_args['nonce'] = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3762
-        $settings_template_args['on_off_status'] = $active ? true : false;
3763
-        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3764
-        $content = EEH_Template::display_template(
3765
-            $template,
3766
-            $settings_template_args,
3767
-            true
3768
-        );
3769
-
3770
-        return $content;
3771
-    }
3772
-
3773
-
3774
-    /**
3775
-     * used by ajax on the messages settings page to activate|deactivate the messenger
3776
-     *
3777
-     * @throws DomainException
3778
-     * @throws EE_Error
3779
-     * @throws InvalidDataTypeException
3780
-     * @throws InvalidInterfaceException
3781
-     * @throws InvalidArgumentException
3782
-     * @throws ReflectionException
3783
-     */
3784
-    public function activate_messenger_toggle()
3785
-    {
3786
-        $success = true;
3787
-        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3788
-        // let's check that we have required data
3789
-        if (! isset($this->_req_data['messenger'])) {
3790
-            EE_Error::add_error(
3791
-                esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3792
-                __FILE__,
3793
-                __FUNCTION__,
3794
-                __LINE__
3795
-            );
3796
-            $success = false;
3797
-        }
3798
-
3799
-        // do a nonce check here since we're not arriving via a normal route
3800
-        $nonce = isset($this->_req_data['activate_nonce'])
3801
-            ? sanitize_text_field($this->_req_data['activate_nonce'])
3802
-            : '';
3803
-        $nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3804
-
3805
-        $this->_verify_nonce($nonce, $nonce_ref);
3806
-
3807
-
3808
-        if (! isset($this->_req_data['status'])) {
3809
-            EE_Error::add_error(
3810
-                esc_html__(
3811
-                    'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3812
-                    'event_espresso'
3813
-                ),
3814
-                __FILE__,
3815
-                __FUNCTION__,
3816
-                __LINE__
3817
-            );
3818
-            $success = false;
3819
-        }
3820
-
3821
-        // do check to verify we have a valid status.
3822
-        $status = $this->_req_data['status'];
3823
-
3824
-        if ($status !== 'off' && $status !== 'on') {
3825
-            EE_Error::add_error(
3826
-                sprintf(
3827
-                    esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3828
-                    $this->_req_data['status']
3829
-                ),
3830
-                __FILE__,
3831
-                __FUNCTION__,
3832
-                __LINE__
3833
-            );
3834
-            $success = false;
3835
-        }
3836
-
3837
-        if ($success) {
3838
-            // made it here?  Stop dawdling then!!
3839
-            $success = $status === 'off'
3840
-                ? $this->_deactivate_messenger($this->_req_data['messenger'])
3841
-                : $this->_activate_messenger($this->_req_data['messenger']);
3842
-        }
3843
-
3844
-        $this->_template_args['success'] = $success;
3845
-
3846
-        // no special instructions so let's just do the json return (which should automatically do all the special stuff).
3847
-        $this->_return_json();
3848
-    }
3849
-
3850
-
3851
-    /**
3852
-     * used by ajax from the messages settings page to activate|deactivate a message type
3853
-     *
3854
-     * @throws DomainException
3855
-     * @throws EE_Error
3856
-     * @throws ReflectionException
3857
-     * @throws InvalidDataTypeException
3858
-     * @throws InvalidInterfaceException
3859
-     * @throws InvalidArgumentException
3860
-     */
3861
-    public function activate_mt_toggle()
3862
-    {
3863
-        $success = true;
3864
-        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3865
-
3866
-        // let's make sure we have the necessary data
3867
-        if (! isset($this->_req_data['message_type'])) {
3868
-            EE_Error::add_error(
3869
-                esc_html__('Message Type name needed to toggle activation. None given', 'event_espresso'),
3870
-                __FILE__,
3871
-                __FUNCTION__,
3872
-                __LINE__
3873
-            );
3874
-            $success = false;
3875
-        }
3876
-
3877
-        if (! isset($this->_req_data['messenger'])) {
3878
-            EE_Error::add_error(
3879
-                esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3880
-                __FILE__,
3881
-                __FUNCTION__,
3882
-                __LINE__
3883
-            );
3884
-            $success = false;
3885
-        }
3886
-
3887
-        if (! isset($this->_req_data['status'])) {
3888
-            EE_Error::add_error(
3889
-                esc_html__(
3890
-                    'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3891
-                    'event_espresso'
3892
-                ),
3893
-                __FILE__,
3894
-                __FUNCTION__,
3895
-                __LINE__
3896
-            );
3897
-            $success = false;
3898
-        }
3899
-
3900
-
3901
-        // do check to verify we have a valid status.
3902
-        $status = $this->_req_data['status'];
3903
-
3904
-        if ($status !== 'activate' && $status !== 'deactivate') {
3905
-            EE_Error::add_error(
3906
-                sprintf(
3907
-                    esc_html__('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3908
-                    $this->_req_data['status']
3909
-                ),
3910
-                __FILE__,
3911
-                __FUNCTION__,
3912
-                __LINE__
3913
-            );
3914
-            $success = false;
3915
-        }
3916
-
3917
-
3918
-        // do a nonce check here since we're not arriving via a normal route
3919
-        $nonce = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3920
-        $nonce_ref = $this->_req_data['message_type'] . '_nonce';
3921
-
3922
-        $this->_verify_nonce($nonce, $nonce_ref);
3923
-
3924
-        if ($success) {
3925
-            // made it here? um, what are you waiting for then?
3926
-            $success = $status === 'deactivate'
3927
-                ? $this->_deactivate_message_type_for_messenger(
3928
-                    $this->_req_data['messenger'],
3929
-                    $this->_req_data['message_type']
3930
-                )
3931
-                : $this->_activate_message_type_for_messenger(
3932
-                    $this->_req_data['messenger'],
3933
-                    $this->_req_data['message_type']
3934
-                );
3935
-        }
3936
-
3937
-        $this->_template_args['success'] = $success;
3938
-        $this->_return_json();
3939
-    }
3940
-
3941
-
3942
-    /**
3943
-     * Takes care of processing activating a messenger and preparing the appropriate response.
3944
-     *
3945
-     * @param string $messenger_name The name of the messenger being activated
3946
-     * @return bool
3947
-     * @throws DomainException
3948
-     * @throws EE_Error
3949
-     * @throws InvalidArgumentException
3950
-     * @throws ReflectionException
3951
-     * @throws InvalidDataTypeException
3952
-     * @throws InvalidInterfaceException
3953
-     */
3954
-    protected function _activate_messenger($messenger_name)
3955
-    {
3956
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3957
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3958
-        $message_types_to_activate = $active_messenger instanceof EE_Messenger
3959
-            ? $active_messenger->get_default_message_types()
3960
-            : array();
3961
-
3962
-        // ensure is active
3963
-        $this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
3964
-
3965
-        // set response_data for reload
3966
-        foreach ($message_types_to_activate as $message_type_name) {
3967
-            /** @var EE_message_type $message_type */
3968
-            $message_type = $this->_message_resource_manager->get_message_type($message_type_name);
3969
-            if ($this->_message_resource_manager->is_message_type_active_for_messenger(
3970
-                $messenger_name,
3971
-                $message_type_name
3972
-            )
3973
-                && $message_type instanceof EE_message_type
3974
-            ) {
3975
-                $this->_template_args['data']['active_mts'][] = $message_type_name;
3976
-                if ($message_type->get_admin_settings_fields()) {
3977
-                    $this->_template_args['data']['mt_reload'][] = $message_type_name;
3978
-                }
3979
-            }
3980
-        }
3981
-
3982
-        // add success message for activating messenger
3983
-        return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
3984
-    }
3985
-
3986
-
3987
-    /**
3988
-     * Takes care of processing deactivating a messenger and preparing the appropriate response.
3989
-     *
3990
-     * @param string $messenger_name The name of the messenger being activated
3991
-     * @return bool
3992
-     * @throws DomainException
3993
-     * @throws EE_Error
3994
-     * @throws InvalidArgumentException
3995
-     * @throws ReflectionException
3996
-     * @throws InvalidDataTypeException
3997
-     * @throws InvalidInterfaceException
3998
-     */
3999
-    protected function _deactivate_messenger($messenger_name)
4000
-    {
4001
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4002
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4003
-        $this->_message_resource_manager->deactivate_messenger($messenger_name);
4004
-
4005
-        return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
4006
-    }
4007
-
4008
-
4009
-    /**
4010
-     * Takes care of processing activating a message type for a messenger and preparing the appropriate response.
4011
-     *
4012
-     * @param string $messenger_name    The name of the messenger the message type is being activated for.
4013
-     * @param string $message_type_name The name of the message type being activated for the messenger
4014
-     * @return bool
4015
-     * @throws DomainException
4016
-     * @throws EE_Error
4017
-     * @throws InvalidArgumentException
4018
-     * @throws ReflectionException
4019
-     * @throws InvalidDataTypeException
4020
-     * @throws InvalidInterfaceException
4021
-     */
4022
-    protected function _activate_message_type_for_messenger($messenger_name, $message_type_name)
4023
-    {
4024
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4025
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4026
-        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4027
-        $message_type_to_activate = $this->_message_resource_manager->get_message_type($message_type_name);
4028
-
4029
-        // ensure is active
4030
-        $this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
4031
-
4032
-        // set response for load
4033
-        if ($this->_message_resource_manager->is_message_type_active_for_messenger(
4034
-            $messenger_name,
4035
-            $message_type_name
4036
-        )
4037
-        ) {
4038
-            $this->_template_args['data']['active_mts'][] = $message_type_name;
4039
-            if ($message_type_to_activate->get_admin_settings_fields()) {
4040
-                $this->_template_args['data']['mt_reload'][] = $message_type_name;
4041
-            }
4042
-        }
4043
-
4044
-        return $this->_setup_response_message_for_activating_messenger_with_message_types(
4045
-            $active_messenger,
4046
-            $message_type_to_activate
4047
-        );
4048
-    }
4049
-
4050
-
4051
-    /**
4052
-     * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
4053
-     *
4054
-     * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
4055
-     * @param string $message_type_name The name of the message type being deactivated for the messenger
4056
-     * @return bool
4057
-     * @throws DomainException
4058
-     * @throws EE_Error
4059
-     * @throws InvalidArgumentException
4060
-     * @throws ReflectionException
4061
-     * @throws InvalidDataTypeException
4062
-     * @throws InvalidInterfaceException
4063
-     */
4064
-    protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
4065
-    {
4066
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4067
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4068
-        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4069
-        $message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
4070
-        $this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
4071
-
4072
-        return $this->_setup_response_message_for_deactivating_messenger_with_message_types(
4073
-            $active_messenger,
4074
-            $message_type_to_deactivate
4075
-        );
4076
-    }
4077
-
4078
-
4079
-    /**
4080
-     * This just initializes the defaults for activating messenger and message type responses.
4081
-     */
4082
-    protected function _prep_default_response_for_messenger_or_message_type_toggle()
4083
-    {
4084
-        $this->_template_args['data']['active_mts'] = array();
4085
-        $this->_template_args['data']['mt_reload'] = array();
4086
-    }
4087
-
4088
-
4089
-    /**
4090
-     * Setup appropriate response for activating a messenger and/or message types
4091
-     *
4092
-     * @param EE_messenger         $messenger
4093
-     * @param EE_message_type|null $message_type
4094
-     * @return bool
4095
-     * @throws DomainException
4096
-     * @throws EE_Error
4097
-     * @throws InvalidArgumentException
4098
-     * @throws ReflectionException
4099
-     * @throws InvalidDataTypeException
4100
-     * @throws InvalidInterfaceException
4101
-     */
4102
-    protected function _setup_response_message_for_activating_messenger_with_message_types(
4103
-        $messenger,
4104
-        EE_Message_Type $message_type = null
4105
-    ) {
4106
-        // if $messenger isn't a valid messenger object then get out.
4107
-        if (! $messenger instanceof EE_Messenger) {
4108
-            EE_Error::add_error(
4109
-                esc_html__('The messenger being activated is not a valid messenger', 'event_espresso'),
4110
-                __FILE__,
4111
-                __FUNCTION__,
4112
-                __LINE__
4113
-            );
4114
-
4115
-            return false;
4116
-        }
4117
-        // activated
4118
-        if ($this->_template_args['data']['active_mts']) {
4119
-            EE_Error::overwrite_success();
4120
-            // activated a message type with the messenger
4121
-            if ($message_type instanceof EE_message_type) {
4122
-                EE_Error::add_success(
4123
-                    sprintf(
4124
-                        esc_html__(
4125
-                            '%s message type has been successfully activated with the %s messenger',
4126
-                            'event_espresso'
4127
-                        ),
4128
-                        ucwords($message_type->label['singular']),
4129
-                        ucwords($messenger->label['singular'])
4130
-                    )
4131
-                );
4132
-
4133
-                // if message type was invoice then let's make sure we activate the invoice payment method.
4134
-                if ($message_type->name === 'invoice') {
4135
-                    EE_Registry::instance()->load_lib('Payment_Method_Manager');
4136
-                    $pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
4137
-                    if ($pm instanceof EE_Payment_Method) {
4138
-                        EE_Error::add_attention(
4139
-                            esc_html__(
4140
-                                'Activating the invoice message type also automatically activates the invoice payment method.  If you do not wish the invoice payment method to be active, or to change its settings, visit the payment method admin page.',
4141
-                                'event_espresso'
4142
-                            )
4143
-                        );
4144
-                    }
4145
-                }
4146
-                // just toggles the entire messenger
4147
-            } else {
4148
-                EE_Error::add_success(
4149
-                    sprintf(
4150
-                        esc_html__('%s messenger has been successfully activated', 'event_espresso'),
4151
-                        ucwords($messenger->label['singular'])
4152
-                    )
4153
-                );
4154
-            }
4155
-
4156
-            return true;
4157
-
4158
-            // possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
4159
-            // message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
4160
-            // in which case we just give a success message for the messenger being successfully activated.
4161
-        } else {
4162
-            if (! $messenger->get_default_message_types()) {
4163
-                // messenger doesn't have any default message types so still a success.
4164
-                EE_Error::add_success(
4165
-                    sprintf(
4166
-                        esc_html__('%s messenger was successfully activated.', 'event_espresso'),
4167
-                        ucwords($messenger->label['singular'])
4168
-                    )
4169
-                );
4170
-
4171
-                return true;
4172
-            } else {
4173
-                EE_Error::add_error(
4174
-                    $message_type instanceof EE_message_type
4175
-                        ? sprintf(
4176
-                            esc_html__(
4177
-                                '%s message type was not successfully activated with the %s messenger',
4178
-                                'event_espresso'
4179
-                            ),
4180
-                            ucwords($message_type->label['singular']),
4181
-                            ucwords($messenger->label['singular'])
4182
-                        )
4183
-                        : sprintf(
4184
-                            esc_html__('%s messenger was not successfully activated', 'event_espresso'),
4185
-                            ucwords($messenger->label['singular'])
4186
-                        ),
4187
-                    __FILE__,
4188
-                    __FUNCTION__,
4189
-                    __LINE__
4190
-                );
4191
-
4192
-                return false;
4193
-            }
4194
-        }
4195
-    }
4196
-
4197
-
4198
-    /**
4199
-     * This sets up the appropriate response for deactivating a messenger and/or message type.
4200
-     *
4201
-     * @param EE_messenger         $messenger
4202
-     * @param EE_message_type|null $message_type
4203
-     * @return bool
4204
-     * @throws DomainException
4205
-     * @throws EE_Error
4206
-     * @throws InvalidArgumentException
4207
-     * @throws ReflectionException
4208
-     * @throws InvalidDataTypeException
4209
-     * @throws InvalidInterfaceException
4210
-     */
4211
-    protected function _setup_response_message_for_deactivating_messenger_with_message_types(
4212
-        $messenger,
4213
-        EE_message_type $message_type = null
4214
-    ) {
4215
-        EE_Error::overwrite_success();
4216
-
4217
-        // if $messenger isn't a valid messenger object then get out.
4218
-        if (! $messenger instanceof EE_Messenger) {
4219
-            EE_Error::add_error(
4220
-                esc_html__('The messenger being deactivated is not a valid messenger', 'event_espresso'),
4221
-                __FILE__,
4222
-                __FUNCTION__,
4223
-                __LINE__
4224
-            );
4225
-
4226
-            return false;
4227
-        }
4228
-
4229
-        if ($message_type instanceof EE_message_type) {
4230
-            $message_type_name = $message_type->name;
4231
-            EE_Error::add_success(
4232
-                sprintf(
4233
-                    esc_html__(
4234
-                        '%s message type has been successfully deactivated for the %s messenger.',
4235
-                        'event_espresso'
4236
-                    ),
4237
-                    ucwords($message_type->label['singular']),
4238
-                    ucwords($messenger->label['singular'])
4239
-                )
4240
-            );
4241
-        } else {
4242
-            $message_type_name = '';
4243
-            EE_Error::add_success(
4244
-                sprintf(
4245
-                    esc_html__('%s messenger has been successfully deactivated.', 'event_espresso'),
4246
-                    ucwords($messenger->label['singular'])
4247
-                )
4248
-            );
4249
-        }
4250
-
4251
-        // if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
4252
-        if ($messenger->name === 'html' || $message_type_name === 'invoice') {
4253
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
4254
-            $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
4255
-            if ($count_updated > 0) {
4256
-                $msg = $message_type_name === 'invoice'
4257
-                    ? esc_html__(
4258
-                        'Deactivating the invoice message type also automatically deactivates the invoice payment method. In order for invoices to be generated the invoice message type must be active. If you completed this action by mistake, simply reactivate the invoice message type and then visit the payment methods admin page to reactivate the invoice payment method.',
4259
-                        'event_espresso'
4260
-                    )
4261
-                    : esc_html__(
4262
-                        'Deactivating the html messenger also automatically deactivates the invoice payment method.  In order for invoices to be generated the html messenger must be be active.  If you completed this action by mistake, simply reactivate the html messenger, then visit the payment methods admin page to reactivate the invoice payment method.',
4263
-                        'event_espresso'
4264
-                    );
4265
-                EE_Error::add_attention($msg);
4266
-            }
4267
-        }
4268
-
4269
-        return true;
4270
-    }
4271
-
4272
-
4273
-    /**
4274
-     * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
4275
-     *
4276
-     * @throws DomainException
4277
-     */
4278
-    public function update_mt_form()
4279
-    {
4280
-        if (! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
4281
-            EE_Error::add_error(
4282
-                esc_html__('Require message type or messenger to send an updated form', 'event_espresso'),
4283
-                __FILE__,
4284
-                __FUNCTION__,
4285
-                __LINE__
4286
-            );
4287
-            $this->_return_json();
4288
-        }
4289
-
4290
-        $message_types = $this->get_installed_message_types();
4291
-
4292
-        $message_type = $message_types[ $this->_req_data['message_type'] ];
4293
-        $messenger = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
4294
-
4295
-        $content = $this->_message_type_settings_content(
4296
-            $message_type,
4297
-            $messenger,
4298
-            true
4299
-        );
4300
-        $this->_template_args['success'] = true;
4301
-        $this->_template_args['content'] = $content;
4302
-        $this->_return_json();
4303
-    }
4304
-
4305
-
4306
-    /**
4307
-     * this handles saving the settings for a messenger or message type
4308
-     *
4309
-     */
4310
-    public function save_settings()
4311
-    {
4312
-        if (! isset($this->_req_data['type'])) {
4313
-            EE_Error::add_error(
4314
-                esc_html__(
4315
-                    'Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
4316
-                    'event_espresso'
4317
-                ),
4318
-                __FILE__,
4319
-                __FUNCTION__,
4320
-                __LINE__
4321
-            );
4322
-            $this->_template_args['error'] = true;
4323
-            $this->_return_json();
4324
-        }
4325
-
4326
-
4327
-        if ($this->_req_data['type'] === 'messenger') {
4328
-            // this should be an array.
4329
-            $settings = $this->_req_data['messenger_settings'];
4330
-            $messenger = $settings['messenger'];
4331
-            // let's setup the settings data
4332
-            foreach ($settings as $key => $value) {
4333
-                switch ($key) {
4334
-                    case 'messenger':
4335
-                        unset($settings['messenger']);
4336
-                        break;
4337
-                    case 'message_types':
4338
-                        unset($settings['message_types']);
4339
-                        break;
4340
-                    default:
4341
-                        $settings[ $key ] = $value;
4342
-                        break;
4343
-                }
4344
-            }
4345
-            $this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
4346
-        } elseif ($this->_req_data['type'] === 'message_type') {
4347
-            $settings = $this->_req_data['message_type_settings'];
4348
-            $messenger = $settings['messenger'];
4349
-            $message_type = $settings['message_type'];
4350
-
4351
-            foreach ($settings as $key => $value) {
4352
-                switch ($key) {
4353
-                    case 'messenger':
4354
-                        unset($settings['messenger']);
4355
-                        break;
4356
-                    case 'message_type':
4357
-                        unset($settings['message_type']);
4358
-                        break;
4359
-                    default:
4360
-                        $settings[ $key ] = $value;
4361
-                        break;
4362
-                }
4363
-            }
4364
-
4365
-            $this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
4366
-        }
4367
-
4368
-        // okay we should have the data all setup.  Now we just update!
4369
-        $success = $this->_message_resource_manager->update_active_messengers_option();
4370
-
4371
-        if ($success) {
4372
-            EE_Error::add_success(__('Settings updated', 'event_espresso'));
4373
-        } else {
4374
-            EE_Error::add_error(
4375
-                esc_html__(
4376
-                    'Settings did not get updated',
4377
-                    'event_espresso'
4378
-                ),
4379
-                __FILE__,
4380
-                __FUNCTION__,
4381
-                __LINE__
4382
-            );
4383
-        }
4384
-
4385
-        $this->_template_args['success'] = $success;
4386
-        $this->_return_json();
4387
-    }
4388
-
4389
-
4390
-
4391
-
4392
-    /**  EE MESSAGE PROCESSING ACTIONS **/
4393
-
4394
-
4395
-    /**
4396
-     * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
4397
-     * However, this does not send immediately, it just queues for sending.
4398
-     *
4399
-     * @since 4.9.0
4400
-     * @throws EE_Error
4401
-     * @throws InvalidDataTypeException
4402
-     * @throws InvalidInterfaceException
4403
-     * @throws InvalidArgumentException
4404
-     * @throws ReflectionException
4405
-     */
4406
-    protected function _generate_now()
4407
-    {
4408
-        EED_Messages::generate_now($this->_get_msg_ids_from_request());
4409
-        $this->_redirect_after_action(false, '', '', array(), true);
4410
-    }
4411
-
4412
-
4413
-    /**
4414
-     * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
4415
-     * are EEM_Message::status_resend or EEM_Message::status_idle
4416
-     *
4417
-     * @since 4.9.0
4418
-     * @throws EE_Error
4419
-     * @throws InvalidDataTypeException
4420
-     * @throws InvalidInterfaceException
4421
-     * @throws InvalidArgumentException
4422
-     * @throws ReflectionException
4423
-     */
4424
-    protected function _generate_and_send_now()
4425
-    {
4426
-        EED_Messages::generate_and_send_now($this->_get_msg_ids_from_request());
4427
-        $this->_redirect_after_action(false, '', '', array(), true);
4428
-    }
4429
-
4430
-
4431
-    /**
4432
-     * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
4433
-     *
4434
-     * @since 4.9.0
4435
-     * @throws EE_Error
4436
-     * @throws InvalidDataTypeException
4437
-     * @throws InvalidInterfaceException
4438
-     * @throws InvalidArgumentException
4439
-     * @throws ReflectionException
4440
-     */
4441
-    protected function _queue_for_resending()
4442
-    {
4443
-        EED_Messages::queue_for_resending($this->_get_msg_ids_from_request());
4444
-        $this->_redirect_after_action(false, '', '', array(), true);
4445
-    }
4446
-
4447
-
4448
-    /**
4449
-     *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
4450
-     *
4451
-     * @since 4.9.0
4452
-     * @throws EE_Error
4453
-     * @throws InvalidDataTypeException
4454
-     * @throws InvalidInterfaceException
4455
-     * @throws InvalidArgumentException
4456
-     * @throws ReflectionException
4457
-     */
4458
-    protected function _send_now()
4459
-    {
4460
-        EED_Messages::send_now($this->_get_msg_ids_from_request());
4461
-        $this->_redirect_after_action(false, '', '', array(), true);
4462
-    }
4463
-
4464
-
4465
-    /**
4466
-     * Deletes EE_messages for IDs in the request.
4467
-     *
4468
-     * @since 4.9.0
4469
-     * @throws EE_Error
4470
-     * @throws InvalidDataTypeException
4471
-     * @throws InvalidInterfaceException
4472
-     * @throws InvalidArgumentException
4473
-     */
4474
-    protected function _delete_ee_messages()
4475
-    {
4476
-        $msg_ids = $this->_get_msg_ids_from_request();
4477
-        $deleted_count = 0;
4478
-        foreach ($msg_ids as $msg_id) {
4479
-            if (EEM_Message::instance()->delete_by_ID($msg_id)) {
4480
-                $deleted_count++;
4481
-            }
4482
-        }
4483
-        if ($deleted_count) {
4484
-            EE_Error::add_success(
4485
-                esc_html(
4486
-                    _n(
4487
-                        'Message successfully deleted',
4488
-                        'Messages successfully deleted',
4489
-                        $deleted_count,
4490
-                        'event_espresso'
4491
-                    )
4492
-                )
4493
-            );
4494
-            $this->_redirect_after_action(
4495
-                false,
4496
-                '',
4497
-                '',
4498
-                array(),
4499
-                true
4500
-            );
4501
-        } else {
4502
-            EE_Error::add_error(
4503
-                _n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
4504
-                __FILE__,
4505
-                __FUNCTION__,
4506
-                __LINE__
4507
-            );
4508
-            $this->_redirect_after_action(false, '', '', array(), true);
4509
-        }
4510
-    }
4511
-
4512
-
4513
-    /**
4514
-     *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
4515
-     *
4516
-     * @since 4.9.0
4517
-     * @return array
4518
-     */
4519
-    protected function _get_msg_ids_from_request()
4520
-    {
4521
-        if (! isset($this->_req_data['MSG_ID'])) {
4522
-            return array();
4523
-        }
4524
-
4525
-        return is_array($this->_req_data['MSG_ID'])
4526
-            ? array_keys($this->_req_data['MSG_ID'])
4527
-            : array($this->_req_data['MSG_ID']);
4528
-    }
2612
+		$output = ob_get_contents();
2613
+		ob_clean();
2614
+		$this->_context_switcher = $output;
2615
+	}
2616
+
2617
+
2618
+	/**
2619
+	 * utility for sanitizing new values coming in.
2620
+	 * Note: this is only used when updating a context.
2621
+	 *
2622
+	 * @access protected
2623
+	 *
2624
+	 * @param int $index This helps us know which template field to select from the request array.
2625
+	 *
2626
+	 * @return array
2627
+	 */
2628
+	protected function _set_message_template_column_values($index)
2629
+	{
2630
+		if (is_array($this->_req_data['MTP_template_fields'][ $index ]['content'])) {
2631
+			foreach ($this->_req_data['MTP_template_fields'][ $index ]['content'] as $field => $value) {
2632
+				$this->_req_data['MTP_template_fields'][ $index ]['content'][ $field ] = $value;
2633
+			}
2634
+		}
2635
+
2636
+
2637
+		$set_column_values = array(
2638
+			'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][ $index ]['MTP_ID']),
2639
+			'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2640
+			'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2641
+			'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2642
+			'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2643
+			'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][ $index ]['name']),
2644
+			'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2645
+			'MTP_content'        => $this->_req_data['MTP_template_fields'][ $index ]['content'],
2646
+			'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2647
+				? absint($this->_req_data['MTP_is_global'])
2648
+				: 0,
2649
+			'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2650
+				? absint($this->_req_data['MTP_is_override'])
2651
+				: 0,
2652
+			'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2653
+			'MTP_is_active'      => absint($this->_req_data['MTP_is_active']),
2654
+		);
2655
+
2656
+
2657
+		return $set_column_values;
2658
+	}
2659
+
2660
+
2661
+	protected function _insert_or_update_message_template($new = false)
2662
+	{
2663
+
2664
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2665
+		$success = 0;
2666
+		$override = false;
2667
+
2668
+		// setup notices description
2669
+		$messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2670
+
2671
+		// need the message type and messenger objects to be able to use the labels for the notices
2672
+		$messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2673
+		$messenger_label = $messenger_object instanceof EE_messenger
2674
+			? ucwords($messenger_object->label['singular'])
2675
+			: '';
2676
+
2677
+		$message_type_slug = ! empty($this->_req_data['MTP_message_type'])
2678
+			? $this->_req_data['MTP_message_type']
2679
+			: '';
2680
+		$message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2681
+
2682
+		$message_type_label = $message_type_object instanceof EE_message_type
2683
+			? ucwords($message_type_object->label['singular'])
2684
+			: '';
2685
+
2686
+		$context_slug = ! empty($this->_req_data['MTP_context'])
2687
+			? $this->_req_data['MTP_context']
2688
+			: '';
2689
+		$context = ucwords(str_replace('_', ' ', $context_slug));
2690
+
2691
+		$item_desc = $messenger_label && $message_type_label
2692
+			? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' '
2693
+			: '';
2694
+		$item_desc .= 'Message Template';
2695
+		$query_args = array();
2696
+		$edit_array = array();
2697
+		$action_desc = '';
2698
+
2699
+		// if this is "new" then we need to generate the default contexts for the selected messenger/message_type for
2700
+		// user to edit.
2701
+		if ($new) {
2702
+			$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2703
+			if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2704
+				if (empty($edit_array)) {
2705
+					$success = 0;
2706
+				} else {
2707
+					$success = 1;
2708
+					$edit_array = $edit_array[0];
2709
+					$query_args = array(
2710
+						'id'      => $edit_array['GRP_ID'],
2711
+						'context' => $edit_array['MTP_context'],
2712
+						'action'  => 'edit_message_template',
2713
+					);
2714
+				}
2715
+			}
2716
+			$action_desc = 'created';
2717
+		} else {
2718
+			$MTPG = EEM_Message_Template_Group::instance();
2719
+			$MTP = EEM_Message_Template::instance();
2720
+
2721
+
2722
+			// run update for each template field in displayed context
2723
+			if (! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2724
+				EE_Error::add_error(
2725
+					esc_html__(
2726
+						'There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2727
+						'event_espresso'
2728
+					),
2729
+					__FILE__,
2730
+					__FUNCTION__,
2731
+					__LINE__
2732
+				);
2733
+				$success = 0;
2734
+			} else {
2735
+				// first validate all fields!
2736
+				// this filter allows client code to add its own validation to the template fields as well.
2737
+				// returning an empty array means everything passed validation.
2738
+				// errors in validation should be represented in an array with the following shape:
2739
+				// array(
2740
+				//   'fieldname' => array(
2741
+				//          'msg' => 'error message'
2742
+				//          'value' => 'value for field producing error'
2743
+				// )
2744
+				$custom_validation = (array) apply_filters(
2745
+					'FHEE__Messages_Admin_Page___insert_or_update_message_template__validates',
2746
+					array(),
2747
+					$this->_req_data['MTP_template_fields'],
2748
+					$context_slug,
2749
+					$messenger_slug,
2750
+					$message_type_slug
2751
+				);
2752
+
2753
+				$system_validation = $MTPG->validate(
2754
+					$this->_req_data['MTP_template_fields'],
2755
+					$context_slug,
2756
+					$messenger_slug,
2757
+					$message_type_slug
2758
+				);
2759
+
2760
+				$system_validation = ! is_array($system_validation) && $system_validation ? array()
2761
+					: $system_validation;
2762
+				$validates = array_merge($custom_validation, $system_validation);
2763
+
2764
+				// if $validate returned error messages (i.e. is_array()) then we need to process them and setup an
2765
+				// appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.
2766
+				//  WE need to make sure there is no actual error messages in validates.
2767
+				if (is_array($validates) && ! empty($validates)) {
2768
+					// add the transient so when the form loads we know which fields to highlight
2769
+					$this->_add_transient('edit_message_template', $validates);
2770
+
2771
+					$success = 0;
2772
+
2773
+					// setup notices
2774
+					foreach ($validates as $field => $error) {
2775
+						if (isset($error['msg'])) {
2776
+							EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2777
+						}
2778
+					}
2779
+				} else {
2780
+					$set_column_values = array();
2781
+					foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2782
+						$set_column_values = $this->_set_message_template_column_values($template_field);
2783
+
2784
+						$where_cols_n_values = array(
2785
+							'MTP_ID' => $this->_req_data['MTP_template_fields'][ $template_field ]['MTP_ID'],
2786
+						);
2787
+						// if they aren't allowed to use all JS, restrict them to just posty-y tags
2788
+						if (! current_user_can('unfiltered_html')) {
2789
+							if (is_array($set_column_values['MTP_content'])) {
2790
+								foreach ($set_column_values['MTP_content'] as $key => $value) {
2791
+									// remove slashes so wp_kses works properly (its wp_kses_stripslashes() function
2792
+									// only removes slashes from double-quotes, so attributes using single quotes always
2793
+									// appear invalid.) But currently the models expect slashed data, so after wp_kses
2794
+									// runs we need to re-slash the data. Sheesh. See
2795
+									// https://events.codebasehq.com/projects/event-espresso/tickets/11211#update-47321587
2796
+									$set_column_values['MTP_content'][ $key ] = addslashes(
2797
+										wp_kses(
2798
+											stripslashes($value),
2799
+											wp_kses_allowed_html('post')
2800
+										)
2801
+									);
2802
+								}
2803
+							} else {
2804
+								$set_column_values['MTP_content'] = wp_kses(
2805
+									$set_column_values['MTP_content'],
2806
+									wp_kses_allowed_html('post')
2807
+								);
2808
+							}
2809
+						}
2810
+						$message_template_fields = array(
2811
+							'GRP_ID'             => $set_column_values['GRP_ID'],
2812
+							'MTP_template_field' => $set_column_values['MTP_template_field'],
2813
+							'MTP_context'        => $set_column_values['MTP_context'],
2814
+							'MTP_content'        => $set_column_values['MTP_content'],
2815
+						);
2816
+						if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2817
+							if ($updated === false) {
2818
+								EE_Error::add_error(
2819
+									sprintf(
2820
+										esc_html__('%s field was NOT updated for some reason', 'event_espresso'),
2821
+										$template_field
2822
+									),
2823
+									__FILE__,
2824
+									__FUNCTION__,
2825
+									__LINE__
2826
+								);
2827
+							} else {
2828
+								$success = 1;
2829
+							}
2830
+						} else {
2831
+							// only do this logic if we don't have a MTP_ID for this field
2832
+							if (empty($this->_req_data['MTP_template_fields'][ $template_field ]['MTP_ID'])) {
2833
+								// this has already been through the template field validator and sanitized, so it will be
2834
+								// safe to insert this field.  Why insert?  This typically happens when we introduce a new
2835
+								// message template field in a messenger/message type and existing users don't have the
2836
+								// default setup for it.
2837
+								// @link https://events.codebasehq.com/projects/event-espresso/tickets/9465
2838
+								$updated = $MTP->insert($message_template_fields);
2839
+								if (! $updated || is_wp_error($updated)) {
2840
+									EE_Error::add_error(
2841
+										sprintf(
2842
+											esc_html__('%s field could not be updated.', 'event_espresso'),
2843
+											$template_field
2844
+										),
2845
+										__FILE__,
2846
+										__FUNCTION__,
2847
+										__LINE__
2848
+									);
2849
+									$success = 0;
2850
+								} else {
2851
+									$success = 1;
2852
+								}
2853
+							}
2854
+						}
2855
+						$action_desc = 'updated';
2856
+					}
2857
+
2858
+					// we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2859
+					$mtpg_fields = array(
2860
+						'MTP_user_id'      => $set_column_values['MTP_user_id'],
2861
+						'MTP_messenger'    => $set_column_values['MTP_messenger'],
2862
+						'MTP_message_type' => $set_column_values['MTP_message_type'],
2863
+						'MTP_is_global'    => $set_column_values['MTP_is_global'],
2864
+						'MTP_is_override'  => $set_column_values['MTP_is_override'],
2865
+						'MTP_deleted'      => $set_column_values['MTP_deleted'],
2866
+						'MTP_is_active'    => $set_column_values['MTP_is_active'],
2867
+						'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2868
+							? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2869
+							: '',
2870
+						'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2871
+							? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2872
+							: '',
2873
+					);
2874
+
2875
+					$mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2876
+					$updated = $MTPG->update($mtpg_fields, array($mtpg_where));
2877
+
2878
+					if ($updated === false) {
2879
+						EE_Error::add_error(
2880
+							sprintf(
2881
+								esc_html__(
2882
+									'The Message Template Group (%d) was NOT updated for some reason',
2883
+									'event_espresso'
2884
+								),
2885
+								$set_column_values['GRP_ID']
2886
+							),
2887
+							__FILE__,
2888
+							__FUNCTION__,
2889
+							__LINE__
2890
+						);
2891
+					} else {
2892
+						// k now we need to ensure the template_pack and template_variation fields are set.
2893
+						$template_pack = ! empty($this->_req_data['MTP_template_pack'])
2894
+							? $this->_req_data['MTP_template_pack']
2895
+							: 'default';
2896
+
2897
+						$template_variation = ! empty($this->_req_data['MTP_template_variation'])
2898
+							? $this->_req_data['MTP_template_variation']
2899
+							: 'default';
2900
+
2901
+						$mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2902
+						if ($mtpg_obj instanceof EE_Message_Template_Group) {
2903
+							$mtpg_obj->set_template_pack_name($template_pack);
2904
+							$mtpg_obj->set_template_pack_variation($template_variation);
2905
+						}
2906
+						$success = 1;
2907
+					}
2908
+				}
2909
+			}
2910
+		}
2911
+
2912
+		// we return things differently if doing ajax
2913
+		if (defined('DOING_AJAX') && DOING_AJAX) {
2914
+			$this->_template_args['success'] = $success;
2915
+			$this->_template_args['error'] = ! $success ? true : false;
2916
+			$this->_template_args['content'] = '';
2917
+			$this->_template_args['data'] = array(
2918
+				'grpID'        => $edit_array['GRP_ID'],
2919
+				'templateName' => $edit_array['template_name'],
2920
+			);
2921
+			if ($success) {
2922
+				EE_Error::overwrite_success();
2923
+				EE_Error::add_success(
2924
+					esc_html__(
2925
+						'The new template has been created and automatically selected for this event.  You can edit the new template by clicking the edit button.  Note before this template is assigned to this event, the event must be saved.',
2926
+						'event_espresso'
2927
+					)
2928
+				);
2929
+			}
2930
+
2931
+			$this->_return_json();
2932
+		}
2933
+
2934
+
2935
+		// was a test send triggered?
2936
+		if (isset($this->_req_data['test_button'])) {
2937
+			EE_Error::overwrite_success();
2938
+			$this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2939
+			$override = true;
2940
+		}
2941
+
2942
+		if (empty($query_args)) {
2943
+			$query_args = array(
2944
+				'id'      => $this->_req_data['GRP_ID'],
2945
+				'context' => $context_slug,
2946
+				'action'  => 'edit_message_template',
2947
+			);
2948
+		}
2949
+
2950
+		$this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2951
+	}
2952
+
2953
+
2954
+	/**
2955
+	 * processes a test send request to do an actual messenger delivery test for the given message template being tested
2956
+	 *
2957
+	 * @param  string $context      what context being tested
2958
+	 * @param  string $messenger    messenger being tested
2959
+	 * @param  string $message_type message type being tested
2960
+	 * @throws EE_Error
2961
+	 * @throws InvalidArgumentException
2962
+	 * @throws InvalidDataTypeException
2963
+	 * @throws InvalidInterfaceException
2964
+	 */
2965
+	protected function _do_test_send($context, $messenger, $message_type)
2966
+	{
2967
+		// set things up for preview
2968
+		$this->_req_data['messenger'] = $messenger;
2969
+		$this->_req_data['message_type'] = $message_type;
2970
+		$this->_req_data['context'] = $context;
2971
+		$this->_req_data['GRP_ID'] = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
2972
+		$active_messenger = $this->_message_resource_manager->get_active_messenger($messenger);
2973
+
2974
+		// let's save any existing fields that might be required by the messenger
2975
+		if (isset($this->_req_data['test_settings_fld'])
2976
+			&& $active_messenger instanceof EE_messenger
2977
+			&& apply_filters(
2978
+				'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
2979
+				true,
2980
+				$this->_req_data['test_settings_fld'],
2981
+				$active_messenger
2982
+			)
2983
+		) {
2984
+			$active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
2985
+		}
2986
+
2987
+		/**
2988
+		 * Use filter to add additional controls on whether message can send or not
2989
+		 */
2990
+		if (apply_filters(
2991
+			'FHEE__Messages_Admin_Page__do_test_send__can_send',
2992
+			true,
2993
+			$context,
2994
+			$this->_req_data,
2995
+			$messenger,
2996
+			$message_type
2997
+		)) {
2998
+			$success = $this->_preview_message(true);
2999
+			if ($success) {
3000
+				EE_Error::add_success(__('Test message sent', 'event_espresso'));
3001
+			} else {
3002
+				EE_Error::add_error(
3003
+					esc_html__('The test message was not sent', 'event_espresso'),
3004
+					__FILE__,
3005
+					__FUNCTION__,
3006
+					__LINE__
3007
+				);
3008
+			}
3009
+		}
3010
+	}
3011
+
3012
+
3013
+	/**
3014
+	 * _generate_new_templates
3015
+	 * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
3016
+	 * automatically create the defaults for the event.  The user would then be redirected to edit the default context
3017
+	 * for the event.
3018
+	 *
3019
+	 *
3020
+	 * @param  string $messenger     the messenger we are generating templates for
3021
+	 * @param array   $message_types array of message types that the templates are generated for.
3022
+	 * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
3023
+	 *                               indicate the message_template_group being used as the base.
3024
+	 *
3025
+	 * @param bool    $global
3026
+	 *
3027
+	 * @return array|bool array of data required for the redirect to the correct edit page or bool if
3028
+	 *                               encountering problems.
3029
+	 * @throws EE_Error
3030
+	 */
3031
+	protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
3032
+	{
3033
+
3034
+		// if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we
3035
+		// just don't generate any templates.
3036
+		if (empty($message_types)) {
3037
+			return true;
3038
+		}
3039
+
3040
+		return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
3041
+	}
3042
+
3043
+
3044
+	/**
3045
+	 * [_trash_or_restore_message_template]
3046
+	 *
3047
+	 * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
3048
+	 * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
3049
+	 *                        an individual context (FALSE).
3050
+	 * @return void
3051
+	 * @throws EE_Error
3052
+	 * @throws InvalidArgumentException
3053
+	 * @throws InvalidDataTypeException
3054
+	 * @throws InvalidInterfaceException
3055
+	 */
3056
+	protected function _trash_or_restore_message_template($trash = true, $all = false)
3057
+	{
3058
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3059
+		$MTP = EEM_Message_Template_Group::instance();
3060
+
3061
+		$success = 1;
3062
+
3063
+		// incoming GRP_IDs
3064
+		if ($all) {
3065
+			// Checkboxes
3066
+			if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3067
+				// if array has more than one element then success message should be plural.
3068
+				// todo: what about nonce?
3069
+				$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3070
+
3071
+				// cycle through checkboxes
3072
+				while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3073
+					$trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3074
+					if (! $trashed_or_restored) {
3075
+						$success = 0;
3076
+					}
3077
+				}
3078
+			} else {
3079
+				// grab single GRP_ID and handle
3080
+				$GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
3081
+				if (! empty($GRP_ID)) {
3082
+					$trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3083
+					if (! $trashed_or_restored) {
3084
+						$success = 0;
3085
+					}
3086
+				} else {
3087
+					$success = 0;
3088
+				}
3089
+			}
3090
+		}
3091
+
3092
+		$action_desc = $trash
3093
+			? esc_html__('moved to the trash', 'event_espresso')
3094
+			: esc_html__('restored', 'event_espresso');
3095
+
3096
+		$action_desc = ! empty($this->_req_data['template_switch']) ? esc_html__('switched', 'event_espresso') : $action_desc;
3097
+
3098
+		$item_desc = $all ? _n(
3099
+			'Message Template Group',
3100
+			'Message Template Groups',
3101
+			$success,
3102
+			'event_espresso'
3103
+		) : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
3104
+
3105
+		$item_desc = ! empty($this->_req_data['template_switch']) ? _n(
3106
+			'template',
3107
+			'templates',
3108
+			$success,
3109
+			'event_espresso'
3110
+		) : $item_desc;
3111
+
3112
+		$this->_redirect_after_action($success, $item_desc, $action_desc, array());
3113
+	}
3114
+
3115
+
3116
+	/**
3117
+	 * [_delete_message_template]
3118
+	 * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
3119
+	 *
3120
+	 * @return void
3121
+	 * @throws EE_Error
3122
+	 * @throws InvalidArgumentException
3123
+	 * @throws InvalidDataTypeException
3124
+	 * @throws InvalidInterfaceException
3125
+	 */
3126
+	protected function _delete_message_template()
3127
+	{
3128
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3129
+
3130
+		// checkboxes
3131
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3132
+			// if array has more than one element then success message should be plural
3133
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3134
+
3135
+			// cycle through bulk action checkboxes
3136
+			while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
3137
+				$success = $this->_delete_mtp_permanently($GRP_ID);
3138
+			}
3139
+		} else {
3140
+			// grab single grp_id and delete
3141
+			$GRP_ID = absint($this->_req_data['id']);
3142
+			$success = $this->_delete_mtp_permanently($GRP_ID);
3143
+		}
3144
+
3145
+		$this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
3146
+	}
3147
+
3148
+
3149
+	/**
3150
+	 * helper for permanently deleting a mtP group and all related message_templates
3151
+	 *
3152
+	 * @param  int  $GRP_ID        The group being deleted
3153
+	 * @param  bool $include_group whether to delete the Message Template Group as well.
3154
+	 * @return bool boolean to indicate the success of the deletes or not.
3155
+	 * @throws EE_Error
3156
+	 * @throws InvalidArgumentException
3157
+	 * @throws InvalidDataTypeException
3158
+	 * @throws InvalidInterfaceException
3159
+	 */
3160
+	private function _delete_mtp_permanently($GRP_ID, $include_group = true)
3161
+	{
3162
+		$success = 1;
3163
+		$MTPG = EEM_Message_Template_Group::instance();
3164
+		// first let's GET this group
3165
+		$MTG = $MTPG->get_one_by_ID($GRP_ID);
3166
+		// then delete permanently all the related Message Templates
3167
+		$deleted = $MTG->delete_related_permanently('Message_Template');
3168
+
3169
+		if ($deleted === 0) {
3170
+			$success = 0;
3171
+		}
3172
+
3173
+		// now delete permanently this particular group
3174
+
3175
+		if ($include_group && ! $MTG->delete_permanently()) {
3176
+			$success = 0;
3177
+		}
3178
+
3179
+		return $success;
3180
+	}
3181
+
3182
+
3183
+	/**
3184
+	 *    _learn_more_about_message_templates_link
3185
+	 *
3186
+	 * @access protected
3187
+	 * @return string
3188
+	 */
3189
+	protected function _learn_more_about_message_templates_link()
3190
+	{
3191
+		return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >'
3192
+			   . esc_html__('learn more about how message templates works', 'event_espresso')
3193
+			   . '</a>';
3194
+	}
3195
+
3196
+
3197
+	/**
3198
+	 * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
3199
+	 * ajax and other routes.
3200
+	 *
3201
+	 * @return void
3202
+	 * @throws DomainException
3203
+	 */
3204
+	protected function _settings()
3205
+	{
3206
+
3207
+
3208
+		$this->_set_m_mt_settings();
3209
+
3210
+		$selected_messenger = isset($this->_req_data['selected_messenger'])
3211
+			? $this->_req_data['selected_messenger']
3212
+			: 'email';
3213
+
3214
+		// let's setup the messenger tabs
3215
+		$this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
3216
+			$this->_m_mt_settings['messenger_tabs'],
3217
+			'messenger_links',
3218
+			'|',
3219
+			$selected_messenger
3220
+		);
3221
+		$this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
3222
+		$this->_template_args['after_admin_page_content'] = '</div><!-- end .ui-widget -->';
3223
+
3224
+		$this->display_admin_page_with_sidebar();
3225
+	}
3226
+
3227
+
3228
+	/**
3229
+	 * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
3230
+	 *
3231
+	 * @access protected
3232
+	 * @return void
3233
+	 * @throws DomainException
3234
+	 */
3235
+	protected function _set_m_mt_settings()
3236
+	{
3237
+		// first if this is already set then lets get out no need to regenerate data.
3238
+		if (! empty($this->_m_mt_settings)) {
3239
+			return;
3240
+		}
3241
+
3242
+		// get all installed messengers and message_types
3243
+		/** @type EE_messenger[] $messengers */
3244
+		$messengers = $this->_message_resource_manager->installed_messengers();
3245
+		/** @type EE_message_type[] $message_types */
3246
+		$message_types = $this->_message_resource_manager->installed_message_types();
3247
+
3248
+
3249
+		// assemble the array for the _tab_text_links helper
3250
+
3251
+		foreach ($messengers as $messenger) {
3252
+			$this->_m_mt_settings['messenger_tabs'][ $messenger->name ] = array(
3253
+				'label' => ucwords($messenger->label['singular']),
3254
+				'class' => $this->_message_resource_manager->is_messenger_active($messenger->name)
3255
+					? 'messenger-active'
3256
+					: '',
3257
+				'href'  => $messenger->name,
3258
+				'title' => esc_html__('Modify this Messenger', 'event_espresso'),
3259
+				'slug'  => $messenger->name,
3260
+				'obj'   => $messenger,
3261
+			);
3262
+
3263
+
3264
+			$message_types_for_messenger = $messenger->get_valid_message_types();
3265
+
3266
+			foreach ($message_types as $message_type) {
3267
+				// first we need to verify that this message type is valid with this messenger. Cause if it isn't then
3268
+				// it shouldn't show in either the inactive OR active metabox.
3269
+				if (! in_array($message_type->name, $message_types_for_messenger, true)) {
3270
+					continue;
3271
+				}
3272
+
3273
+				$a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger(
3274
+					$messenger->name,
3275
+					$message_type->name
3276
+				)
3277
+					? 'active'
3278
+					: 'inactive';
3279
+
3280
+				$this->_m_mt_settings['message_type_tabs'][ $messenger->name ][ $a_or_i ][ $message_type->name ] = array(
3281
+					'label'    => ucwords($message_type->label['singular']),
3282
+					'class'    => 'message-type-' . $a_or_i,
3283
+					'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
3284
+					'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
3285
+					'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
3286
+					'title'    => $a_or_i === 'active'
3287
+						? esc_html__('Drag this message type to the Inactive window to deactivate', 'event_espresso')
3288
+						: esc_html__('Drag this message type to the messenger to activate', 'event_espresso'),
3289
+					'content'  => $a_or_i === 'active'
3290
+						? $this->_message_type_settings_content($message_type, $messenger, true)
3291
+						: $this->_message_type_settings_content($message_type, $messenger),
3292
+					'slug'     => $message_type->name,
3293
+					'active'   => $a_or_i === 'active',
3294
+					'obj'      => $message_type,
3295
+				);
3296
+			}
3297
+		}
3298
+	}
3299
+
3300
+
3301
+	/**
3302
+	 * This just prepares the content for the message type settings
3303
+	 *
3304
+	 * @param  EE_message_type $message_type The message type object
3305
+	 * @param  EE_messenger    $messenger    The messenger object
3306
+	 * @param  boolean         $active       Whether the message type is active or not
3307
+	 * @return string html output for the content
3308
+	 * @throws DomainException
3309
+	 */
3310
+	protected function _message_type_settings_content($message_type, $messenger, $active = false)
3311
+	{
3312
+		// get message type fields
3313
+		$fields = $message_type->get_admin_settings_fields();
3314
+		$settings_template_args['template_form_fields'] = '';
3315
+
3316
+		if (! empty($fields) && $active) {
3317
+			$existing_settings = $message_type->get_existing_admin_settings($messenger->name);
3318
+			foreach ($fields as $fldname => $fldprops) {
3319
+				$field_id = $messenger->name . '-' . $message_type->name . '-' . $fldname;
3320
+				$template_form_field[ $field_id ] = array(
3321
+					'name'       => 'message_type_settings[' . $fldname . ']',
3322
+					'label'      => $fldprops['label'],
3323
+					'input'      => $fldprops['field_type'],
3324
+					'type'       => $fldprops['value_type'],
3325
+					'required'   => $fldprops['required'],
3326
+					'validation' => $fldprops['validation'],
3327
+					'value'      => isset($existing_settings[ $fldname ])
3328
+						? $existing_settings[ $fldname ]
3329
+						: $fldprops['default'],
3330
+					'options'    => isset($fldprops['options'])
3331
+						? $fldprops['options']
3332
+						: array(),
3333
+					'default'    => isset($existing_settings[ $fldname ])
3334
+						? $existing_settings[ $fldname ]
3335
+						: $fldprops['default'],
3336
+					'css_class'  => 'no-drag',
3337
+					'format'     => $fldprops['format'],
3338
+				);
3339
+			}
3340
+
3341
+
3342
+			$settings_template_args['template_form_fields'] = ! empty($template_form_field)
3343
+				? $this->_generate_admin_form_fields(
3344
+					$template_form_field,
3345
+					'string',
3346
+					'ee_mt_activate_form'
3347
+				)
3348
+				: '';
3349
+		}
3350
+
3351
+		$settings_template_args['description'] = $message_type->description;
3352
+		// we also need some hidden fields
3353
+		$settings_template_args['hidden_fields'] = array(
3354
+			'message_type_settings[messenger]'    => array(
3355
+				'type'  => 'hidden',
3356
+				'value' => $messenger->name,
3357
+			),
3358
+			'message_type_settings[message_type]' => array(
3359
+				'type'  => 'hidden',
3360
+				'value' => $message_type->name,
3361
+			),
3362
+			'type'                                => array(
3363
+				'type'  => 'hidden',
3364
+				'value' => 'message_type',
3365
+			),
3366
+		);
3367
+
3368
+		$settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3369
+			$settings_template_args['hidden_fields'],
3370
+			'array'
3371
+		);
3372
+		$settings_template_args['show_form'] = empty($settings_template_args['template_form_fields'])
3373
+			? ' hidden'
3374
+			: '';
3375
+
3376
+
3377
+		$template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
3378
+		$content = EEH_Template::display_template($template, $settings_template_args, true);
3379
+
3380
+		return $content;
3381
+	}
3382
+
3383
+
3384
+	/**
3385
+	 * Generate all the metaboxes for the message types and register them for the messages settings page.
3386
+	 *
3387
+	 * @access protected
3388
+	 * @return void
3389
+	 * @throws DomainException
3390
+	 */
3391
+	protected function _messages_settings_metaboxes()
3392
+	{
3393
+		$this->_set_m_mt_settings();
3394
+		$m_boxes = $mt_boxes = array();
3395
+		$m_template_args = $mt_template_args = array();
3396
+
3397
+		$selected_messenger = isset($this->_req_data['selected_messenger'])
3398
+			? $this->_req_data['selected_messenger']
3399
+			: 'email';
3400
+
3401
+		if (isset($this->_m_mt_settings['messenger_tabs'])) {
3402
+			foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
3403
+				$hide_on_message = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
3404
+				$hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
3405
+				// messenger meta boxes
3406
+				$active = $selected_messenger === $messenger;
3407
+				$active_mt_tabs = isset(
3408
+					$this->_m_mt_settings['message_type_tabs'][ $messenger ]['active']
3409
+				)
3410
+					? $this->_m_mt_settings['message_type_tabs'][ $messenger ]['active']
3411
+					: '';
3412
+				$m_boxes[ $messenger . '_a_box' ] = sprintf(
3413
+					esc_html__('%s Settings', 'event_espresso'),
3414
+					$tab_array['label']
3415
+				);
3416
+				$m_template_args[ $messenger . '_a_box' ] = array(
3417
+					'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3418
+					'inactive_message_types' => isset(
3419
+						$this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive']
3420
+					)
3421
+						? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive'])
3422
+						: '',
3423
+					'content'                => $this->_get_messenger_box_content($tab_array['obj']),
3424
+					'hidden'                 => $active ? '' : ' hidden',
3425
+					'hide_on_message'        => $hide_on_message,
3426
+					'messenger'              => $messenger,
3427
+					'active'                 => $active,
3428
+				);
3429
+				// message type meta boxes
3430
+				// (which is really just the inactive container for each messenger
3431
+				// showing inactive message types for that messenger)
3432
+				$mt_boxes[ $messenger . '_i_box' ] = esc_html__('Inactive Message Types', 'event_espresso');
3433
+				$mt_template_args[ $messenger . '_i_box' ] = array(
3434
+					'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3435
+					'inactive_message_types' => isset(
3436
+						$this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive']
3437
+					)
3438
+						? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive'])
3439
+						: '',
3440
+					'hidden'                 => $active ? '' : ' hidden',
3441
+					'hide_on_message'        => $hide_on_message,
3442
+					'hide_off_message'       => $hide_off_message,
3443
+					'messenger'              => $messenger,
3444
+					'active'                 => $active,
3445
+				);
3446
+			}
3447
+		}
3448
+
3449
+
3450
+		// register messenger metaboxes
3451
+		$m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
3452
+		foreach ($m_boxes as $box => $label) {
3453
+			$callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[ $box ]);
3454
+			$msgr = str_replace('_a_box', '', $box);
3455
+			add_meta_box(
3456
+				'espresso_' . $msgr . '_settings',
3457
+				$label,
3458
+				function ($post, $metabox) {
3459
+					echo EEH_Template::display_template(
3460
+						$metabox["args"]["template_path"],
3461
+						$metabox["args"]["template_args"],
3462
+						true
3463
+					);
3464
+				},
3465
+				$this->_current_screen->id,
3466
+				'normal',
3467
+				'high',
3468
+				$callback_args
3469
+			);
3470
+		}
3471
+
3472
+		// register message type metaboxes
3473
+		$mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
3474
+		foreach ($mt_boxes as $box => $label) {
3475
+			$callback_args = array(
3476
+				'template_path' => $mt_template_path,
3477
+				'template_args' => $mt_template_args[ $box ],
3478
+			);
3479
+			$mt = str_replace('_i_box', '', $box);
3480
+			add_meta_box(
3481
+				'espresso_' . $mt . '_inactive_mts',
3482
+				$label,
3483
+				function ($post, $metabox) {
3484
+					echo EEH_Template::display_template(
3485
+						$metabox["args"]["template_path"],
3486
+						$metabox["args"]["template_args"],
3487
+						true
3488
+					);
3489
+				},
3490
+				$this->_current_screen->id,
3491
+				'side',
3492
+				'high',
3493
+				$callback_args
3494
+			);
3495
+		}
3496
+
3497
+		// register metabox for global messages settings but only when on the main site.  On single site installs this
3498
+		// will always result in the metabox showing, on multisite installs the metabox will only show on the main site.
3499
+		if (is_main_site()) {
3500
+			add_meta_box(
3501
+				'espresso_global_message_settings',
3502
+				esc_html__('Global Message Settings', 'event_espresso'),
3503
+				array($this, 'global_messages_settings_metabox_content'),
3504
+				$this->_current_screen->id,
3505
+				'normal',
3506
+				'low',
3507
+				array()
3508
+			);
3509
+		}
3510
+	}
3511
+
3512
+
3513
+	/**
3514
+	 *  This generates the content for the global messages settings metabox.
3515
+	 *
3516
+	 * @return string
3517
+	 * @throws EE_Error
3518
+	 * @throws InvalidArgumentException
3519
+	 * @throws ReflectionException
3520
+	 * @throws InvalidDataTypeException
3521
+	 * @throws InvalidInterfaceException
3522
+	 */
3523
+	public function global_messages_settings_metabox_content()
3524
+	{
3525
+		$form = $this->_generate_global_settings_form();
3526
+		echo $form->form_open(
3527
+			$this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
3528
+			'POST'
3529
+		)
3530
+			 . $form->get_html()
3531
+			 . $form->form_close();
3532
+	}
3533
+
3534
+
3535
+	/**
3536
+	 * This generates and returns the form object for the global messages settings.
3537
+	 *
3538
+	 * @return EE_Form_Section_Proper
3539
+	 * @throws EE_Error
3540
+	 * @throws InvalidArgumentException
3541
+	 * @throws ReflectionException
3542
+	 * @throws InvalidDataTypeException
3543
+	 * @throws InvalidInterfaceException
3544
+	 */
3545
+	protected function _generate_global_settings_form()
3546
+	{
3547
+		EE_Registry::instance()->load_helper('HTML');
3548
+		/** @var EE_Network_Core_Config $network_config */
3549
+		$network_config = EE_Registry::instance()->NET_CFG->core;
3550
+
3551
+		return new EE_Form_Section_Proper(
3552
+			array(
3553
+				'name'            => 'global_messages_settings',
3554
+				'html_id'         => 'global_messages_settings',
3555
+				'html_class'      => 'form-table',
3556
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3557
+				'subsections'     => apply_filters(
3558
+					'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3559
+					array(
3560
+						'do_messages_on_same_request' => new EE_Select_Input(
3561
+							array(
3562
+								true  => esc_html__("On the same request", "event_espresso"),
3563
+								false => esc_html__("On a separate request", "event_espresso"),
3564
+							),
3565
+							array(
3566
+								'default'         => $network_config->do_messages_on_same_request,
3567
+								'html_label_text' => esc_html__(
3568
+									'Generate and send all messages:',
3569
+									'event_espresso'
3570
+								),
3571
+								'html_help_text'  => esc_html__(
3572
+									'By default the messages system uses a more efficient means of processing messages on separate requests and utilizes the wp-cron scheduling system.  This makes things execute faster for people registering for your events.  However, if the wp-cron system is disabled on your site and there is no alternative in place, then you can change this so messages are always executed on the same request.',
3573
+									'event_espresso'
3574
+								),
3575
+							)
3576
+						),
3577
+						'delete_threshold'            => new EE_Select_Input(
3578
+							array(
3579
+								0  => esc_html__('Forever', 'event_espresso'),
3580
+								3  => esc_html__('3 Months', 'event_espresso'),
3581
+								6  => esc_html__('6 Months', 'event_espresso'),
3582
+								9  => esc_html__('9 Months', 'event_espresso'),
3583
+								12 => esc_html__('12 Months', 'event_espresso'),
3584
+								24 => esc_html__('24 Months', 'event_espresso'),
3585
+								36 => esc_html__('36 Months', 'event_espresso'),
3586
+							),
3587
+							array(
3588
+								'default'         => EE_Registry::instance()->CFG->messages->delete_threshold,
3589
+								'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3590
+								'html_help_text'  => esc_html__(
3591
+									'You can control how long a record of processed messages is kept via this option.',
3592
+									'event_espresso'
3593
+								),
3594
+							)
3595
+						),
3596
+						'update_settings'             => new EE_Submit_Input(
3597
+							array(
3598
+								'default'         => esc_html__('Update', 'event_espresso'),
3599
+								'html_label_text' => '&nbsp',
3600
+							)
3601
+						),
3602
+					)
3603
+				),
3604
+			)
3605
+		);
3606
+	}
3607
+
3608
+
3609
+	/**
3610
+	 * This handles updating the global settings set on the admin page.
3611
+	 *
3612
+	 * @throws EE_Error
3613
+	 * @throws InvalidDataTypeException
3614
+	 * @throws InvalidInterfaceException
3615
+	 * @throws InvalidArgumentException
3616
+	 * @throws ReflectionException
3617
+	 */
3618
+	protected function _update_global_settings()
3619
+	{
3620
+		/** @var EE_Network_Core_Config $network_config */
3621
+		$network_config = EE_Registry::instance()->NET_CFG->core;
3622
+		$messages_config = EE_Registry::instance()->CFG->messages;
3623
+		$form = $this->_generate_global_settings_form();
3624
+		if ($form->was_submitted()) {
3625
+			$form->receive_form_submission();
3626
+			if ($form->is_valid()) {
3627
+				$valid_data = $form->valid_data();
3628
+				foreach ($valid_data as $property => $value) {
3629
+					$setter = 'set_' . $property;
3630
+					if (method_exists($network_config, $setter)) {
3631
+						$network_config->{$setter}($value);
3632
+					} elseif (property_exists($network_config, $property)
3633
+						&& $network_config->{$property} !== $value
3634
+					) {
3635
+						$network_config->{$property} = $value;
3636
+					} elseif (property_exists($messages_config, $property)
3637
+						&& $messages_config->{$property} !== $value
3638
+					) {
3639
+						$messages_config->{$property} = $value;
3640
+					}
3641
+				}
3642
+				// only update if the form submission was valid!
3643
+				EE_Registry::instance()->NET_CFG->update_config(true, false);
3644
+				EE_Registry::instance()->CFG->update_espresso_config();
3645
+				EE_Error::overwrite_success();
3646
+				EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3647
+			}
3648
+		}
3649
+		$this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3650
+	}
3651
+
3652
+
3653
+	/**
3654
+	 * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3655
+	 *
3656
+	 * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3657
+	 * @return string html formatted tabs
3658
+	 * @throws DomainException
3659
+	 */
3660
+	protected function _get_mt_tabs($tab_array)
3661
+	{
3662
+		$tab_array = (array) $tab_array;
3663
+		$template = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3664
+		$tabs = '';
3665
+
3666
+		foreach ($tab_array as $tab) {
3667
+			$tabs .= EEH_Template::display_template($template, $tab, true);
3668
+		}
3669
+
3670
+		return $tabs;
3671
+	}
3672
+
3673
+
3674
+	/**
3675
+	 * This prepares the content of the messenger meta box admin settings
3676
+	 *
3677
+	 * @param  EE_messenger $messenger The messenger we're setting up content for
3678
+	 * @return string html formatted content
3679
+	 * @throws DomainException
3680
+	 */
3681
+	protected function _get_messenger_box_content(EE_messenger $messenger)
3682
+	{
3683
+
3684
+		$fields = $messenger->get_admin_settings_fields();
3685
+		$settings_template_args['template_form_fields'] = '';
3686
+
3687
+		// is $messenger active?
3688
+		$settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3689
+
3690
+
3691
+		if (! empty($fields)) {
3692
+			$existing_settings = $messenger->get_existing_admin_settings();
3693
+
3694
+			foreach ($fields as $fldname => $fldprops) {
3695
+				$field_id = $messenger->name . '-' . $fldname;
3696
+				$template_form_field[ $field_id ] = array(
3697
+					'name'       => 'messenger_settings[' . $field_id . ']',
3698
+					'label'      => $fldprops['label'],
3699
+					'input'      => $fldprops['field_type'],
3700
+					'type'       => $fldprops['value_type'],
3701
+					'required'   => $fldprops['required'],
3702
+					'validation' => $fldprops['validation'],
3703
+					'value'      => isset($existing_settings[ $field_id ])
3704
+						? $existing_settings[ $field_id ]
3705
+						: $fldprops['default'],
3706
+					'css_class'  => '',
3707
+					'format'     => $fldprops['format'],
3708
+				);
3709
+			}
3710
+
3711
+
3712
+			$settings_template_args['template_form_fields'] = ! empty($template_form_field)
3713
+				? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3714
+				: '';
3715
+		}
3716
+
3717
+		// we also need some hidden fields
3718
+		$settings_template_args['hidden_fields'] = array(
3719
+			'messenger_settings[messenger]' => array(
3720
+				'type'  => 'hidden',
3721
+				'value' => $messenger->name,
3722
+			),
3723
+			'type'                          => array(
3724
+				'type'  => 'hidden',
3725
+				'value' => 'messenger',
3726
+			),
3727
+		);
3728
+
3729
+		// make sure any active message types that are existing are included in the hidden fields
3730
+		if (isset($this->_m_mt_settings['message_type_tabs'][ $messenger->name ]['active'])) {
3731
+			foreach ($this->_m_mt_settings['message_type_tabs'][ $messenger->name ]['active'] as $mt => $values) {
3732
+				$settings_template_args['hidden_fields'][ 'messenger_settings[message_types][' . $mt . ']' ] = array(
3733
+					'type'  => 'hidden',
3734
+					'value' => $mt,
3735
+				);
3736
+			}
3737
+		}
3738
+		$settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3739
+			$settings_template_args['hidden_fields'],
3740
+			'array'
3741
+		);
3742
+		$active = $this->_message_resource_manager->is_messenger_active($messenger->name);
3743
+
3744
+		$settings_template_args['messenger'] = $messenger->name;
3745
+		$settings_template_args['description'] = $messenger->description;
3746
+		$settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3747
+
3748
+
3749
+		$settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active(
3750
+			$messenger->name
3751
+		)
3752
+			? $settings_template_args['show_hide_edit_form']
3753
+			: ' hidden';
3754
+
3755
+		$settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3756
+			? ' hidden'
3757
+			: $settings_template_args['show_hide_edit_form'];
3758
+
3759
+
3760
+		$settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3761
+		$settings_template_args['nonce'] = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3762
+		$settings_template_args['on_off_status'] = $active ? true : false;
3763
+		$template = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3764
+		$content = EEH_Template::display_template(
3765
+			$template,
3766
+			$settings_template_args,
3767
+			true
3768
+		);
3769
+
3770
+		return $content;
3771
+	}
3772
+
3773
+
3774
+	/**
3775
+	 * used by ajax on the messages settings page to activate|deactivate the messenger
3776
+	 *
3777
+	 * @throws DomainException
3778
+	 * @throws EE_Error
3779
+	 * @throws InvalidDataTypeException
3780
+	 * @throws InvalidInterfaceException
3781
+	 * @throws InvalidArgumentException
3782
+	 * @throws ReflectionException
3783
+	 */
3784
+	public function activate_messenger_toggle()
3785
+	{
3786
+		$success = true;
3787
+		$this->_prep_default_response_for_messenger_or_message_type_toggle();
3788
+		// let's check that we have required data
3789
+		if (! isset($this->_req_data['messenger'])) {
3790
+			EE_Error::add_error(
3791
+				esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3792
+				__FILE__,
3793
+				__FUNCTION__,
3794
+				__LINE__
3795
+			);
3796
+			$success = false;
3797
+		}
3798
+
3799
+		// do a nonce check here since we're not arriving via a normal route
3800
+		$nonce = isset($this->_req_data['activate_nonce'])
3801
+			? sanitize_text_field($this->_req_data['activate_nonce'])
3802
+			: '';
3803
+		$nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3804
+
3805
+		$this->_verify_nonce($nonce, $nonce_ref);
3806
+
3807
+
3808
+		if (! isset($this->_req_data['status'])) {
3809
+			EE_Error::add_error(
3810
+				esc_html__(
3811
+					'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3812
+					'event_espresso'
3813
+				),
3814
+				__FILE__,
3815
+				__FUNCTION__,
3816
+				__LINE__
3817
+			);
3818
+			$success = false;
3819
+		}
3820
+
3821
+		// do check to verify we have a valid status.
3822
+		$status = $this->_req_data['status'];
3823
+
3824
+		if ($status !== 'off' && $status !== 'on') {
3825
+			EE_Error::add_error(
3826
+				sprintf(
3827
+					esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3828
+					$this->_req_data['status']
3829
+				),
3830
+				__FILE__,
3831
+				__FUNCTION__,
3832
+				__LINE__
3833
+			);
3834
+			$success = false;
3835
+		}
3836
+
3837
+		if ($success) {
3838
+			// made it here?  Stop dawdling then!!
3839
+			$success = $status === 'off'
3840
+				? $this->_deactivate_messenger($this->_req_data['messenger'])
3841
+				: $this->_activate_messenger($this->_req_data['messenger']);
3842
+		}
3843
+
3844
+		$this->_template_args['success'] = $success;
3845
+
3846
+		// no special instructions so let's just do the json return (which should automatically do all the special stuff).
3847
+		$this->_return_json();
3848
+	}
3849
+
3850
+
3851
+	/**
3852
+	 * used by ajax from the messages settings page to activate|deactivate a message type
3853
+	 *
3854
+	 * @throws DomainException
3855
+	 * @throws EE_Error
3856
+	 * @throws ReflectionException
3857
+	 * @throws InvalidDataTypeException
3858
+	 * @throws InvalidInterfaceException
3859
+	 * @throws InvalidArgumentException
3860
+	 */
3861
+	public function activate_mt_toggle()
3862
+	{
3863
+		$success = true;
3864
+		$this->_prep_default_response_for_messenger_or_message_type_toggle();
3865
+
3866
+		// let's make sure we have the necessary data
3867
+		if (! isset($this->_req_data['message_type'])) {
3868
+			EE_Error::add_error(
3869
+				esc_html__('Message Type name needed to toggle activation. None given', 'event_espresso'),
3870
+				__FILE__,
3871
+				__FUNCTION__,
3872
+				__LINE__
3873
+			);
3874
+			$success = false;
3875
+		}
3876
+
3877
+		if (! isset($this->_req_data['messenger'])) {
3878
+			EE_Error::add_error(
3879
+				esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3880
+				__FILE__,
3881
+				__FUNCTION__,
3882
+				__LINE__
3883
+			);
3884
+			$success = false;
3885
+		}
3886
+
3887
+		if (! isset($this->_req_data['status'])) {
3888
+			EE_Error::add_error(
3889
+				esc_html__(
3890
+					'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3891
+					'event_espresso'
3892
+				),
3893
+				__FILE__,
3894
+				__FUNCTION__,
3895
+				__LINE__
3896
+			);
3897
+			$success = false;
3898
+		}
3899
+
3900
+
3901
+		// do check to verify we have a valid status.
3902
+		$status = $this->_req_data['status'];
3903
+
3904
+		if ($status !== 'activate' && $status !== 'deactivate') {
3905
+			EE_Error::add_error(
3906
+				sprintf(
3907
+					esc_html__('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3908
+					$this->_req_data['status']
3909
+				),
3910
+				__FILE__,
3911
+				__FUNCTION__,
3912
+				__LINE__
3913
+			);
3914
+			$success = false;
3915
+		}
3916
+
3917
+
3918
+		// do a nonce check here since we're not arriving via a normal route
3919
+		$nonce = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3920
+		$nonce_ref = $this->_req_data['message_type'] . '_nonce';
3921
+
3922
+		$this->_verify_nonce($nonce, $nonce_ref);
3923
+
3924
+		if ($success) {
3925
+			// made it here? um, what are you waiting for then?
3926
+			$success = $status === 'deactivate'
3927
+				? $this->_deactivate_message_type_for_messenger(
3928
+					$this->_req_data['messenger'],
3929
+					$this->_req_data['message_type']
3930
+				)
3931
+				: $this->_activate_message_type_for_messenger(
3932
+					$this->_req_data['messenger'],
3933
+					$this->_req_data['message_type']
3934
+				);
3935
+		}
3936
+
3937
+		$this->_template_args['success'] = $success;
3938
+		$this->_return_json();
3939
+	}
3940
+
3941
+
3942
+	/**
3943
+	 * Takes care of processing activating a messenger and preparing the appropriate response.
3944
+	 *
3945
+	 * @param string $messenger_name The name of the messenger being activated
3946
+	 * @return bool
3947
+	 * @throws DomainException
3948
+	 * @throws EE_Error
3949
+	 * @throws InvalidArgumentException
3950
+	 * @throws ReflectionException
3951
+	 * @throws InvalidDataTypeException
3952
+	 * @throws InvalidInterfaceException
3953
+	 */
3954
+	protected function _activate_messenger($messenger_name)
3955
+	{
3956
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3957
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3958
+		$message_types_to_activate = $active_messenger instanceof EE_Messenger
3959
+			? $active_messenger->get_default_message_types()
3960
+			: array();
3961
+
3962
+		// ensure is active
3963
+		$this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
3964
+
3965
+		// set response_data for reload
3966
+		foreach ($message_types_to_activate as $message_type_name) {
3967
+			/** @var EE_message_type $message_type */
3968
+			$message_type = $this->_message_resource_manager->get_message_type($message_type_name);
3969
+			if ($this->_message_resource_manager->is_message_type_active_for_messenger(
3970
+				$messenger_name,
3971
+				$message_type_name
3972
+			)
3973
+				&& $message_type instanceof EE_message_type
3974
+			) {
3975
+				$this->_template_args['data']['active_mts'][] = $message_type_name;
3976
+				if ($message_type->get_admin_settings_fields()) {
3977
+					$this->_template_args['data']['mt_reload'][] = $message_type_name;
3978
+				}
3979
+			}
3980
+		}
3981
+
3982
+		// add success message for activating messenger
3983
+		return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
3984
+	}
3985
+
3986
+
3987
+	/**
3988
+	 * Takes care of processing deactivating a messenger and preparing the appropriate response.
3989
+	 *
3990
+	 * @param string $messenger_name The name of the messenger being activated
3991
+	 * @return bool
3992
+	 * @throws DomainException
3993
+	 * @throws EE_Error
3994
+	 * @throws InvalidArgumentException
3995
+	 * @throws ReflectionException
3996
+	 * @throws InvalidDataTypeException
3997
+	 * @throws InvalidInterfaceException
3998
+	 */
3999
+	protected function _deactivate_messenger($messenger_name)
4000
+	{
4001
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4002
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4003
+		$this->_message_resource_manager->deactivate_messenger($messenger_name);
4004
+
4005
+		return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
4006
+	}
4007
+
4008
+
4009
+	/**
4010
+	 * Takes care of processing activating a message type for a messenger and preparing the appropriate response.
4011
+	 *
4012
+	 * @param string $messenger_name    The name of the messenger the message type is being activated for.
4013
+	 * @param string $message_type_name The name of the message type being activated for the messenger
4014
+	 * @return bool
4015
+	 * @throws DomainException
4016
+	 * @throws EE_Error
4017
+	 * @throws InvalidArgumentException
4018
+	 * @throws ReflectionException
4019
+	 * @throws InvalidDataTypeException
4020
+	 * @throws InvalidInterfaceException
4021
+	 */
4022
+	protected function _activate_message_type_for_messenger($messenger_name, $message_type_name)
4023
+	{
4024
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4025
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4026
+		/** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4027
+		$message_type_to_activate = $this->_message_resource_manager->get_message_type($message_type_name);
4028
+
4029
+		// ensure is active
4030
+		$this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
4031
+
4032
+		// set response for load
4033
+		if ($this->_message_resource_manager->is_message_type_active_for_messenger(
4034
+			$messenger_name,
4035
+			$message_type_name
4036
+		)
4037
+		) {
4038
+			$this->_template_args['data']['active_mts'][] = $message_type_name;
4039
+			if ($message_type_to_activate->get_admin_settings_fields()) {
4040
+				$this->_template_args['data']['mt_reload'][] = $message_type_name;
4041
+			}
4042
+		}
4043
+
4044
+		return $this->_setup_response_message_for_activating_messenger_with_message_types(
4045
+			$active_messenger,
4046
+			$message_type_to_activate
4047
+		);
4048
+	}
4049
+
4050
+
4051
+	/**
4052
+	 * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
4053
+	 *
4054
+	 * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
4055
+	 * @param string $message_type_name The name of the message type being deactivated for the messenger
4056
+	 * @return bool
4057
+	 * @throws DomainException
4058
+	 * @throws EE_Error
4059
+	 * @throws InvalidArgumentException
4060
+	 * @throws ReflectionException
4061
+	 * @throws InvalidDataTypeException
4062
+	 * @throws InvalidInterfaceException
4063
+	 */
4064
+	protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
4065
+	{
4066
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4067
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4068
+		/** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4069
+		$message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
4070
+		$this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
4071
+
4072
+		return $this->_setup_response_message_for_deactivating_messenger_with_message_types(
4073
+			$active_messenger,
4074
+			$message_type_to_deactivate
4075
+		);
4076
+	}
4077
+
4078
+
4079
+	/**
4080
+	 * This just initializes the defaults for activating messenger and message type responses.
4081
+	 */
4082
+	protected function _prep_default_response_for_messenger_or_message_type_toggle()
4083
+	{
4084
+		$this->_template_args['data']['active_mts'] = array();
4085
+		$this->_template_args['data']['mt_reload'] = array();
4086
+	}
4087
+
4088
+
4089
+	/**
4090
+	 * Setup appropriate response for activating a messenger and/or message types
4091
+	 *
4092
+	 * @param EE_messenger         $messenger
4093
+	 * @param EE_message_type|null $message_type
4094
+	 * @return bool
4095
+	 * @throws DomainException
4096
+	 * @throws EE_Error
4097
+	 * @throws InvalidArgumentException
4098
+	 * @throws ReflectionException
4099
+	 * @throws InvalidDataTypeException
4100
+	 * @throws InvalidInterfaceException
4101
+	 */
4102
+	protected function _setup_response_message_for_activating_messenger_with_message_types(
4103
+		$messenger,
4104
+		EE_Message_Type $message_type = null
4105
+	) {
4106
+		// if $messenger isn't a valid messenger object then get out.
4107
+		if (! $messenger instanceof EE_Messenger) {
4108
+			EE_Error::add_error(
4109
+				esc_html__('The messenger being activated is not a valid messenger', 'event_espresso'),
4110
+				__FILE__,
4111
+				__FUNCTION__,
4112
+				__LINE__
4113
+			);
4114
+
4115
+			return false;
4116
+		}
4117
+		// activated
4118
+		if ($this->_template_args['data']['active_mts']) {
4119
+			EE_Error::overwrite_success();
4120
+			// activated a message type with the messenger
4121
+			if ($message_type instanceof EE_message_type) {
4122
+				EE_Error::add_success(
4123
+					sprintf(
4124
+						esc_html__(
4125
+							'%s message type has been successfully activated with the %s messenger',
4126
+							'event_espresso'
4127
+						),
4128
+						ucwords($message_type->label['singular']),
4129
+						ucwords($messenger->label['singular'])
4130
+					)
4131
+				);
4132
+
4133
+				// if message type was invoice then let's make sure we activate the invoice payment method.
4134
+				if ($message_type->name === 'invoice') {
4135
+					EE_Registry::instance()->load_lib('Payment_Method_Manager');
4136
+					$pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
4137
+					if ($pm instanceof EE_Payment_Method) {
4138
+						EE_Error::add_attention(
4139
+							esc_html__(
4140
+								'Activating the invoice message type also automatically activates the invoice payment method.  If you do not wish the invoice payment method to be active, or to change its settings, visit the payment method admin page.',
4141
+								'event_espresso'
4142
+							)
4143
+						);
4144
+					}
4145
+				}
4146
+				// just toggles the entire messenger
4147
+			} else {
4148
+				EE_Error::add_success(
4149
+					sprintf(
4150
+						esc_html__('%s messenger has been successfully activated', 'event_espresso'),
4151
+						ucwords($messenger->label['singular'])
4152
+					)
4153
+				);
4154
+			}
4155
+
4156
+			return true;
4157
+
4158
+			// possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
4159
+			// message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
4160
+			// in which case we just give a success message for the messenger being successfully activated.
4161
+		} else {
4162
+			if (! $messenger->get_default_message_types()) {
4163
+				// messenger doesn't have any default message types so still a success.
4164
+				EE_Error::add_success(
4165
+					sprintf(
4166
+						esc_html__('%s messenger was successfully activated.', 'event_espresso'),
4167
+						ucwords($messenger->label['singular'])
4168
+					)
4169
+				);
4170
+
4171
+				return true;
4172
+			} else {
4173
+				EE_Error::add_error(
4174
+					$message_type instanceof EE_message_type
4175
+						? sprintf(
4176
+							esc_html__(
4177
+								'%s message type was not successfully activated with the %s messenger',
4178
+								'event_espresso'
4179
+							),
4180
+							ucwords($message_type->label['singular']),
4181
+							ucwords($messenger->label['singular'])
4182
+						)
4183
+						: sprintf(
4184
+							esc_html__('%s messenger was not successfully activated', 'event_espresso'),
4185
+							ucwords($messenger->label['singular'])
4186
+						),
4187
+					__FILE__,
4188
+					__FUNCTION__,
4189
+					__LINE__
4190
+				);
4191
+
4192
+				return false;
4193
+			}
4194
+		}
4195
+	}
4196
+
4197
+
4198
+	/**
4199
+	 * This sets up the appropriate response for deactivating a messenger and/or message type.
4200
+	 *
4201
+	 * @param EE_messenger         $messenger
4202
+	 * @param EE_message_type|null $message_type
4203
+	 * @return bool
4204
+	 * @throws DomainException
4205
+	 * @throws EE_Error
4206
+	 * @throws InvalidArgumentException
4207
+	 * @throws ReflectionException
4208
+	 * @throws InvalidDataTypeException
4209
+	 * @throws InvalidInterfaceException
4210
+	 */
4211
+	protected function _setup_response_message_for_deactivating_messenger_with_message_types(
4212
+		$messenger,
4213
+		EE_message_type $message_type = null
4214
+	) {
4215
+		EE_Error::overwrite_success();
4216
+
4217
+		// if $messenger isn't a valid messenger object then get out.
4218
+		if (! $messenger instanceof EE_Messenger) {
4219
+			EE_Error::add_error(
4220
+				esc_html__('The messenger being deactivated is not a valid messenger', 'event_espresso'),
4221
+				__FILE__,
4222
+				__FUNCTION__,
4223
+				__LINE__
4224
+			);
4225
+
4226
+			return false;
4227
+		}
4228
+
4229
+		if ($message_type instanceof EE_message_type) {
4230
+			$message_type_name = $message_type->name;
4231
+			EE_Error::add_success(
4232
+				sprintf(
4233
+					esc_html__(
4234
+						'%s message type has been successfully deactivated for the %s messenger.',
4235
+						'event_espresso'
4236
+					),
4237
+					ucwords($message_type->label['singular']),
4238
+					ucwords($messenger->label['singular'])
4239
+				)
4240
+			);
4241
+		} else {
4242
+			$message_type_name = '';
4243
+			EE_Error::add_success(
4244
+				sprintf(
4245
+					esc_html__('%s messenger has been successfully deactivated.', 'event_espresso'),
4246
+					ucwords($messenger->label['singular'])
4247
+				)
4248
+			);
4249
+		}
4250
+
4251
+		// if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
4252
+		if ($messenger->name === 'html' || $message_type_name === 'invoice') {
4253
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
4254
+			$count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
4255
+			if ($count_updated > 0) {
4256
+				$msg = $message_type_name === 'invoice'
4257
+					? esc_html__(
4258
+						'Deactivating the invoice message type also automatically deactivates the invoice payment method. In order for invoices to be generated the invoice message type must be active. If you completed this action by mistake, simply reactivate the invoice message type and then visit the payment methods admin page to reactivate the invoice payment method.',
4259
+						'event_espresso'
4260
+					)
4261
+					: esc_html__(
4262
+						'Deactivating the html messenger also automatically deactivates the invoice payment method.  In order for invoices to be generated the html messenger must be be active.  If you completed this action by mistake, simply reactivate the html messenger, then visit the payment methods admin page to reactivate the invoice payment method.',
4263
+						'event_espresso'
4264
+					);
4265
+				EE_Error::add_attention($msg);
4266
+			}
4267
+		}
4268
+
4269
+		return true;
4270
+	}
4271
+
4272
+
4273
+	/**
4274
+	 * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
4275
+	 *
4276
+	 * @throws DomainException
4277
+	 */
4278
+	public function update_mt_form()
4279
+	{
4280
+		if (! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
4281
+			EE_Error::add_error(
4282
+				esc_html__('Require message type or messenger to send an updated form', 'event_espresso'),
4283
+				__FILE__,
4284
+				__FUNCTION__,
4285
+				__LINE__
4286
+			);
4287
+			$this->_return_json();
4288
+		}
4289
+
4290
+		$message_types = $this->get_installed_message_types();
4291
+
4292
+		$message_type = $message_types[ $this->_req_data['message_type'] ];
4293
+		$messenger = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
4294
+
4295
+		$content = $this->_message_type_settings_content(
4296
+			$message_type,
4297
+			$messenger,
4298
+			true
4299
+		);
4300
+		$this->_template_args['success'] = true;
4301
+		$this->_template_args['content'] = $content;
4302
+		$this->_return_json();
4303
+	}
4304
+
4305
+
4306
+	/**
4307
+	 * this handles saving the settings for a messenger or message type
4308
+	 *
4309
+	 */
4310
+	public function save_settings()
4311
+	{
4312
+		if (! isset($this->_req_data['type'])) {
4313
+			EE_Error::add_error(
4314
+				esc_html__(
4315
+					'Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
4316
+					'event_espresso'
4317
+				),
4318
+				__FILE__,
4319
+				__FUNCTION__,
4320
+				__LINE__
4321
+			);
4322
+			$this->_template_args['error'] = true;
4323
+			$this->_return_json();
4324
+		}
4325
+
4326
+
4327
+		if ($this->_req_data['type'] === 'messenger') {
4328
+			// this should be an array.
4329
+			$settings = $this->_req_data['messenger_settings'];
4330
+			$messenger = $settings['messenger'];
4331
+			// let's setup the settings data
4332
+			foreach ($settings as $key => $value) {
4333
+				switch ($key) {
4334
+					case 'messenger':
4335
+						unset($settings['messenger']);
4336
+						break;
4337
+					case 'message_types':
4338
+						unset($settings['message_types']);
4339
+						break;
4340
+					default:
4341
+						$settings[ $key ] = $value;
4342
+						break;
4343
+				}
4344
+			}
4345
+			$this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
4346
+		} elseif ($this->_req_data['type'] === 'message_type') {
4347
+			$settings = $this->_req_data['message_type_settings'];
4348
+			$messenger = $settings['messenger'];
4349
+			$message_type = $settings['message_type'];
4350
+
4351
+			foreach ($settings as $key => $value) {
4352
+				switch ($key) {
4353
+					case 'messenger':
4354
+						unset($settings['messenger']);
4355
+						break;
4356
+					case 'message_type':
4357
+						unset($settings['message_type']);
4358
+						break;
4359
+					default:
4360
+						$settings[ $key ] = $value;
4361
+						break;
4362
+				}
4363
+			}
4364
+
4365
+			$this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
4366
+		}
4367
+
4368
+		// okay we should have the data all setup.  Now we just update!
4369
+		$success = $this->_message_resource_manager->update_active_messengers_option();
4370
+
4371
+		if ($success) {
4372
+			EE_Error::add_success(__('Settings updated', 'event_espresso'));
4373
+		} else {
4374
+			EE_Error::add_error(
4375
+				esc_html__(
4376
+					'Settings did not get updated',
4377
+					'event_espresso'
4378
+				),
4379
+				__FILE__,
4380
+				__FUNCTION__,
4381
+				__LINE__
4382
+			);
4383
+		}
4384
+
4385
+		$this->_template_args['success'] = $success;
4386
+		$this->_return_json();
4387
+	}
4388
+
4389
+
4390
+
4391
+
4392
+	/**  EE MESSAGE PROCESSING ACTIONS **/
4393
+
4394
+
4395
+	/**
4396
+	 * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
4397
+	 * However, this does not send immediately, it just queues for sending.
4398
+	 *
4399
+	 * @since 4.9.0
4400
+	 * @throws EE_Error
4401
+	 * @throws InvalidDataTypeException
4402
+	 * @throws InvalidInterfaceException
4403
+	 * @throws InvalidArgumentException
4404
+	 * @throws ReflectionException
4405
+	 */
4406
+	protected function _generate_now()
4407
+	{
4408
+		EED_Messages::generate_now($this->_get_msg_ids_from_request());
4409
+		$this->_redirect_after_action(false, '', '', array(), true);
4410
+	}
4411
+
4412
+
4413
+	/**
4414
+	 * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
4415
+	 * are EEM_Message::status_resend or EEM_Message::status_idle
4416
+	 *
4417
+	 * @since 4.9.0
4418
+	 * @throws EE_Error
4419
+	 * @throws InvalidDataTypeException
4420
+	 * @throws InvalidInterfaceException
4421
+	 * @throws InvalidArgumentException
4422
+	 * @throws ReflectionException
4423
+	 */
4424
+	protected function _generate_and_send_now()
4425
+	{
4426
+		EED_Messages::generate_and_send_now($this->_get_msg_ids_from_request());
4427
+		$this->_redirect_after_action(false, '', '', array(), true);
4428
+	}
4429
+
4430
+
4431
+	/**
4432
+	 * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
4433
+	 *
4434
+	 * @since 4.9.0
4435
+	 * @throws EE_Error
4436
+	 * @throws InvalidDataTypeException
4437
+	 * @throws InvalidInterfaceException
4438
+	 * @throws InvalidArgumentException
4439
+	 * @throws ReflectionException
4440
+	 */
4441
+	protected function _queue_for_resending()
4442
+	{
4443
+		EED_Messages::queue_for_resending($this->_get_msg_ids_from_request());
4444
+		$this->_redirect_after_action(false, '', '', array(), true);
4445
+	}
4446
+
4447
+
4448
+	/**
4449
+	 *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
4450
+	 *
4451
+	 * @since 4.9.0
4452
+	 * @throws EE_Error
4453
+	 * @throws InvalidDataTypeException
4454
+	 * @throws InvalidInterfaceException
4455
+	 * @throws InvalidArgumentException
4456
+	 * @throws ReflectionException
4457
+	 */
4458
+	protected function _send_now()
4459
+	{
4460
+		EED_Messages::send_now($this->_get_msg_ids_from_request());
4461
+		$this->_redirect_after_action(false, '', '', array(), true);
4462
+	}
4463
+
4464
+
4465
+	/**
4466
+	 * Deletes EE_messages for IDs in the request.
4467
+	 *
4468
+	 * @since 4.9.0
4469
+	 * @throws EE_Error
4470
+	 * @throws InvalidDataTypeException
4471
+	 * @throws InvalidInterfaceException
4472
+	 * @throws InvalidArgumentException
4473
+	 */
4474
+	protected function _delete_ee_messages()
4475
+	{
4476
+		$msg_ids = $this->_get_msg_ids_from_request();
4477
+		$deleted_count = 0;
4478
+		foreach ($msg_ids as $msg_id) {
4479
+			if (EEM_Message::instance()->delete_by_ID($msg_id)) {
4480
+				$deleted_count++;
4481
+			}
4482
+		}
4483
+		if ($deleted_count) {
4484
+			EE_Error::add_success(
4485
+				esc_html(
4486
+					_n(
4487
+						'Message successfully deleted',
4488
+						'Messages successfully deleted',
4489
+						$deleted_count,
4490
+						'event_espresso'
4491
+					)
4492
+				)
4493
+			);
4494
+			$this->_redirect_after_action(
4495
+				false,
4496
+				'',
4497
+				'',
4498
+				array(),
4499
+				true
4500
+			);
4501
+		} else {
4502
+			EE_Error::add_error(
4503
+				_n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
4504
+				__FILE__,
4505
+				__FUNCTION__,
4506
+				__LINE__
4507
+			);
4508
+			$this->_redirect_after_action(false, '', '', array(), true);
4509
+		}
4510
+	}
4511
+
4512
+
4513
+	/**
4514
+	 *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
4515
+	 *
4516
+	 * @since 4.9.0
4517
+	 * @return array
4518
+	 */
4519
+	protected function _get_msg_ids_from_request()
4520
+	{
4521
+		if (! isset($this->_req_data['MSG_ID'])) {
4522
+			return array();
4523
+		}
4524
+
4525
+		return is_array($this->_req_data['MSG_ID'])
4526
+			? array_keys($this->_req_data['MSG_ID'])
4527
+			: array($this->_req_data['MSG_ID']);
4528
+	}
4529 4529
 }
Please login to merge, or discard this patch.
core/helpers/EEH_MSG_Template.helper.php 2 patches
Indentation   +1227 added lines, -1227 removed lines patch added patch discarded remove patch
@@ -14,1231 +14,1231 @@
 block discarded – undo
14 14
 {
15 15
 
16 16
 
17
-    /**
18
-     * Holds a collection of EE_Message_Template_Pack objects.
19
-     * @type EE_Messages_Template_Pack_Collection
20
-     */
21
-    protected static $_template_pack_collection;
22
-
23
-
24
-
25
-
26
-    private static function _set_autoloader()
27
-    {
28
-        EED_Messages::set_autoloaders();
29
-    }
30
-
31
-
32
-    /**
33
-     * generate_new_templates
34
-     * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will automatically create the defaults for the event.  The user would then be redirected to edit the default context for the event.
35
-     *
36
-     * @access protected
37
-     * @param  string $messenger     the messenger we are generating templates for
38
-     * @param array   $message_types array of message types that the templates are generated for.
39
-     * @param int     $GRP_ID        If a non global template is being generated then it is expected we'll have a GRP_ID to use as the base for the new generated template.
40
-     * @param bool    $global        true indicates generating templates on messenger activation. false requires GRP_ID for event specific template generation.
41
-     * @throws \EE_Error
42
-     * @return array  @see EEH_MSG_Template::_create_new_templates for the return value of each element in the array for templates
43
-     *                that are generated.  If this is an empty array then it means no templates were generated which usually
44
-     *                means there was an error.  Anything in the array with an empty value for `MTP_context` means that it
45
-     *                was not a new generated template but just reactivated (which only happens for global templates that
46
-     *                already exist in the database.
47
-     */
48
-    public static function generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
49
-    {
50
-        // make sure message_type is an array.
51
-        $message_types = (array) $message_types;
52
-        $templates = array();
53
-
54
-        if (empty($messenger)) {
55
-            throw new EE_Error(__('We need a messenger to generate templates!', 'event_espresso'));
56
-        }
57
-
58
-        // if we STILL have empty $message_types then we need to generate an error message b/c we NEED message types to do the template files.
59
-        if (empty($message_types)) {
60
-            throw new EE_Error(__('We need at least one message type to generate templates!', 'event_espresso'));
61
-        }
62
-
63
-        EEH_MSG_Template::_set_autoloader();
64
-        foreach ($message_types as $message_type) {
65
-            // if global then let's attempt to get the GRP_ID for this combo IF GRP_ID is empty.
66
-            if ($global && empty($GRP_ID)) {
67
-                $GRP_ID = EEM_Message_Template_Group::instance()->get_one(
68
-                    array(
69
-                        array(
70
-                            'MTP_messenger'    => $messenger,
71
-                            'MTP_message_type' => $message_type,
72
-                            'MTP_is_global'    => true,
73
-                        ),
74
-                    )
75
-                );
76
-                $GRP_ID = $GRP_ID instanceof EE_Message_Template_Group ? $GRP_ID->ID() : 0;
77
-            }
78
-            // if this is global template generation.
79
-            // First let's determine if we already HAVE global templates for this messenger and message_type combination.
80
-            //  If we do then NO generation!!
81
-            if ($global && EEH_MSG_Template::already_generated($messenger, $message_type, $GRP_ID)) {
82
-                $templates[] = array(
83
-                    'GRP_ID' => $GRP_ID,
84
-                    'MTP_context' => '',
85
-                );
86
-                // we already have generated templates for this so let's go to the next message type.
87
-                continue;
88
-            }
89
-            $new_message_template_group = EEH_MSG_Template::create_new_templates($messenger, $message_type, $GRP_ID, $global);
90
-
91
-            if (! $new_message_template_group) {
92
-                continue;
93
-            }
94
-            $templates[] = $new_message_template_group;
95
-        }
96
-
97
-        return $templates;
98
-    }
99
-
100
-
101
-    /**
102
-     * The purpose of this method is to determine if there are already generated templates in the database for the given variables.
103
-     * @param  string $messenger     messenger
104
-     * @param  string $message_type message type
105
-     * @param  int $GRP_ID        GRP ID ( if a custom template) (if not provided then we're just doing global template check)
106
-     * @return bool                true = generated, false = hasn't been generated.
107
-     */
108
-    public static function already_generated($messenger, $message_type, $GRP_ID = 0)
109
-    {
110
-        EEH_MSG_Template::_set_autoloader();
111
-        // what method we use depends on whether we have an GRP_ID or not
112
-        $count = empty($GRP_ID)
113
-            ? EEM_Message_Template::instance()->count(
114
-                array(
115
-                    array(
116
-                        'Message_Template_Group.MTP_messenger'    => $messenger,
117
-                        'Message_Template_Group.MTP_message_type' => $message_type,
118
-                        'Message_Template_Group.MTP_is_global'    => true
119
-                    )
120
-                )
121
-            )
122
-            : EEM_Message_Template::instance()->count(array( array( 'GRP_ID' => $GRP_ID ) ));
123
-
124
-        return $count > 0;
125
-    }
126
-
127
-
128
-
129
-
130
-    /**
131
-     * Updates all message templates matching the incoming messengers and message types to active status.
132
-     *
133
-     * @static
134
-     * @param  array  $messenger_names     Messenger slug
135
-     * @param  array  $message_type_names  Message type slug
136
-     * @return  int                         count of updated records.
137
-     */
138
-    public static function update_to_active($messenger_names, $message_type_names)
139
-    {
140
-        $messenger_names = is_array($messenger_names) ? $messenger_names : array( $messenger_names );
141
-        $message_type_names = is_array($message_type_names) ? $message_type_names : array( $message_type_names );
142
-        return EEM_Message_Template_Group::instance()->update(
143
-            array( 'MTP_is_active' => 1 ),
144
-            array(
145
-                array(
146
-                    'MTP_messenger'     => array( 'IN', $messenger_names ),
147
-                    'MTP_message_type'  => array( 'IN', $message_type_names )
148
-                )
149
-            )
150
-        );
151
-    }
152
-
153
-
154
-
155
-    /**
156
-     * Updates all message template groups matching the incoming arguments to inactive status.
157
-     *
158
-     * @static
159
-     * @param array $messenger_names    The messenger slugs.
160
-     *                              If empty then all templates matching the message types are marked inactive.
161
-     *                              Otherwise only templates matching the messengers and message types.
162
-     * @param array $message_type_names     The message type slugs.
163
-     *                              If empty then all templates matching the messengers are marked inactive.
164
-     *                              Otherwise only templates matching the messengers and message types.
165
-     *
166
-     * @return int  count of updated records.
167
-     */
168
-    public static function update_to_inactive($messenger_names = array(), $message_type_names = array())
169
-    {
170
-        return EEM_Message_Template_Group::instance()->deactivate_message_template_groups_for(
171
-            $messenger_names,
172
-            $message_type_names
173
-        );
174
-    }
175
-
176
-
177
-    /**
178
-     * The purpose of this function is to return all installed message objects
179
-     * (messengers and message type regardless of whether they are ACTIVE or not)
180
-     *
181
-     * @deprecated 4.9.0
182
-     * @static
183
-     * @param string $type
184
-     * @return array array consisting of installed messenger objects and installed message type objects.
185
-     */
186
-    public static function get_installed_message_objects($type = 'all')
187
-    {
188
-        self::_set_autoloader();
189
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
190
-        return array(
191
-            'messenger' => $message_resource_manager->installed_messengers(),
192
-            'message_type' => $message_resource_manager->installed_message_types()
193
-        );
194
-    }
195
-
196
-
197
-    /**
198
-     * This will return an array of shortcodes => labels from the
199
-     * messenger and message_type objects associated with this
200
-     * template.
201
-     *
202
-     * @since 4.3.0
203
-     *
204
-     * @param string $message_type
205
-     * @param string $messenger
206
-     * @param array  $fields    What fields we're returning valid shortcodes for.
207
-     *                          If empty then we assume all fields are to be returned. Optional.
208
-     * @param string $context   What context we're going to return shortcodes for. Optional.
209
-     * @param bool $merged      If TRUE then we don't return shortcodes indexed by field,
210
-     *                          but instead an array of the unique shortcodes for all the given ( or all) fields.
211
-     *                          Optional.
212
-     * @throws \EE_Error
213
-     * @return mixed (array|bool) an array of shortcodes in the format
214
-     *                                              array( '[shortcode] => 'label')
215
-     *                                              OR
216
-     *                                              FALSE if no shortcodes found.
217
-     */
218
-    public static function get_shortcodes(
219
-        $message_type,
220
-        $messenger,
221
-        $fields = array(),
222
-        $context = 'admin',
223
-        $merged = false
224
-    ) {
225
-        $messenger_name = str_replace(' ', '_', ucwords(str_replace('_', ' ', $messenger)));
226
-        $mt_name = str_replace(' ', '_', ucwords(str_replace('_', ' ', $message_type)));
227
-        /** @var EE_Message_Resource_Manager $message_resource_manager */
228
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
229
-        // convert slug to object
230
-        $messenger = $message_resource_manager->get_messenger($messenger);
231
-
232
-        // if messenger isn't a EE_messenger resource then bail.
233
-        if (! $messenger instanceof EE_messenger) {
234
-            return array();
235
-        }
236
-
237
-        // validate class for getting our list of shortcodes
238
-        $classname = 'EE_Messages_' . $messenger_name . '_' . $mt_name . '_Validator';
239
-        if (! class_exists($classname)) {
240
-            $msg[] = __('The Validator class was unable to load', 'event_espresso');
241
-            $msg[] = sprintf(
242
-                __('The class name compiled was %s. Please check and make sure the spelling and case is correct for the class name and that there is an autoloader in place for this class', 'event_espresso'),
243
-                $classname
244
-            );
245
-            throw new EE_Error(implode('||', $msg));
246
-        }
247
-
248
-        /** @type EE_Messages_Validator $_VLD */
249
-        $_VLD = new $classname(array(), $context);
250
-        $valid_shortcodes = $_VLD->get_validators();
251
-
252
-        // let's make sure we're only getting the shortcode part of the validators
253
-        $shortcodes = array();
254
-        foreach ($valid_shortcodes as $field => $validators) {
255
-            $shortcodes[ $field ] = $validators['shortcodes'];
256
-        }
257
-        $valid_shortcodes = $shortcodes;
258
-
259
-        // if not all fields let's make sure we ONLY include the shortcodes for the specified fields.
260
-        if (! empty($fields)) {
261
-            $specified_shortcodes = array();
262
-            foreach ($fields as $field) {
263
-                if (isset($valid_shortcodes[ $field ])) {
264
-                    $specified_shortcodes[ $field ] = $valid_shortcodes[ $field ];
265
-                }
266
-            }
267
-            $valid_shortcodes = $specified_shortcodes;
268
-        }
269
-
270
-        // if not merged then let's replace the fields with the localized fields
271
-        if (! $merged) {
272
-            // let's get all the fields for the set messenger so that we can get the localized label and use that in the returned array.
273
-            $field_settings = $messenger->get_template_fields();
274
-            $localized = array();
275
-            foreach ($valid_shortcodes as $field => $shortcodes) {
276
-                // get localized field label
277
-                if (isset($field_settings[ $field ])) {
278
-                    // possible that this is used as a main field.
279
-                    if (empty($field_settings[ $field ])) {
280
-                        if (isset($field_settings['extra'][ $field ])) {
281
-                            $_field = $field_settings['extra'][ $field ]['main']['label'];
282
-                        } else {
283
-                            $_field = $field;
284
-                        }
285
-                    } else {
286
-                        $_field = $field_settings[ $field ]['label'];
287
-                    }
288
-                } elseif (isset($field_settings['extra'])) {
289
-                    // loop through extra "main fields" and see if any of their children have our field
290
-                    foreach ($field_settings['extra'] as $main_field => $fields) {
291
-                        if (isset($fields[ $field ])) {
292
-                            $_field = $fields[ $field ]['label'];
293
-                        } else {
294
-                            $_field = $field;
295
-                        }
296
-                    }
297
-                } else {
298
-                    $_field = $field;
299
-                }
300
-                if (isset($_field)) {
301
-                    $localized[ (string) $_field ] = $shortcodes;
302
-                }
303
-            }
304
-            $valid_shortcodes = $localized;
305
-        }
306
-
307
-        // if $merged then let's merge all the shortcodes into one list NOT indexed by field.
308
-        if ($merged) {
309
-            $merged_codes = array();
310
-            foreach ($valid_shortcodes as $field => $shortcode) {
311
-                foreach ($shortcode as $code => $label) {
312
-                    if (isset($merged_codes[ $code ])) {
313
-                        continue;
314
-                    } else {
315
-                        $merged_codes[ $code ] = $label;
316
-                    }
317
-                }
318
-            }
319
-            $valid_shortcodes = $merged_codes;
320
-        }
321
-
322
-        return $valid_shortcodes;
323
-    }
324
-
325
-
326
-    /**
327
-     * Get Messenger object.
328
-     *
329
-     * @since 4.3.0
330
-     * @deprecated 4.9.0
331
-     * @param string $messenger messenger slug for the messenger object we want to retrieve.
332
-     * @throws \EE_Error
333
-     * @return EE_messenger
334
-     */
335
-    public static function messenger_obj($messenger)
336
-    {
337
-        /** @type EE_Message_Resource_Manager $Message_Resource_Manager */
338
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
339
-        return $Message_Resource_Manager->get_messenger($messenger);
340
-    }
341
-
342
-
343
-    /**
344
-     * get Message type object
345
-     *
346
-     * @since 4.3.0
347
-     * @deprecated 4.9.0
348
-     * @param string $message_type the slug for the message type object to retrieve
349
-     * @throws \EE_Error
350
-     * @return EE_message_type
351
-     */
352
-    public static function message_type_obj($message_type)
353
-    {
354
-        /** @type EE_Message_Resource_Manager $Message_Resource_Manager */
355
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
356
-        return $Message_Resource_Manager->get_message_type($message_type);
357
-    }
358
-
359
-
360
-
361
-
362
-
363
-    /**
364
-     * Given a message_type slug, will return whether that message type is active in the system or not.
365
-     *
366
-     * @since    4.3.0
367
-     * @param  string   $message_type message type to check for.
368
-     * @return boolean
369
-     */
370
-    public static function is_mt_active($message_type)
371
-    {
372
-        /** @type EE_Message_Resource_Manager $Message_Resource_Manager */
373
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
374
-        $active_mts = $Message_Resource_Manager->list_of_active_message_types();
375
-        return in_array($message_type, $active_mts);
376
-    }
377
-
378
-
379
-
380
-    /**
381
-     * Given a messenger slug, will return whether that messenger is active in the system or not.
382
-     *
383
-     * @since    4.3.0
384
-     *
385
-     * @param  string  $messenger slug for messenger to check.
386
-     * @return boolean
387
-     */
388
-    public static function is_messenger_active($messenger)
389
-    {
390
-        /** @type EE_Message_Resource_Manager $Message_Resource_Manager */
391
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
392
-        $active_messenger = $Message_Resource_Manager->get_active_messenger($messenger);
393
-        return $active_messenger instanceof EE_messenger ? true : false;
394
-    }
395
-
396
-
397
-
398
-    /**
399
-     * Used to return active messengers array stored in the wp options table.
400
-     * If no value is present in the option then an empty array is returned.
401
-     *
402
-     * @deprecated 4.9
403
-     * @since 4.3.1
404
-     *
405
-     * @return array
406
-     */
407
-    public static function get_active_messengers_in_db()
408
-    {
409
-        EE_Error::doing_it_wrong(
410
-            __METHOD__,
411
-            __('Please use EE_Message_Resource_Manager::get_active_messengers_option() instead.', 'event_espresso'),
412
-            '4.9.0'
413
-        );
414
-        /** @var EE_Message_Resource_Manager $Message_Resource_Manager */
415
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
416
-        return $Message_Resource_Manager->get_active_messengers_option();
417
-    }
418
-
419
-
420
-
421
-
422
-    /**
423
-     * Used to update the active messengers array stored in the wp options table.
424
-     *
425
-     * @since 4.3.1
426
-     * @deprecated 4.9.0
427
-     *
428
-     * @param array $data_to_save Incoming data to save.
429
-     *
430
-     * @return bool FALSE if not updated, TRUE if updated.
431
-     */
432
-    public static function update_active_messengers_in_db($data_to_save)
433
-    {
434
-        EE_Error::doing_it_wrong(
435
-            __METHOD__,
436
-            __('Please use EE_Message_Resource_Manager::update_active_messengers_option() instead.', 'event_espresso'),
437
-            '4.9.0'
438
-        );
439
-        /** @var EE_Message_Resource_Manager $Message_Resource_Manager */
440
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
441
-        return $Message_Resource_Manager->update_active_messengers_option($data_to_save);
442
-    }
443
-
444
-
445
-    /**
446
-     * This does some validation of incoming params, determines what type of url is being prepped and returns the
447
-     * appropriate url trigger
448
-     *
449
-     * @param EE_message_type $message_type
450
-     * @param EE_Message $message
451
-     * @param EE_Registration | null $registration  The registration object must be included if this
452
-     *                                              is going to be a registration trigger url.
453
-     * @param string $sending_messenger             The (optional) sending messenger for the url.
454
-     *
455
-     * @return string
456
-     * @throws EE_Error
457
-     */
458
-    public static function get_url_trigger(
459
-        EE_message_type $message_type,
460
-        EE_Message $message,
461
-        $registration = null,
462
-        $sending_messenger = ''
463
-    ) {
464
-        // first determine if the url can be to the EE_Message object.
465
-        if (! $message_type->always_generate()) {
466
-            return EEH_MSG_Template::generate_browser_trigger($message);
467
-        }
468
-
469
-        // if $registration object is not valid then exit early because there's nothing that can be generated.
470
-        if (! $registration instanceof EE_Registration) {
471
-            throw new EE_Error(
472
-                __('Incoming value for registration is not a valid EE_Registration object.', 'event_espresso')
473
-            );
474
-        }
475
-
476
-        // validate given context
477
-        $contexts = $message_type->get_contexts();
478
-        if ($message->context() !== '' && ! isset($contexts[ $message->context() ])) {
479
-            throw new EE_Error(
480
-                sprintf(
481
-                    __('The context %s is not a valid context for %s.', 'event_espresso'),
482
-                    $message->context(),
483
-                    get_class($message_type)
484
-                )
485
-            );
486
-        }
487
-
488
-        // valid sending messenger but only if sending messenger set.  Otherwise generating messenger is used.
489
-        if (! empty($sending_messenger)) {
490
-            $with_messengers = $message_type->with_messengers();
491
-            if (! isset($with_messengers[ $message->messenger() ])
492
-                 || ! in_array($sending_messenger, $with_messengers[ $message->messenger() ]) ) {
493
-                throw new EE_Error(
494
-                    sprintf(
495
-                        __(
496
-                            'The given sending messenger string (%1$s) does not match a valid sending messenger with the %2$s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
497
-                            'event_espresso'
498
-                        ),
499
-                        $sending_messenger,
500
-                        get_class($message_type)
501
-                    )
502
-                );
503
-            }
504
-        } else {
505
-            $sending_messenger = $message->messenger();
506
-        }
507
-        return EEH_MSG_Template::generate_url_trigger(
508
-            $sending_messenger,
509
-            $message->messenger(),
510
-            $message->context(),
511
-            $message->message_type(),
512
-            $registration,
513
-            $message->GRP_ID()
514
-        );
515
-    }
516
-
517
-
518
-    /**
519
-     * This returns the url for triggering a in browser view of a specific EE_Message object.
520
-     * @param EE_Message $message
521
-     * @return string.
522
-     */
523
-    public static function generate_browser_trigger(EE_Message $message)
524
-    {
525
-        $query_args = array(
526
-            'ee' => 'msg_browser_trigger',
527
-            'token' => $message->MSG_token()
528
-        );
529
-        return apply_filters(
530
-            'FHEE__EEH_MSG_Template__generate_browser_trigger',
531
-            add_query_arg($query_args, site_url()),
532
-            $message
533
-        );
534
-    }
535
-
536
-
537
-
538
-
539
-
540
-
541
-    /**
542
-     * This returns the url for triggering an in browser view of the error saved on the incoming message object.
543
-     * @param EE_Message $message
544
-     * @return string
545
-     */
546
-    public static function generate_error_display_trigger(EE_Message $message)
547
-    {
548
-        return apply_filters(
549
-            'FHEE__EEH_MSG_Template__generate_error_display_trigger',
550
-            add_query_arg(
551
-                array(
552
-                    'ee' => 'msg_browser_error_trigger',
553
-                    'token' => $message->MSG_token()
554
-                ),
555
-                site_url()
556
-            ),
557
-            $message
558
-        );
559
-    }
560
-
561
-
562
-
563
-
564
-
565
-
566
-    /**
567
-     * This generates a url trigger for the msg_url_trigger route using the given arguments
568
-     *
569
-     * @param string          $sending_messenger    The sending messenger slug.
570
-     * @param string          $generating_messenger The generating messenger slug.
571
-     * @param string          $context              The context for the template.
572
-     * @param string          $message_type         The message type slug
573
-     * @param EE_Registration $registration
574
-     * @param integer          $message_template_group id   The EE_Message_Template_Group ID for the template.
575
-     * @param integer          $data_id     The id to the EE_Base_Class for getting the data used by the trigger.
576
-     * @return string          The generated url.
577
-     */
578
-    public static function generate_url_trigger(
579
-        $sending_messenger,
580
-        $generating_messenger,
581
-        $context,
582
-        $message_type,
583
-        EE_Registration $registration,
584
-        $message_template_group,
585
-        $data_id = 0
586
-    ) {
587
-        $query_args = array(
588
-            'ee' => 'msg_url_trigger',
589
-            'snd_msgr' => $sending_messenger,
590
-            'gen_msgr' => $generating_messenger,
591
-            'message_type' => $message_type,
592
-            'context' => $context,
593
-            'token' => $registration->reg_url_link(),
594
-            'GRP_ID' => $message_template_group,
595
-            'id' => $data_id
596
-            );
597
-        $url = add_query_arg($query_args, get_home_url());
598
-
599
-        // made it here so now we can just get the url and filter it.  Filtered globally and by message type.
600
-        $url = apply_filters(
601
-            'FHEE__EEH_MSG_Template__generate_url_trigger',
602
-            $url,
603
-            $sending_messenger,
604
-            $generating_messenger,
605
-            $context,
606
-            $message_type,
607
-            $registration,
608
-            $message_template_group,
609
-            $data_id
610
-        );
611
-        return $url;
612
-    }
613
-
614
-
615
-
616
-
617
-    /**
618
-     * Return the specific css for the action icon given.
619
-     *
620
-     * @since 4.9.0
621
-     *
622
-     * @param string $type  What action to return.
623
-     * @return string
624
-     */
625
-    public static function get_message_action_icon($type)
626
-    {
627
-        $action_icons = self::get_message_action_icons();
628
-        return isset($action_icons[ $type ]) ? $action_icons[ $type ] : '';
629
-    }
630
-
631
-
632
-    /**
633
-     * This is used for retrieving the css classes used for the icons representing message actions.
634
-     *
635
-     * @since 4.9.0
636
-     *
637
-     * @return array
638
-     */
639
-    public static function get_message_action_icons()
640
-    {
641
-        return apply_filters(
642
-            'FHEE__EEH_MSG_Template__message_action_icons',
643
-            array(
644
-                'view' => array(
645
-                    'label' => __('View Message', 'event_espresso'),
646
-                    'css_class' => 'dashicons dashicons-welcome-view-site',
647
-                ),
648
-                'error' => array(
649
-                    'label' => __('View Error Message', 'event_espresso'),
650
-                    'css_class' => 'dashicons dashicons-info',
651
-                ),
652
-                'see_notifications_for' => array(
653
-                    'label' => __('View Related Messages', 'event_espresso'),
654
-                    'css_class' => 'dashicons dashicons-megaphone',
655
-                ),
656
-                'generate_now' => array(
657
-                    'label' => __('Generate the message now.', 'event_espresso'),
658
-                    'css_class' => 'dashicons dashicons-admin-tools',
659
-                ),
660
-                'send_now' => array(
661
-                    'label' => __('Send Immediately', 'event_espresso'),
662
-                    'css_class' => 'dashicons dashicons-controls-forward',
663
-                ),
664
-                'queue_for_resending' => array(
665
-                    'label' => __('Queue for Resending', 'event_espresso'),
666
-                    'css_class' => 'dashicons dashicons-controls-repeat',
667
-                ),
668
-                'view_transaction' => array(
669
-                    'label' => __('View related Transaction', 'event_espresso'),
670
-                    'css_class' => 'dashicons dashicons-cart',
671
-                )
672
-            )
673
-        );
674
-    }
675
-
676
-
677
-    /**
678
-     * This returns the url for a given action related to EE_Message.
679
-     *
680
-     * @since 4.9.0
681
-     *
682
-     * @param string $type  What type of action to return the url for.
683
-     * @param EE_Message $message   Required for generating the correct url for some types.
684
-     * @param array  $query_params   Any additional query params to be included with the generated url.
685
-     *
686
-     * @return string
687
-     */
688
-    public static function get_message_action_url($type, EE_Message $message = null, $query_params = array())
689
-    {
690
-        $action_urls = self::get_message_action_urls($message, $query_params);
691
-        return isset($action_urls[ $type ])  ? $action_urls[ $type ] : '';
692
-    }
693
-
694
-
695
-
696
-    /**
697
-     * This returns all the current urls for EE_Message actions.
698
-     *
699
-     * @since 4.9.0
700
-     *
701
-     * @param  EE_Message   $message    The EE_Message object required to generate correct urls for some types.
702
-     * @param  array    $query_params   Any additional query_params to be included with the generated url.
703
-     *
704
-     * @return array
705
-     */
706
-    public static function get_message_action_urls(EE_Message $message = null, $query_params = array())
707
-    {
708
-        EE_Registry::instance()->load_helper('URL');
709
-        // if $message is not an instance of EE_Message then let's just do a dummy.
710
-        $message = empty($message) ? EE_Message_Factory::create() : $message;
711
-        $action_urls =  apply_filters(
712
-            'FHEE__EEH_MSG_Template__get_message_action_url',
713
-            array(
714
-                'view' => EEH_MSG_Template::generate_browser_trigger($message),
715
-                'error' => EEH_MSG_Template::generate_error_display_trigger($message),
716
-                'see_notifications_for' => EEH_URL::add_query_args_and_nonce(
717
-                    array_merge(
718
-                        array(
719
-                            'page' => 'espresso_messages',
720
-                            'action' => 'default',
721
-                            'filterby' => 1,
722
-                        ),
723
-                        $query_params
724
-                    ),
725
-                    admin_url('admin.php')
726
-                ),
727
-                'generate_now' => EEH_URL::add_query_args_and_nonce(
728
-                    array(
729
-                        'page' => 'espresso_messages',
730
-                        'action' => 'generate_now',
731
-                        'MSG_ID' => $message->ID()
732
-                    ),
733
-                    admin_url('admin.php')
734
-                ),
735
-                'send_now' => EEH_URL::add_query_args_and_nonce(
736
-                    array(
737
-                        'page' => 'espresso_messages',
738
-                        'action' => 'send_now',
739
-                        'MSG_ID' => $message->ID()
740
-                    ),
741
-                    admin_url('admin.php')
742
-                ),
743
-                'queue_for_resending' => EEH_URL::add_query_args_and_nonce(
744
-                    array(
745
-                        'page' => 'espresso_messages',
746
-                        'action' => 'queue_for_resending',
747
-                        'MSG_ID' => $message->ID()
748
-                    ),
749
-                    admin_url('admin.php')
750
-                ),
751
-            )
752
-        );
753
-        if ($message->TXN_ID() > 0
754
-            && EE_Registry::instance()->CAP->current_user_can(
755
-                'ee_read_transaction',
756
-                'espresso_transactions_default',
757
-                $message->TXN_ID()
758
-            )
759
-        ) {
760
-            $action_urls['view_transaction'] = EEH_URL::add_query_args_and_nonce(
761
-                array(
762
-                    'page' => 'espresso_transactions',
763
-                    'action' => 'view_transaction',
764
-                    'TXN_ID' => $message->TXN_ID()
765
-                ),
766
-                admin_url('admin.php')
767
-            );
768
-        } else {
769
-            $action_urls['view_transaction'] = '';
770
-        }
771
-        return $action_urls;
772
-    }
773
-
774
-
775
-    /**
776
-     * This returns a generated link html including the icon used for the action link for EE_Message actions.
777
-     *
778
-     * @since 4.9.0
779
-     *
780
-     * @param string $type What type of action the link is for (if invalid type is passed in then an
781
-     *                     empty string is returned)
782
-     * @param EE_Message|null $message  The EE_Message object (required for some actions to generate correctly)
783
-     * @param array           $query_params Any extra query params to include in the generated link.
784
-     *
785
-     * @return string
786
-     */
787
-    public static function get_message_action_link($type, EE_Message $message = null, $query_params = array())
788
-    {
789
-        $url = EEH_MSG_Template::get_message_action_url($type, $message, $query_params);
790
-        $icon_css = EEH_MSG_Template::get_message_action_icon($type);
791
-        $title = isset($icon_css['label']) ? 'title="' . $icon_css['label'] . '"' : '';
792
-
793
-        if (empty($url) || empty($icon_css) || ! isset($icon_css['css_class'])) {
794
-            return '';
795
-        }
796
-
797
-        $icon_css['css_class'] .= esc_attr(
798
-            apply_filters(
799
-                'FHEE__EEH_MSG_Template__get_message_action_link__icon_css_class',
800
-                ' js-ee-message-action-link ee-message-action-link-' . $type,
801
-                $type,
802
-                $message,
803
-                $query_params
804
-            )
805
-        );
806
-
807
-        return '<a href="' . $url . '"' . $title . '><span class="' . esc_attr($icon_css['css_class']) . '"></span></a>';
808
-    }
809
-
810
-
811
-
812
-
813
-
814
-    /**
815
-     * This returns an array with keys as reg statuses and values as the corresponding message type slug (filtered).
816
-     *
817
-     * @since 4.9.0
818
-     * @return array
819
-     */
820
-    public static function reg_status_to_message_type_array()
821
-    {
822
-        return (array) apply_filters(
823
-            'FHEE__EEH_MSG_Template__reg_status_to_message_type_array',
824
-            array(
825
-                EEM_Registration::status_id_approved => 'registration',
826
-                EEM_Registration::status_id_pending_payment => 'pending_approval',
827
-                EEM_Registration::status_id_not_approved => 'not_approved_registration',
828
-                EEM_Registration::status_id_cancelled => 'cancelled_registration',
829
-                EEM_Registration::status_id_declined => 'declined_registration'
830
-            )
831
-        );
832
-    }
833
-
834
-
835
-
836
-
837
-    /**
838
-     * This returns the corresponding registration message type slug to the given reg status. If there isn't a
839
-     * match, then returns an empty string.
840
-     *
841
-     * @since 4.9.0
842
-     * @param $reg_status
843
-     * @return string
844
-     */
845
-    public static function convert_reg_status_to_message_type($reg_status)
846
-    {
847
-        $reg_status_array = self::reg_status_to_message_type_array();
848
-        return isset($reg_status_array[ $reg_status ]) ? $reg_status_array[ $reg_status ] : '';
849
-    }
850
-
851
-
852
-    /**
853
-     * This returns an array with keys as payment stati and values as the corresponding message type slug (filtered).
854
-     *
855
-     * @since 4.9.0
856
-     * @return array
857
-     */
858
-    public static function payment_status_to_message_type_array()
859
-    {
860
-        return (array) apply_filters(
861
-            'FHEE__EEH_MSG_Template__payment_status_to_message_type_array',
862
-            array(
863
-                EEM_Payment::status_id_approved => 'payment',
864
-                EEM_Payment::status_id_pending => 'payment_pending',
865
-                EEM_Payment::status_id_cancelled => 'payment_cancelled',
866
-                EEM_Payment::status_id_declined => 'payment_declined',
867
-                EEM_Payment::status_id_failed => 'payment_failed'
868
-            )
869
-        );
870
-    }
871
-
872
-
873
-
874
-
875
-    /**
876
-     * This returns the corresponding payment message type slug to the given payment status. If there isn't a match then
877
-     * an empty string is returned
878
-     *
879
-     * @since 4.9.0
880
-     * @param $payment_status
881
-     * @return string
882
-     */
883
-    public static function convert_payment_status_to_message_type($payment_status)
884
-    {
885
-        $payment_status_array = self::payment_status_to_message_type_array();
886
-        return isset($payment_status_array[ $payment_status ]) ? $payment_status_array[ $payment_status ] : '';
887
-    }
888
-
889
-
890
-    /**
891
-     * This is used to retrieve the template pack for the given name.
892
-     *
893
-     * @param string $template_pack_name  should match the set `dbref` property value on the EE_Messages_Template_Pack.
894
-     *
895
-     * @return EE_Messages_Template_Pack
896
-     */
897
-    public static function get_template_pack($template_pack_name)
898
-    {
899
-        if (! self::$_template_pack_collection instanceof EE_Object_Collection) {
900
-            self::$_template_pack_collection = new EE_Messages_Template_Pack_Collection();
901
-        }
902
-
903
-        // first see if in collection already
904
-        $template_pack = self::$_template_pack_collection->get_by_name($template_pack_name);
905
-
906
-        if ($template_pack instanceof EE_Messages_Template_Pack) {
907
-            return $template_pack;
908
-        }
909
-
910
-        // nope...let's get it.
911
-        // not set yet so let's attempt to get it.
912
-        $pack_class_name = 'EE_Messages_Template_Pack_' . str_replace(
913
-            ' ',
914
-            '_',
915
-            ucwords(
916
-                str_replace('_', ' ', $template_pack_name)
917
-            )
918
-        );
919
-        if (! class_exists($pack_class_name) && $template_pack_name !== 'default') {
920
-            return self::get_template_pack('default');
921
-        } else {
922
-            $template_pack = new $pack_class_name;
923
-            self::$_template_pack_collection->add($template_pack);
924
-            return $template_pack;
925
-        }
926
-    }
927
-
928
-
929
-
930
-
931
-    /**
932
-     * Globs template packs installed in core and returns the template pack collection with all installed template packs
933
-     * in it.
934
-     *
935
-     * @since 4.9.0
936
-     *
937
-     * @return EE_Messages_Template_Pack_Collection
938
-     */
939
-    public static function get_template_pack_collection()
940
-    {
941
-        $new_collection = false;
942
-        if (! self::$_template_pack_collection instanceof EE_Messages_Template_Pack_Collection) {
943
-            self::$_template_pack_collection = new EE_Messages_Template_Pack_Collection();
944
-            $new_collection = true;
945
-        }
946
-
947
-        // glob the defaults directory for messages
948
-        $templates = glob(EE_LIBRARIES . 'messages/defaults/*', GLOB_ONLYDIR);
949
-        foreach ($templates as $template_path) {
950
-            // grab folder name
951
-            $template = basename($template_path);
952
-
953
-            if (! $new_collection) {
954
-                // already have it?
955
-                if (self::$_template_pack_collection->get_by_name($template) instanceof EE_Messages_Template_Pack) {
956
-                    continue;
957
-                }
958
-            }
959
-
960
-            // setup classname.
961
-            $template_pack_class_name = 'EE_Messages_Template_Pack_' . str_replace(
962
-                ' ',
963
-                '_',
964
-                ucwords(
965
-                    str_replace(
966
-                        '_',
967
-                        ' ',
968
-                        $template
969
-                    )
970
-                )
971
-            );
972
-            if (! class_exists($template_pack_class_name)) {
973
-                continue;
974
-            }
975
-            self::$_template_pack_collection->add(new $template_pack_class_name);
976
-        }
977
-
978
-        /**
979
-         * Filter for plugins to add in any additional template packs
980
-         * Note the filter name here is for backward compat, this used to be found in EED_Messages.
981
-         */
982
-        $additional_template_packs = apply_filters('FHEE__EED_Messages__get_template_packs__template_packs', array());
983
-        foreach ((array) $additional_template_packs as $template_pack) {
984
-            if (self::$_template_pack_collection->get_by_name(
985
-                $template_pack->dbref
986
-            ) instanceof EE_Messages_Template_Pack
987
-            ) {
988
-                continue;
989
-            }
990
-            self::$_template_pack_collection->add($template_pack);
991
-        }
992
-        return self::$_template_pack_collection;
993
-    }
994
-
995
-
996
-
997
-    /**
998
-     * This is a wrapper for the protected _create_new_templates function
999
-     *
1000
-     * @param string $messenger_name
1001
-     * @param string $message_type_name message type that the templates are being created for
1002
-     * @param int    $GRP_ID
1003
-     * @param bool   $global
1004
-     * @return array
1005
-     * @throws \EE_Error
1006
-     */
1007
-    public static function create_new_templates($messenger_name, $message_type_name, $GRP_ID = 0, $global = false)
1008
-    {
1009
-        /** @type EE_Message_Resource_Manager $Message_Resource_Manager */
1010
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1011
-        $messenger = $Message_Resource_Manager->valid_messenger($messenger_name);
1012
-        $message_type = $Message_Resource_Manager->valid_message_type($message_type_name);
1013
-        if (! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type, $global)) {
1014
-            return array();
1015
-        }
1016
-        // whew made it this far!  Okay, let's go ahead and create the templates then
1017
-        return EEH_MSG_Template::_create_new_templates($messenger, $message_type, $GRP_ID, $global);
1018
-    }
1019
-
1020
-
1021
-
1022
-    /**
1023
-     * @param \EE_messenger    $messenger
1024
-     * @param \EE_message_type $message_type
1025
-     * @param                  $GRP_ID
1026
-     * @param                  $global
1027
-     * @return array|mixed
1028
-     */
1029
-    protected static function _create_new_templates(EE_messenger $messenger, EE_message_type $message_type, $GRP_ID, $global)
1030
-    {
1031
-        // if we're creating a custom template then we don't need to use the defaults class
1032
-        if (! $global) {
1033
-            return EEH_MSG_Template::_create_custom_template_group($messenger, $message_type, $GRP_ID);
1034
-        }
1035
-        /** @type EE_Messages_Template_Defaults $Message_Template_Defaults */
1036
-        $Message_Template_Defaults = EE_Registry::factory(
1037
-            'EE_Messages_Template_Defaults',
1038
-            array( $messenger, $message_type, $GRP_ID )
1039
-        );
1040
-        // generate templates
1041
-        $success = $Message_Template_Defaults->create_new_templates();
1042
-
1043
-        // if creating the template failed.  Then we should deactivate the related message_type for the messenger because
1044
-        // its not active if it doesn't have a template.  Note this is only happening for GLOBAL template creation
1045
-        // attempts.
1046
-        if (! $success) {
1047
-            /** @var EE_Message_Resource_Manager $message_resource_manager */
1048
-            $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1049
-            $message_resource_manager->deactivate_message_type_for_messenger($message_type->name, $messenger->name);
1050
-        }
1051
-
1052
-        /**
1053
-         * $success is in an array in the following format
1054
-         * array(
1055
-         *    'GRP_ID' => $new_grp_id,
1056
-         *    'MTP_context' => $first_context_in_new_templates,
1057
-         * )
1058
-         */
1059
-        return $success;
1060
-    }
1061
-
1062
-
1063
-
1064
-    /**
1065
-     * This creates a custom template using the incoming GRP_ID
1066
-     *
1067
-     * @param \EE_messenger    $messenger
1068
-     * @param \EE_message_type $message_type
1069
-     * @param  int             $GRP_ID      GRP_ID for the template_group being used as the base
1070
-     * @return  array $success              This will be an array in the format:
1071
-     *                                      array(
1072
-     *                                          'GRP_ID' => $new_grp_id,
1073
-     *                                          'MTP_context' => $first_context_in_created_template
1074
-     *                                      )
1075
-     * @access private
1076
-     */
1077
-    private static function _create_custom_template_group(EE_messenger $messenger, EE_message_type $message_type, $GRP_ID)
1078
-    {
1079
-        // defaults
1080
-        $success = array( 'GRP_ID' => null, 'MTP_context' => '' );
1081
-        // get the template group to use as a template from the db.  If $GRP_ID is empty then we'll assume the base will be the global template matching the messenger and message type.
1082
-        $Message_Template_Group = empty($GRP_ID)
1083
-            ? EEM_Message_Template_Group::instance()->get_one(
1084
-                array(
1085
-                    array(
1086
-                        'MTP_messenger'    => $messenger->name,
1087
-                        'MTP_message_type' => $message_type->name,
1088
-                        'MTP_is_global'    => true
1089
-                    )
1090
-                )
1091
-            )
1092
-            : EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1093
-        // if we don't have a mtg at this point then we need to bail.
1094
-        if (! $Message_Template_Group instanceof EE_Message_Template_Group) {
1095
-            EE_Error::add_error(
1096
-                sprintf(
1097
-                    __(
1098
-                        'Something went wrong with generating the custom template from this group id: %s.  This usually happens when there is no matching message template group in the db.',
1099
-                        'event_espresso'
1100
-                    ),
1101
-                    $GRP_ID
1102
-                ),
1103
-                __FILE__,
1104
-                __FUNCTION__,
1105
-                __LINE__
1106
-            );
1107
-            return $success;
1108
-        }
1109
-        // let's get all the related message_template objects for this group.
1110
-        $message_templates = $Message_Template_Group->message_templates();
1111
-        // now we have what we need to setup the new template
1112
-        $new_mtg = clone $Message_Template_Group;
1113
-        $new_mtg->set('GRP_ID', 0);
1114
-        $new_mtg->set('MTP_is_global', false);
1115
-        $template_name = defined('DOING_AJAX') && ! empty($_POST['templateName'])
1116
-            ? $_POST['templateName']
1117
-            : __(
1118
-                'New Custom Template',
1119
-                'event_espresso'
1120
-            );
1121
-        $template_description = defined("DOING_AJAX") && ! empty($_POST['templateDescription'])
1122
-            ? $_POST['templateDescription']
1123
-            : sprintf(
1124
-                __(
1125
-                    'This is a custom template that was created for the %s messenger and %s message type.',
1126
-                    'event_espresso'
1127
-                ),
1128
-                $new_mtg->messenger_obj()->label['singular'],
1129
-                $new_mtg->message_type_obj()->label['singular']
1130
-            );
1131
-        $new_mtg->set('MTP_name', $template_name);
1132
-        $new_mtg->set('MTP_description', $template_description);
1133
-        // remove ALL relations on this template group so they don't get saved!
1134
-        $new_mtg->_remove_relations('Message_Template');
1135
-        $new_mtg->save();
1136
-        $success['GRP_ID'] = $new_mtg->ID();
1137
-        $success['template_name'] = $template_name;
1138
-        // add new message templates and add relation to.
1139
-        foreach ($message_templates as $message_template) {
1140
-            if (! $message_template instanceof EE_Message_Template) {
1141
-                continue;
1142
-            }
1143
-            $new_message_template = clone $message_template;
1144
-            $new_message_template->set('MTP_ID', 0);
1145
-            $new_message_template->set('GRP_ID', $new_mtg->ID()); // relation
1146
-            $new_message_template->save();
1147
-            if (empty($success['MTP_context'])) {
1148
-                $success['MTP_context'] = $new_message_template->get('MTP_context');
1149
-            }
1150
-        }
1151
-        return $success;
1152
-    }
1153
-
1154
-
1155
-
1156
-    /**
1157
-     * message_type_has_active_templates_for_messenger
1158
-     *
1159
-     * @param \EE_messenger    $messenger
1160
-     * @param \EE_message_type $message_type
1161
-     * @param bool             $global
1162
-     * @return bool
1163
-     */
1164
-    public static function message_type_has_active_templates_for_messenger(
1165
-        EE_messenger $messenger,
1166
-        EE_message_type $message_type,
1167
-        $global = false
1168
-    ) {
1169
-        // is given message_type valid for given messenger (if this is not a global save)
1170
-        if ($global) {
1171
-            return true;
1172
-        }
1173
-        $active_templates = EEM_Message_Template_Group::instance()->count(
1174
-            array(
1175
-                array(
1176
-                    'MTP_is_active'    => true,
1177
-                    'MTP_messenger'    => $messenger->name,
1178
-                    'MTP_message_type' => $message_type->name
1179
-                )
1180
-            )
1181
-        );
1182
-        if ($active_templates > 0) {
1183
-            return true;
1184
-        }
1185
-        EE_Error::add_error(
1186
-            sprintf(
1187
-                __(
1188
-                    'The %1$s message type is not registered with the %2$s messenger. Please visit the Messenger activation page to assign this message type first if you want to use it.',
1189
-                    'event_espresso'
1190
-                ),
1191
-                $message_type->name,
1192
-                $messenger->name
1193
-            ),
1194
-            __FILE__,
1195
-            __FUNCTION__,
1196
-            __LINE__
1197
-        );
1198
-        return false;
1199
-    }
1200
-
1201
-
1202
-
1203
-    /**
1204
-     * get_fields
1205
-     * This takes a given messenger and message type and returns all the template fields indexed by context (and with field type).
1206
-     *
1207
-     * @param  string $messenger_name    name of EE_messenger
1208
-     * @param  string $message_type_name name of EE_message_type
1209
-     * @return array
1210
-     */
1211
-    public static function get_fields($messenger_name, $message_type_name)
1212
-    {
1213
-        $template_fields = array();
1214
-        /** @type EE_Message_Resource_Manager $Message_Resource_Manager */
1215
-        $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1216
-        $messenger = $Message_Resource_Manager->valid_messenger($messenger_name);
1217
-        $message_type = $Message_Resource_Manager->valid_message_type($message_type_name);
1218
-        if (! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type)) {
1219
-            return array();
1220
-        }
1221
-
1222
-        $excluded_fields_for_messenger = $message_type->excludedFieldsForMessenger($messenger_name);
1223
-
1224
-        // okay now let's assemble an array with the messenger template fields added to the message_type contexts.
1225
-        foreach ($message_type->get_contexts() as $context => $details) {
1226
-            foreach ($messenger->get_template_fields() as $field => $value) {
1227
-                if (in_array($field, $excluded_fields_for_messenger, true)) {
1228
-                    continue;
1229
-                }
1230
-                $template_fields[ $context ][ $field ] = $value;
1231
-            }
1232
-        }
1233
-        if (empty($template_fields)) {
1234
-            EE_Error::add_error(
1235
-                __('Something went wrong and we couldn\'t get any templates assembled', 'event_espresso'),
1236
-                __FILE__,
1237
-                __FUNCTION__,
1238
-                __LINE__
1239
-            );
1240
-            return array();
1241
-        }
1242
-        return $template_fields;
1243
-    }
17
+	/**
18
+	 * Holds a collection of EE_Message_Template_Pack objects.
19
+	 * @type EE_Messages_Template_Pack_Collection
20
+	 */
21
+	protected static $_template_pack_collection;
22
+
23
+
24
+
25
+
26
+	private static function _set_autoloader()
27
+	{
28
+		EED_Messages::set_autoloaders();
29
+	}
30
+
31
+
32
+	/**
33
+	 * generate_new_templates
34
+	 * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will automatically create the defaults for the event.  The user would then be redirected to edit the default context for the event.
35
+	 *
36
+	 * @access protected
37
+	 * @param  string $messenger     the messenger we are generating templates for
38
+	 * @param array   $message_types array of message types that the templates are generated for.
39
+	 * @param int     $GRP_ID        If a non global template is being generated then it is expected we'll have a GRP_ID to use as the base for the new generated template.
40
+	 * @param bool    $global        true indicates generating templates on messenger activation. false requires GRP_ID for event specific template generation.
41
+	 * @throws \EE_Error
42
+	 * @return array  @see EEH_MSG_Template::_create_new_templates for the return value of each element in the array for templates
43
+	 *                that are generated.  If this is an empty array then it means no templates were generated which usually
44
+	 *                means there was an error.  Anything in the array with an empty value for `MTP_context` means that it
45
+	 *                was not a new generated template but just reactivated (which only happens for global templates that
46
+	 *                already exist in the database.
47
+	 */
48
+	public static function generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
49
+	{
50
+		// make sure message_type is an array.
51
+		$message_types = (array) $message_types;
52
+		$templates = array();
53
+
54
+		if (empty($messenger)) {
55
+			throw new EE_Error(__('We need a messenger to generate templates!', 'event_espresso'));
56
+		}
57
+
58
+		// if we STILL have empty $message_types then we need to generate an error message b/c we NEED message types to do the template files.
59
+		if (empty($message_types)) {
60
+			throw new EE_Error(__('We need at least one message type to generate templates!', 'event_espresso'));
61
+		}
62
+
63
+		EEH_MSG_Template::_set_autoloader();
64
+		foreach ($message_types as $message_type) {
65
+			// if global then let's attempt to get the GRP_ID for this combo IF GRP_ID is empty.
66
+			if ($global && empty($GRP_ID)) {
67
+				$GRP_ID = EEM_Message_Template_Group::instance()->get_one(
68
+					array(
69
+						array(
70
+							'MTP_messenger'    => $messenger,
71
+							'MTP_message_type' => $message_type,
72
+							'MTP_is_global'    => true,
73
+						),
74
+					)
75
+				);
76
+				$GRP_ID = $GRP_ID instanceof EE_Message_Template_Group ? $GRP_ID->ID() : 0;
77
+			}
78
+			// if this is global template generation.
79
+			// First let's determine if we already HAVE global templates for this messenger and message_type combination.
80
+			//  If we do then NO generation!!
81
+			if ($global && EEH_MSG_Template::already_generated($messenger, $message_type, $GRP_ID)) {
82
+				$templates[] = array(
83
+					'GRP_ID' => $GRP_ID,
84
+					'MTP_context' => '',
85
+				);
86
+				// we already have generated templates for this so let's go to the next message type.
87
+				continue;
88
+			}
89
+			$new_message_template_group = EEH_MSG_Template::create_new_templates($messenger, $message_type, $GRP_ID, $global);
90
+
91
+			if (! $new_message_template_group) {
92
+				continue;
93
+			}
94
+			$templates[] = $new_message_template_group;
95
+		}
96
+
97
+		return $templates;
98
+	}
99
+
100
+
101
+	/**
102
+	 * The purpose of this method is to determine if there are already generated templates in the database for the given variables.
103
+	 * @param  string $messenger     messenger
104
+	 * @param  string $message_type message type
105
+	 * @param  int $GRP_ID        GRP ID ( if a custom template) (if not provided then we're just doing global template check)
106
+	 * @return bool                true = generated, false = hasn't been generated.
107
+	 */
108
+	public static function already_generated($messenger, $message_type, $GRP_ID = 0)
109
+	{
110
+		EEH_MSG_Template::_set_autoloader();
111
+		// what method we use depends on whether we have an GRP_ID or not
112
+		$count = empty($GRP_ID)
113
+			? EEM_Message_Template::instance()->count(
114
+				array(
115
+					array(
116
+						'Message_Template_Group.MTP_messenger'    => $messenger,
117
+						'Message_Template_Group.MTP_message_type' => $message_type,
118
+						'Message_Template_Group.MTP_is_global'    => true
119
+					)
120
+				)
121
+			)
122
+			: EEM_Message_Template::instance()->count(array( array( 'GRP_ID' => $GRP_ID ) ));
123
+
124
+		return $count > 0;
125
+	}
126
+
127
+
128
+
129
+
130
+	/**
131
+	 * Updates all message templates matching the incoming messengers and message types to active status.
132
+	 *
133
+	 * @static
134
+	 * @param  array  $messenger_names     Messenger slug
135
+	 * @param  array  $message_type_names  Message type slug
136
+	 * @return  int                         count of updated records.
137
+	 */
138
+	public static function update_to_active($messenger_names, $message_type_names)
139
+	{
140
+		$messenger_names = is_array($messenger_names) ? $messenger_names : array( $messenger_names );
141
+		$message_type_names = is_array($message_type_names) ? $message_type_names : array( $message_type_names );
142
+		return EEM_Message_Template_Group::instance()->update(
143
+			array( 'MTP_is_active' => 1 ),
144
+			array(
145
+				array(
146
+					'MTP_messenger'     => array( 'IN', $messenger_names ),
147
+					'MTP_message_type'  => array( 'IN', $message_type_names )
148
+				)
149
+			)
150
+		);
151
+	}
152
+
153
+
154
+
155
+	/**
156
+	 * Updates all message template groups matching the incoming arguments to inactive status.
157
+	 *
158
+	 * @static
159
+	 * @param array $messenger_names    The messenger slugs.
160
+	 *                              If empty then all templates matching the message types are marked inactive.
161
+	 *                              Otherwise only templates matching the messengers and message types.
162
+	 * @param array $message_type_names     The message type slugs.
163
+	 *                              If empty then all templates matching the messengers are marked inactive.
164
+	 *                              Otherwise only templates matching the messengers and message types.
165
+	 *
166
+	 * @return int  count of updated records.
167
+	 */
168
+	public static function update_to_inactive($messenger_names = array(), $message_type_names = array())
169
+	{
170
+		return EEM_Message_Template_Group::instance()->deactivate_message_template_groups_for(
171
+			$messenger_names,
172
+			$message_type_names
173
+		);
174
+	}
175
+
176
+
177
+	/**
178
+	 * The purpose of this function is to return all installed message objects
179
+	 * (messengers and message type regardless of whether they are ACTIVE or not)
180
+	 *
181
+	 * @deprecated 4.9.0
182
+	 * @static
183
+	 * @param string $type
184
+	 * @return array array consisting of installed messenger objects and installed message type objects.
185
+	 */
186
+	public static function get_installed_message_objects($type = 'all')
187
+	{
188
+		self::_set_autoloader();
189
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
190
+		return array(
191
+			'messenger' => $message_resource_manager->installed_messengers(),
192
+			'message_type' => $message_resource_manager->installed_message_types()
193
+		);
194
+	}
195
+
196
+
197
+	/**
198
+	 * This will return an array of shortcodes => labels from the
199
+	 * messenger and message_type objects associated with this
200
+	 * template.
201
+	 *
202
+	 * @since 4.3.0
203
+	 *
204
+	 * @param string $message_type
205
+	 * @param string $messenger
206
+	 * @param array  $fields    What fields we're returning valid shortcodes for.
207
+	 *                          If empty then we assume all fields are to be returned. Optional.
208
+	 * @param string $context   What context we're going to return shortcodes for. Optional.
209
+	 * @param bool $merged      If TRUE then we don't return shortcodes indexed by field,
210
+	 *                          but instead an array of the unique shortcodes for all the given ( or all) fields.
211
+	 *                          Optional.
212
+	 * @throws \EE_Error
213
+	 * @return mixed (array|bool) an array of shortcodes in the format
214
+	 *                                              array( '[shortcode] => 'label')
215
+	 *                                              OR
216
+	 *                                              FALSE if no shortcodes found.
217
+	 */
218
+	public static function get_shortcodes(
219
+		$message_type,
220
+		$messenger,
221
+		$fields = array(),
222
+		$context = 'admin',
223
+		$merged = false
224
+	) {
225
+		$messenger_name = str_replace(' ', '_', ucwords(str_replace('_', ' ', $messenger)));
226
+		$mt_name = str_replace(' ', '_', ucwords(str_replace('_', ' ', $message_type)));
227
+		/** @var EE_Message_Resource_Manager $message_resource_manager */
228
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
229
+		// convert slug to object
230
+		$messenger = $message_resource_manager->get_messenger($messenger);
231
+
232
+		// if messenger isn't a EE_messenger resource then bail.
233
+		if (! $messenger instanceof EE_messenger) {
234
+			return array();
235
+		}
236
+
237
+		// validate class for getting our list of shortcodes
238
+		$classname = 'EE_Messages_' . $messenger_name . '_' . $mt_name . '_Validator';
239
+		if (! class_exists($classname)) {
240
+			$msg[] = __('The Validator class was unable to load', 'event_espresso');
241
+			$msg[] = sprintf(
242
+				__('The class name compiled was %s. Please check and make sure the spelling and case is correct for the class name and that there is an autoloader in place for this class', 'event_espresso'),
243
+				$classname
244
+			);
245
+			throw new EE_Error(implode('||', $msg));
246
+		}
247
+
248
+		/** @type EE_Messages_Validator $_VLD */
249
+		$_VLD = new $classname(array(), $context);
250
+		$valid_shortcodes = $_VLD->get_validators();
251
+
252
+		// let's make sure we're only getting the shortcode part of the validators
253
+		$shortcodes = array();
254
+		foreach ($valid_shortcodes as $field => $validators) {
255
+			$shortcodes[ $field ] = $validators['shortcodes'];
256
+		}
257
+		$valid_shortcodes = $shortcodes;
258
+
259
+		// if not all fields let's make sure we ONLY include the shortcodes for the specified fields.
260
+		if (! empty($fields)) {
261
+			$specified_shortcodes = array();
262
+			foreach ($fields as $field) {
263
+				if (isset($valid_shortcodes[ $field ])) {
264
+					$specified_shortcodes[ $field ] = $valid_shortcodes[ $field ];
265
+				}
266
+			}
267
+			$valid_shortcodes = $specified_shortcodes;
268
+		}
269
+
270
+		// if not merged then let's replace the fields with the localized fields
271
+		if (! $merged) {
272
+			// let's get all the fields for the set messenger so that we can get the localized label and use that in the returned array.
273
+			$field_settings = $messenger->get_template_fields();
274
+			$localized = array();
275
+			foreach ($valid_shortcodes as $field => $shortcodes) {
276
+				// get localized field label
277
+				if (isset($field_settings[ $field ])) {
278
+					// possible that this is used as a main field.
279
+					if (empty($field_settings[ $field ])) {
280
+						if (isset($field_settings['extra'][ $field ])) {
281
+							$_field = $field_settings['extra'][ $field ]['main']['label'];
282
+						} else {
283
+							$_field = $field;
284
+						}
285
+					} else {
286
+						$_field = $field_settings[ $field ]['label'];
287
+					}
288
+				} elseif (isset($field_settings['extra'])) {
289
+					// loop through extra "main fields" and see if any of their children have our field
290
+					foreach ($field_settings['extra'] as $main_field => $fields) {
291
+						if (isset($fields[ $field ])) {
292
+							$_field = $fields[ $field ]['label'];
293
+						} else {
294
+							$_field = $field;
295
+						}
296
+					}
297
+				} else {
298
+					$_field = $field;
299
+				}
300
+				if (isset($_field)) {
301
+					$localized[ (string) $_field ] = $shortcodes;
302
+				}
303
+			}
304
+			$valid_shortcodes = $localized;
305
+		}
306
+
307
+		// if $merged then let's merge all the shortcodes into one list NOT indexed by field.
308
+		if ($merged) {
309
+			$merged_codes = array();
310
+			foreach ($valid_shortcodes as $field => $shortcode) {
311
+				foreach ($shortcode as $code => $label) {
312
+					if (isset($merged_codes[ $code ])) {
313
+						continue;
314
+					} else {
315
+						$merged_codes[ $code ] = $label;
316
+					}
317
+				}
318
+			}
319
+			$valid_shortcodes = $merged_codes;
320
+		}
321
+
322
+		return $valid_shortcodes;
323
+	}
324
+
325
+
326
+	/**
327
+	 * Get Messenger object.
328
+	 *
329
+	 * @since 4.3.0
330
+	 * @deprecated 4.9.0
331
+	 * @param string $messenger messenger slug for the messenger object we want to retrieve.
332
+	 * @throws \EE_Error
333
+	 * @return EE_messenger
334
+	 */
335
+	public static function messenger_obj($messenger)
336
+	{
337
+		/** @type EE_Message_Resource_Manager $Message_Resource_Manager */
338
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
339
+		return $Message_Resource_Manager->get_messenger($messenger);
340
+	}
341
+
342
+
343
+	/**
344
+	 * get Message type object
345
+	 *
346
+	 * @since 4.3.0
347
+	 * @deprecated 4.9.0
348
+	 * @param string $message_type the slug for the message type object to retrieve
349
+	 * @throws \EE_Error
350
+	 * @return EE_message_type
351
+	 */
352
+	public static function message_type_obj($message_type)
353
+	{
354
+		/** @type EE_Message_Resource_Manager $Message_Resource_Manager */
355
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
356
+		return $Message_Resource_Manager->get_message_type($message_type);
357
+	}
358
+
359
+
360
+
361
+
362
+
363
+	/**
364
+	 * Given a message_type slug, will return whether that message type is active in the system or not.
365
+	 *
366
+	 * @since    4.3.0
367
+	 * @param  string   $message_type message type to check for.
368
+	 * @return boolean
369
+	 */
370
+	public static function is_mt_active($message_type)
371
+	{
372
+		/** @type EE_Message_Resource_Manager $Message_Resource_Manager */
373
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
374
+		$active_mts = $Message_Resource_Manager->list_of_active_message_types();
375
+		return in_array($message_type, $active_mts);
376
+	}
377
+
378
+
379
+
380
+	/**
381
+	 * Given a messenger slug, will return whether that messenger is active in the system or not.
382
+	 *
383
+	 * @since    4.3.0
384
+	 *
385
+	 * @param  string  $messenger slug for messenger to check.
386
+	 * @return boolean
387
+	 */
388
+	public static function is_messenger_active($messenger)
389
+	{
390
+		/** @type EE_Message_Resource_Manager $Message_Resource_Manager */
391
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
392
+		$active_messenger = $Message_Resource_Manager->get_active_messenger($messenger);
393
+		return $active_messenger instanceof EE_messenger ? true : false;
394
+	}
395
+
396
+
397
+
398
+	/**
399
+	 * Used to return active messengers array stored in the wp options table.
400
+	 * If no value is present in the option then an empty array is returned.
401
+	 *
402
+	 * @deprecated 4.9
403
+	 * @since 4.3.1
404
+	 *
405
+	 * @return array
406
+	 */
407
+	public static function get_active_messengers_in_db()
408
+	{
409
+		EE_Error::doing_it_wrong(
410
+			__METHOD__,
411
+			__('Please use EE_Message_Resource_Manager::get_active_messengers_option() instead.', 'event_espresso'),
412
+			'4.9.0'
413
+		);
414
+		/** @var EE_Message_Resource_Manager $Message_Resource_Manager */
415
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
416
+		return $Message_Resource_Manager->get_active_messengers_option();
417
+	}
418
+
419
+
420
+
421
+
422
+	/**
423
+	 * Used to update the active messengers array stored in the wp options table.
424
+	 *
425
+	 * @since 4.3.1
426
+	 * @deprecated 4.9.0
427
+	 *
428
+	 * @param array $data_to_save Incoming data to save.
429
+	 *
430
+	 * @return bool FALSE if not updated, TRUE if updated.
431
+	 */
432
+	public static function update_active_messengers_in_db($data_to_save)
433
+	{
434
+		EE_Error::doing_it_wrong(
435
+			__METHOD__,
436
+			__('Please use EE_Message_Resource_Manager::update_active_messengers_option() instead.', 'event_espresso'),
437
+			'4.9.0'
438
+		);
439
+		/** @var EE_Message_Resource_Manager $Message_Resource_Manager */
440
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
441
+		return $Message_Resource_Manager->update_active_messengers_option($data_to_save);
442
+	}
443
+
444
+
445
+	/**
446
+	 * This does some validation of incoming params, determines what type of url is being prepped and returns the
447
+	 * appropriate url trigger
448
+	 *
449
+	 * @param EE_message_type $message_type
450
+	 * @param EE_Message $message
451
+	 * @param EE_Registration | null $registration  The registration object must be included if this
452
+	 *                                              is going to be a registration trigger url.
453
+	 * @param string $sending_messenger             The (optional) sending messenger for the url.
454
+	 *
455
+	 * @return string
456
+	 * @throws EE_Error
457
+	 */
458
+	public static function get_url_trigger(
459
+		EE_message_type $message_type,
460
+		EE_Message $message,
461
+		$registration = null,
462
+		$sending_messenger = ''
463
+	) {
464
+		// first determine if the url can be to the EE_Message object.
465
+		if (! $message_type->always_generate()) {
466
+			return EEH_MSG_Template::generate_browser_trigger($message);
467
+		}
468
+
469
+		// if $registration object is not valid then exit early because there's nothing that can be generated.
470
+		if (! $registration instanceof EE_Registration) {
471
+			throw new EE_Error(
472
+				__('Incoming value for registration is not a valid EE_Registration object.', 'event_espresso')
473
+			);
474
+		}
475
+
476
+		// validate given context
477
+		$contexts = $message_type->get_contexts();
478
+		if ($message->context() !== '' && ! isset($contexts[ $message->context() ])) {
479
+			throw new EE_Error(
480
+				sprintf(
481
+					__('The context %s is not a valid context for %s.', 'event_espresso'),
482
+					$message->context(),
483
+					get_class($message_type)
484
+				)
485
+			);
486
+		}
487
+
488
+		// valid sending messenger but only if sending messenger set.  Otherwise generating messenger is used.
489
+		if (! empty($sending_messenger)) {
490
+			$with_messengers = $message_type->with_messengers();
491
+			if (! isset($with_messengers[ $message->messenger() ])
492
+				 || ! in_array($sending_messenger, $with_messengers[ $message->messenger() ]) ) {
493
+				throw new EE_Error(
494
+					sprintf(
495
+						__(
496
+							'The given sending messenger string (%1$s) does not match a valid sending messenger with the %2$s.  If this is incorrect, make sure that the message type has defined this messenger as a sending messenger in its $_with_messengers array.',
497
+							'event_espresso'
498
+						),
499
+						$sending_messenger,
500
+						get_class($message_type)
501
+					)
502
+				);
503
+			}
504
+		} else {
505
+			$sending_messenger = $message->messenger();
506
+		}
507
+		return EEH_MSG_Template::generate_url_trigger(
508
+			$sending_messenger,
509
+			$message->messenger(),
510
+			$message->context(),
511
+			$message->message_type(),
512
+			$registration,
513
+			$message->GRP_ID()
514
+		);
515
+	}
516
+
517
+
518
+	/**
519
+	 * This returns the url for triggering a in browser view of a specific EE_Message object.
520
+	 * @param EE_Message $message
521
+	 * @return string.
522
+	 */
523
+	public static function generate_browser_trigger(EE_Message $message)
524
+	{
525
+		$query_args = array(
526
+			'ee' => 'msg_browser_trigger',
527
+			'token' => $message->MSG_token()
528
+		);
529
+		return apply_filters(
530
+			'FHEE__EEH_MSG_Template__generate_browser_trigger',
531
+			add_query_arg($query_args, site_url()),
532
+			$message
533
+		);
534
+	}
535
+
536
+
537
+
538
+
539
+
540
+
541
+	/**
542
+	 * This returns the url for triggering an in browser view of the error saved on the incoming message object.
543
+	 * @param EE_Message $message
544
+	 * @return string
545
+	 */
546
+	public static function generate_error_display_trigger(EE_Message $message)
547
+	{
548
+		return apply_filters(
549
+			'FHEE__EEH_MSG_Template__generate_error_display_trigger',
550
+			add_query_arg(
551
+				array(
552
+					'ee' => 'msg_browser_error_trigger',
553
+					'token' => $message->MSG_token()
554
+				),
555
+				site_url()
556
+			),
557
+			$message
558
+		);
559
+	}
560
+
561
+
562
+
563
+
564
+
565
+
566
+	/**
567
+	 * This generates a url trigger for the msg_url_trigger route using the given arguments
568
+	 *
569
+	 * @param string          $sending_messenger    The sending messenger slug.
570
+	 * @param string          $generating_messenger The generating messenger slug.
571
+	 * @param string          $context              The context for the template.
572
+	 * @param string          $message_type         The message type slug
573
+	 * @param EE_Registration $registration
574
+	 * @param integer          $message_template_group id   The EE_Message_Template_Group ID for the template.
575
+	 * @param integer          $data_id     The id to the EE_Base_Class for getting the data used by the trigger.
576
+	 * @return string          The generated url.
577
+	 */
578
+	public static function generate_url_trigger(
579
+		$sending_messenger,
580
+		$generating_messenger,
581
+		$context,
582
+		$message_type,
583
+		EE_Registration $registration,
584
+		$message_template_group,
585
+		$data_id = 0
586
+	) {
587
+		$query_args = array(
588
+			'ee' => 'msg_url_trigger',
589
+			'snd_msgr' => $sending_messenger,
590
+			'gen_msgr' => $generating_messenger,
591
+			'message_type' => $message_type,
592
+			'context' => $context,
593
+			'token' => $registration->reg_url_link(),
594
+			'GRP_ID' => $message_template_group,
595
+			'id' => $data_id
596
+			);
597
+		$url = add_query_arg($query_args, get_home_url());
598
+
599
+		// made it here so now we can just get the url and filter it.  Filtered globally and by message type.
600
+		$url = apply_filters(
601
+			'FHEE__EEH_MSG_Template__generate_url_trigger',
602
+			$url,
603
+			$sending_messenger,
604
+			$generating_messenger,
605
+			$context,
606
+			$message_type,
607
+			$registration,
608
+			$message_template_group,
609
+			$data_id
610
+		);
611
+		return $url;
612
+	}
613
+
614
+
615
+
616
+
617
+	/**
618
+	 * Return the specific css for the action icon given.
619
+	 *
620
+	 * @since 4.9.0
621
+	 *
622
+	 * @param string $type  What action to return.
623
+	 * @return string
624
+	 */
625
+	public static function get_message_action_icon($type)
626
+	{
627
+		$action_icons = self::get_message_action_icons();
628
+		return isset($action_icons[ $type ]) ? $action_icons[ $type ] : '';
629
+	}
630
+
631
+
632
+	/**
633
+	 * This is used for retrieving the css classes used for the icons representing message actions.
634
+	 *
635
+	 * @since 4.9.0
636
+	 *
637
+	 * @return array
638
+	 */
639
+	public static function get_message_action_icons()
640
+	{
641
+		return apply_filters(
642
+			'FHEE__EEH_MSG_Template__message_action_icons',
643
+			array(
644
+				'view' => array(
645
+					'label' => __('View Message', 'event_espresso'),
646
+					'css_class' => 'dashicons dashicons-welcome-view-site',
647
+				),
648
+				'error' => array(
649
+					'label' => __('View Error Message', 'event_espresso'),
650
+					'css_class' => 'dashicons dashicons-info',
651
+				),
652
+				'see_notifications_for' => array(
653
+					'label' => __('View Related Messages', 'event_espresso'),
654
+					'css_class' => 'dashicons dashicons-megaphone',
655
+				),
656
+				'generate_now' => array(
657
+					'label' => __('Generate the message now.', 'event_espresso'),
658
+					'css_class' => 'dashicons dashicons-admin-tools',
659
+				),
660
+				'send_now' => array(
661
+					'label' => __('Send Immediately', 'event_espresso'),
662
+					'css_class' => 'dashicons dashicons-controls-forward',
663
+				),
664
+				'queue_for_resending' => array(
665
+					'label' => __('Queue for Resending', 'event_espresso'),
666
+					'css_class' => 'dashicons dashicons-controls-repeat',
667
+				),
668
+				'view_transaction' => array(
669
+					'label' => __('View related Transaction', 'event_espresso'),
670
+					'css_class' => 'dashicons dashicons-cart',
671
+				)
672
+			)
673
+		);
674
+	}
675
+
676
+
677
+	/**
678
+	 * This returns the url for a given action related to EE_Message.
679
+	 *
680
+	 * @since 4.9.0
681
+	 *
682
+	 * @param string $type  What type of action to return the url for.
683
+	 * @param EE_Message $message   Required for generating the correct url for some types.
684
+	 * @param array  $query_params   Any additional query params to be included with the generated url.
685
+	 *
686
+	 * @return string
687
+	 */
688
+	public static function get_message_action_url($type, EE_Message $message = null, $query_params = array())
689
+	{
690
+		$action_urls = self::get_message_action_urls($message, $query_params);
691
+		return isset($action_urls[ $type ])  ? $action_urls[ $type ] : '';
692
+	}
693
+
694
+
695
+
696
+	/**
697
+	 * This returns all the current urls for EE_Message actions.
698
+	 *
699
+	 * @since 4.9.0
700
+	 *
701
+	 * @param  EE_Message   $message    The EE_Message object required to generate correct urls for some types.
702
+	 * @param  array    $query_params   Any additional query_params to be included with the generated url.
703
+	 *
704
+	 * @return array
705
+	 */
706
+	public static function get_message_action_urls(EE_Message $message = null, $query_params = array())
707
+	{
708
+		EE_Registry::instance()->load_helper('URL');
709
+		// if $message is not an instance of EE_Message then let's just do a dummy.
710
+		$message = empty($message) ? EE_Message_Factory::create() : $message;
711
+		$action_urls =  apply_filters(
712
+			'FHEE__EEH_MSG_Template__get_message_action_url',
713
+			array(
714
+				'view' => EEH_MSG_Template::generate_browser_trigger($message),
715
+				'error' => EEH_MSG_Template::generate_error_display_trigger($message),
716
+				'see_notifications_for' => EEH_URL::add_query_args_and_nonce(
717
+					array_merge(
718
+						array(
719
+							'page' => 'espresso_messages',
720
+							'action' => 'default',
721
+							'filterby' => 1,
722
+						),
723
+						$query_params
724
+					),
725
+					admin_url('admin.php')
726
+				),
727
+				'generate_now' => EEH_URL::add_query_args_and_nonce(
728
+					array(
729
+						'page' => 'espresso_messages',
730
+						'action' => 'generate_now',
731
+						'MSG_ID' => $message->ID()
732
+					),
733
+					admin_url('admin.php')
734
+				),
735
+				'send_now' => EEH_URL::add_query_args_and_nonce(
736
+					array(
737
+						'page' => 'espresso_messages',
738
+						'action' => 'send_now',
739
+						'MSG_ID' => $message->ID()
740
+					),
741
+					admin_url('admin.php')
742
+				),
743
+				'queue_for_resending' => EEH_URL::add_query_args_and_nonce(
744
+					array(
745
+						'page' => 'espresso_messages',
746
+						'action' => 'queue_for_resending',
747
+						'MSG_ID' => $message->ID()
748
+					),
749
+					admin_url('admin.php')
750
+				),
751
+			)
752
+		);
753
+		if ($message->TXN_ID() > 0
754
+			&& EE_Registry::instance()->CAP->current_user_can(
755
+				'ee_read_transaction',
756
+				'espresso_transactions_default',
757
+				$message->TXN_ID()
758
+			)
759
+		) {
760
+			$action_urls['view_transaction'] = EEH_URL::add_query_args_and_nonce(
761
+				array(
762
+					'page' => 'espresso_transactions',
763
+					'action' => 'view_transaction',
764
+					'TXN_ID' => $message->TXN_ID()
765
+				),
766
+				admin_url('admin.php')
767
+			);
768
+		} else {
769
+			$action_urls['view_transaction'] = '';
770
+		}
771
+		return $action_urls;
772
+	}
773
+
774
+
775
+	/**
776
+	 * This returns a generated link html including the icon used for the action link for EE_Message actions.
777
+	 *
778
+	 * @since 4.9.0
779
+	 *
780
+	 * @param string $type What type of action the link is for (if invalid type is passed in then an
781
+	 *                     empty string is returned)
782
+	 * @param EE_Message|null $message  The EE_Message object (required for some actions to generate correctly)
783
+	 * @param array           $query_params Any extra query params to include in the generated link.
784
+	 *
785
+	 * @return string
786
+	 */
787
+	public static function get_message_action_link($type, EE_Message $message = null, $query_params = array())
788
+	{
789
+		$url = EEH_MSG_Template::get_message_action_url($type, $message, $query_params);
790
+		$icon_css = EEH_MSG_Template::get_message_action_icon($type);
791
+		$title = isset($icon_css['label']) ? 'title="' . $icon_css['label'] . '"' : '';
792
+
793
+		if (empty($url) || empty($icon_css) || ! isset($icon_css['css_class'])) {
794
+			return '';
795
+		}
796
+
797
+		$icon_css['css_class'] .= esc_attr(
798
+			apply_filters(
799
+				'FHEE__EEH_MSG_Template__get_message_action_link__icon_css_class',
800
+				' js-ee-message-action-link ee-message-action-link-' . $type,
801
+				$type,
802
+				$message,
803
+				$query_params
804
+			)
805
+		);
806
+
807
+		return '<a href="' . $url . '"' . $title . '><span class="' . esc_attr($icon_css['css_class']) . '"></span></a>';
808
+	}
809
+
810
+
811
+
812
+
813
+
814
+	/**
815
+	 * This returns an array with keys as reg statuses and values as the corresponding message type slug (filtered).
816
+	 *
817
+	 * @since 4.9.0
818
+	 * @return array
819
+	 */
820
+	public static function reg_status_to_message_type_array()
821
+	{
822
+		return (array) apply_filters(
823
+			'FHEE__EEH_MSG_Template__reg_status_to_message_type_array',
824
+			array(
825
+				EEM_Registration::status_id_approved => 'registration',
826
+				EEM_Registration::status_id_pending_payment => 'pending_approval',
827
+				EEM_Registration::status_id_not_approved => 'not_approved_registration',
828
+				EEM_Registration::status_id_cancelled => 'cancelled_registration',
829
+				EEM_Registration::status_id_declined => 'declined_registration'
830
+			)
831
+		);
832
+	}
833
+
834
+
835
+
836
+
837
+	/**
838
+	 * This returns the corresponding registration message type slug to the given reg status. If there isn't a
839
+	 * match, then returns an empty string.
840
+	 *
841
+	 * @since 4.9.0
842
+	 * @param $reg_status
843
+	 * @return string
844
+	 */
845
+	public static function convert_reg_status_to_message_type($reg_status)
846
+	{
847
+		$reg_status_array = self::reg_status_to_message_type_array();
848
+		return isset($reg_status_array[ $reg_status ]) ? $reg_status_array[ $reg_status ] : '';
849
+	}
850
+
851
+
852
+	/**
853
+	 * This returns an array with keys as payment stati and values as the corresponding message type slug (filtered).
854
+	 *
855
+	 * @since 4.9.0
856
+	 * @return array
857
+	 */
858
+	public static function payment_status_to_message_type_array()
859
+	{
860
+		return (array) apply_filters(
861
+			'FHEE__EEH_MSG_Template__payment_status_to_message_type_array',
862
+			array(
863
+				EEM_Payment::status_id_approved => 'payment',
864
+				EEM_Payment::status_id_pending => 'payment_pending',
865
+				EEM_Payment::status_id_cancelled => 'payment_cancelled',
866
+				EEM_Payment::status_id_declined => 'payment_declined',
867
+				EEM_Payment::status_id_failed => 'payment_failed'
868
+			)
869
+		);
870
+	}
871
+
872
+
873
+
874
+
875
+	/**
876
+	 * This returns the corresponding payment message type slug to the given payment status. If there isn't a match then
877
+	 * an empty string is returned
878
+	 *
879
+	 * @since 4.9.0
880
+	 * @param $payment_status
881
+	 * @return string
882
+	 */
883
+	public static function convert_payment_status_to_message_type($payment_status)
884
+	{
885
+		$payment_status_array = self::payment_status_to_message_type_array();
886
+		return isset($payment_status_array[ $payment_status ]) ? $payment_status_array[ $payment_status ] : '';
887
+	}
888
+
889
+
890
+	/**
891
+	 * This is used to retrieve the template pack for the given name.
892
+	 *
893
+	 * @param string $template_pack_name  should match the set `dbref` property value on the EE_Messages_Template_Pack.
894
+	 *
895
+	 * @return EE_Messages_Template_Pack
896
+	 */
897
+	public static function get_template_pack($template_pack_name)
898
+	{
899
+		if (! self::$_template_pack_collection instanceof EE_Object_Collection) {
900
+			self::$_template_pack_collection = new EE_Messages_Template_Pack_Collection();
901
+		}
902
+
903
+		// first see if in collection already
904
+		$template_pack = self::$_template_pack_collection->get_by_name($template_pack_name);
905
+
906
+		if ($template_pack instanceof EE_Messages_Template_Pack) {
907
+			return $template_pack;
908
+		}
909
+
910
+		// nope...let's get it.
911
+		// not set yet so let's attempt to get it.
912
+		$pack_class_name = 'EE_Messages_Template_Pack_' . str_replace(
913
+			' ',
914
+			'_',
915
+			ucwords(
916
+				str_replace('_', ' ', $template_pack_name)
917
+			)
918
+		);
919
+		if (! class_exists($pack_class_name) && $template_pack_name !== 'default') {
920
+			return self::get_template_pack('default');
921
+		} else {
922
+			$template_pack = new $pack_class_name;
923
+			self::$_template_pack_collection->add($template_pack);
924
+			return $template_pack;
925
+		}
926
+	}
927
+
928
+
929
+
930
+
931
+	/**
932
+	 * Globs template packs installed in core and returns the template pack collection with all installed template packs
933
+	 * in it.
934
+	 *
935
+	 * @since 4.9.0
936
+	 *
937
+	 * @return EE_Messages_Template_Pack_Collection
938
+	 */
939
+	public static function get_template_pack_collection()
940
+	{
941
+		$new_collection = false;
942
+		if (! self::$_template_pack_collection instanceof EE_Messages_Template_Pack_Collection) {
943
+			self::$_template_pack_collection = new EE_Messages_Template_Pack_Collection();
944
+			$new_collection = true;
945
+		}
946
+
947
+		// glob the defaults directory for messages
948
+		$templates = glob(EE_LIBRARIES . 'messages/defaults/*', GLOB_ONLYDIR);
949
+		foreach ($templates as $template_path) {
950
+			// grab folder name
951
+			$template = basename($template_path);
952
+
953
+			if (! $new_collection) {
954
+				// already have it?
955
+				if (self::$_template_pack_collection->get_by_name($template) instanceof EE_Messages_Template_Pack) {
956
+					continue;
957
+				}
958
+			}
959
+
960
+			// setup classname.
961
+			$template_pack_class_name = 'EE_Messages_Template_Pack_' . str_replace(
962
+				' ',
963
+				'_',
964
+				ucwords(
965
+					str_replace(
966
+						'_',
967
+						' ',
968
+						$template
969
+					)
970
+				)
971
+			);
972
+			if (! class_exists($template_pack_class_name)) {
973
+				continue;
974
+			}
975
+			self::$_template_pack_collection->add(new $template_pack_class_name);
976
+		}
977
+
978
+		/**
979
+		 * Filter for plugins to add in any additional template packs
980
+		 * Note the filter name here is for backward compat, this used to be found in EED_Messages.
981
+		 */
982
+		$additional_template_packs = apply_filters('FHEE__EED_Messages__get_template_packs__template_packs', array());
983
+		foreach ((array) $additional_template_packs as $template_pack) {
984
+			if (self::$_template_pack_collection->get_by_name(
985
+				$template_pack->dbref
986
+			) instanceof EE_Messages_Template_Pack
987
+			) {
988
+				continue;
989
+			}
990
+			self::$_template_pack_collection->add($template_pack);
991
+		}
992
+		return self::$_template_pack_collection;
993
+	}
994
+
995
+
996
+
997
+	/**
998
+	 * This is a wrapper for the protected _create_new_templates function
999
+	 *
1000
+	 * @param string $messenger_name
1001
+	 * @param string $message_type_name message type that the templates are being created for
1002
+	 * @param int    $GRP_ID
1003
+	 * @param bool   $global
1004
+	 * @return array
1005
+	 * @throws \EE_Error
1006
+	 */
1007
+	public static function create_new_templates($messenger_name, $message_type_name, $GRP_ID = 0, $global = false)
1008
+	{
1009
+		/** @type EE_Message_Resource_Manager $Message_Resource_Manager */
1010
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1011
+		$messenger = $Message_Resource_Manager->valid_messenger($messenger_name);
1012
+		$message_type = $Message_Resource_Manager->valid_message_type($message_type_name);
1013
+		if (! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type, $global)) {
1014
+			return array();
1015
+		}
1016
+		// whew made it this far!  Okay, let's go ahead and create the templates then
1017
+		return EEH_MSG_Template::_create_new_templates($messenger, $message_type, $GRP_ID, $global);
1018
+	}
1019
+
1020
+
1021
+
1022
+	/**
1023
+	 * @param \EE_messenger    $messenger
1024
+	 * @param \EE_message_type $message_type
1025
+	 * @param                  $GRP_ID
1026
+	 * @param                  $global
1027
+	 * @return array|mixed
1028
+	 */
1029
+	protected static function _create_new_templates(EE_messenger $messenger, EE_message_type $message_type, $GRP_ID, $global)
1030
+	{
1031
+		// if we're creating a custom template then we don't need to use the defaults class
1032
+		if (! $global) {
1033
+			return EEH_MSG_Template::_create_custom_template_group($messenger, $message_type, $GRP_ID);
1034
+		}
1035
+		/** @type EE_Messages_Template_Defaults $Message_Template_Defaults */
1036
+		$Message_Template_Defaults = EE_Registry::factory(
1037
+			'EE_Messages_Template_Defaults',
1038
+			array( $messenger, $message_type, $GRP_ID )
1039
+		);
1040
+		// generate templates
1041
+		$success = $Message_Template_Defaults->create_new_templates();
1042
+
1043
+		// if creating the template failed.  Then we should deactivate the related message_type for the messenger because
1044
+		// its not active if it doesn't have a template.  Note this is only happening for GLOBAL template creation
1045
+		// attempts.
1046
+		if (! $success) {
1047
+			/** @var EE_Message_Resource_Manager $message_resource_manager */
1048
+			$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1049
+			$message_resource_manager->deactivate_message_type_for_messenger($message_type->name, $messenger->name);
1050
+		}
1051
+
1052
+		/**
1053
+		 * $success is in an array in the following format
1054
+		 * array(
1055
+		 *    'GRP_ID' => $new_grp_id,
1056
+		 *    'MTP_context' => $first_context_in_new_templates,
1057
+		 * )
1058
+		 */
1059
+		return $success;
1060
+	}
1061
+
1062
+
1063
+
1064
+	/**
1065
+	 * This creates a custom template using the incoming GRP_ID
1066
+	 *
1067
+	 * @param \EE_messenger    $messenger
1068
+	 * @param \EE_message_type $message_type
1069
+	 * @param  int             $GRP_ID      GRP_ID for the template_group being used as the base
1070
+	 * @return  array $success              This will be an array in the format:
1071
+	 *                                      array(
1072
+	 *                                          'GRP_ID' => $new_grp_id,
1073
+	 *                                          'MTP_context' => $first_context_in_created_template
1074
+	 *                                      )
1075
+	 * @access private
1076
+	 */
1077
+	private static function _create_custom_template_group(EE_messenger $messenger, EE_message_type $message_type, $GRP_ID)
1078
+	{
1079
+		// defaults
1080
+		$success = array( 'GRP_ID' => null, 'MTP_context' => '' );
1081
+		// get the template group to use as a template from the db.  If $GRP_ID is empty then we'll assume the base will be the global template matching the messenger and message type.
1082
+		$Message_Template_Group = empty($GRP_ID)
1083
+			? EEM_Message_Template_Group::instance()->get_one(
1084
+				array(
1085
+					array(
1086
+						'MTP_messenger'    => $messenger->name,
1087
+						'MTP_message_type' => $message_type->name,
1088
+						'MTP_is_global'    => true
1089
+					)
1090
+				)
1091
+			)
1092
+			: EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1093
+		// if we don't have a mtg at this point then we need to bail.
1094
+		if (! $Message_Template_Group instanceof EE_Message_Template_Group) {
1095
+			EE_Error::add_error(
1096
+				sprintf(
1097
+					__(
1098
+						'Something went wrong with generating the custom template from this group id: %s.  This usually happens when there is no matching message template group in the db.',
1099
+						'event_espresso'
1100
+					),
1101
+					$GRP_ID
1102
+				),
1103
+				__FILE__,
1104
+				__FUNCTION__,
1105
+				__LINE__
1106
+			);
1107
+			return $success;
1108
+		}
1109
+		// let's get all the related message_template objects for this group.
1110
+		$message_templates = $Message_Template_Group->message_templates();
1111
+		// now we have what we need to setup the new template
1112
+		$new_mtg = clone $Message_Template_Group;
1113
+		$new_mtg->set('GRP_ID', 0);
1114
+		$new_mtg->set('MTP_is_global', false);
1115
+		$template_name = defined('DOING_AJAX') && ! empty($_POST['templateName'])
1116
+			? $_POST['templateName']
1117
+			: __(
1118
+				'New Custom Template',
1119
+				'event_espresso'
1120
+			);
1121
+		$template_description = defined("DOING_AJAX") && ! empty($_POST['templateDescription'])
1122
+			? $_POST['templateDescription']
1123
+			: sprintf(
1124
+				__(
1125
+					'This is a custom template that was created for the %s messenger and %s message type.',
1126
+					'event_espresso'
1127
+				),
1128
+				$new_mtg->messenger_obj()->label['singular'],
1129
+				$new_mtg->message_type_obj()->label['singular']
1130
+			);
1131
+		$new_mtg->set('MTP_name', $template_name);
1132
+		$new_mtg->set('MTP_description', $template_description);
1133
+		// remove ALL relations on this template group so they don't get saved!
1134
+		$new_mtg->_remove_relations('Message_Template');
1135
+		$new_mtg->save();
1136
+		$success['GRP_ID'] = $new_mtg->ID();
1137
+		$success['template_name'] = $template_name;
1138
+		// add new message templates and add relation to.
1139
+		foreach ($message_templates as $message_template) {
1140
+			if (! $message_template instanceof EE_Message_Template) {
1141
+				continue;
1142
+			}
1143
+			$new_message_template = clone $message_template;
1144
+			$new_message_template->set('MTP_ID', 0);
1145
+			$new_message_template->set('GRP_ID', $new_mtg->ID()); // relation
1146
+			$new_message_template->save();
1147
+			if (empty($success['MTP_context'])) {
1148
+				$success['MTP_context'] = $new_message_template->get('MTP_context');
1149
+			}
1150
+		}
1151
+		return $success;
1152
+	}
1153
+
1154
+
1155
+
1156
+	/**
1157
+	 * message_type_has_active_templates_for_messenger
1158
+	 *
1159
+	 * @param \EE_messenger    $messenger
1160
+	 * @param \EE_message_type $message_type
1161
+	 * @param bool             $global
1162
+	 * @return bool
1163
+	 */
1164
+	public static function message_type_has_active_templates_for_messenger(
1165
+		EE_messenger $messenger,
1166
+		EE_message_type $message_type,
1167
+		$global = false
1168
+	) {
1169
+		// is given message_type valid for given messenger (if this is not a global save)
1170
+		if ($global) {
1171
+			return true;
1172
+		}
1173
+		$active_templates = EEM_Message_Template_Group::instance()->count(
1174
+			array(
1175
+				array(
1176
+					'MTP_is_active'    => true,
1177
+					'MTP_messenger'    => $messenger->name,
1178
+					'MTP_message_type' => $message_type->name
1179
+				)
1180
+			)
1181
+		);
1182
+		if ($active_templates > 0) {
1183
+			return true;
1184
+		}
1185
+		EE_Error::add_error(
1186
+			sprintf(
1187
+				__(
1188
+					'The %1$s message type is not registered with the %2$s messenger. Please visit the Messenger activation page to assign this message type first if you want to use it.',
1189
+					'event_espresso'
1190
+				),
1191
+				$message_type->name,
1192
+				$messenger->name
1193
+			),
1194
+			__FILE__,
1195
+			__FUNCTION__,
1196
+			__LINE__
1197
+		);
1198
+		return false;
1199
+	}
1200
+
1201
+
1202
+
1203
+	/**
1204
+	 * get_fields
1205
+	 * This takes a given messenger and message type and returns all the template fields indexed by context (and with field type).
1206
+	 *
1207
+	 * @param  string $messenger_name    name of EE_messenger
1208
+	 * @param  string $message_type_name name of EE_message_type
1209
+	 * @return array
1210
+	 */
1211
+	public static function get_fields($messenger_name, $message_type_name)
1212
+	{
1213
+		$template_fields = array();
1214
+		/** @type EE_Message_Resource_Manager $Message_Resource_Manager */
1215
+		$Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1216
+		$messenger = $Message_Resource_Manager->valid_messenger($messenger_name);
1217
+		$message_type = $Message_Resource_Manager->valid_message_type($message_type_name);
1218
+		if (! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type)) {
1219
+			return array();
1220
+		}
1221
+
1222
+		$excluded_fields_for_messenger = $message_type->excludedFieldsForMessenger($messenger_name);
1223
+
1224
+		// okay now let's assemble an array with the messenger template fields added to the message_type contexts.
1225
+		foreach ($message_type->get_contexts() as $context => $details) {
1226
+			foreach ($messenger->get_template_fields() as $field => $value) {
1227
+				if (in_array($field, $excluded_fields_for_messenger, true)) {
1228
+					continue;
1229
+				}
1230
+				$template_fields[ $context ][ $field ] = $value;
1231
+			}
1232
+		}
1233
+		if (empty($template_fields)) {
1234
+			EE_Error::add_error(
1235
+				__('Something went wrong and we couldn\'t get any templates assembled', 'event_espresso'),
1236
+				__FILE__,
1237
+				__FUNCTION__,
1238
+				__LINE__
1239
+			);
1240
+			return array();
1241
+		}
1242
+		return $template_fields;
1243
+	}
1244 1244
 }
Please login to merge, or discard this patch.
Spacing   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -88,7 +88,7 @@  discard block
 block discarded – undo
88 88
             }
89 89
             $new_message_template_group = EEH_MSG_Template::create_new_templates($messenger, $message_type, $GRP_ID, $global);
90 90
 
91
-            if (! $new_message_template_group) {
91
+            if ( ! $new_message_template_group) {
92 92
                 continue;
93 93
             }
94 94
             $templates[] = $new_message_template_group;
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
                     )
120 120
                 )
121 121
             )
122
-            : EEM_Message_Template::instance()->count(array( array( 'GRP_ID' => $GRP_ID ) ));
122
+            : EEM_Message_Template::instance()->count(array(array('GRP_ID' => $GRP_ID)));
123 123
 
124 124
         return $count > 0;
125 125
     }
@@ -137,14 +137,14 @@  discard block
 block discarded – undo
137 137
      */
138 138
     public static function update_to_active($messenger_names, $message_type_names)
139 139
     {
140
-        $messenger_names = is_array($messenger_names) ? $messenger_names : array( $messenger_names );
141
-        $message_type_names = is_array($message_type_names) ? $message_type_names : array( $message_type_names );
140
+        $messenger_names = is_array($messenger_names) ? $messenger_names : array($messenger_names);
141
+        $message_type_names = is_array($message_type_names) ? $message_type_names : array($message_type_names);
142 142
         return EEM_Message_Template_Group::instance()->update(
143
-            array( 'MTP_is_active' => 1 ),
143
+            array('MTP_is_active' => 1),
144 144
             array(
145 145
                 array(
146
-                    'MTP_messenger'     => array( 'IN', $messenger_names ),
147
-                    'MTP_message_type'  => array( 'IN', $message_type_names )
146
+                    'MTP_messenger'     => array('IN', $messenger_names),
147
+                    'MTP_message_type'  => array('IN', $message_type_names)
148 148
                 )
149 149
             )
150 150
         );
@@ -230,13 +230,13 @@  discard block
 block discarded – undo
230 230
         $messenger = $message_resource_manager->get_messenger($messenger);
231 231
 
232 232
         // if messenger isn't a EE_messenger resource then bail.
233
-        if (! $messenger instanceof EE_messenger) {
233
+        if ( ! $messenger instanceof EE_messenger) {
234 234
             return array();
235 235
         }
236 236
 
237 237
         // validate class for getting our list of shortcodes
238
-        $classname = 'EE_Messages_' . $messenger_name . '_' . $mt_name . '_Validator';
239
-        if (! class_exists($classname)) {
238
+        $classname = 'EE_Messages_'.$messenger_name.'_'.$mt_name.'_Validator';
239
+        if ( ! class_exists($classname)) {
240 240
             $msg[] = __('The Validator class was unable to load', 'event_espresso');
241 241
             $msg[] = sprintf(
242 242
                 __('The class name compiled was %s. Please check and make sure the spelling and case is correct for the class name and that there is an autoloader in place for this class', 'event_espresso'),
@@ -252,44 +252,44 @@  discard block
 block discarded – undo
252 252
         // let's make sure we're only getting the shortcode part of the validators
253 253
         $shortcodes = array();
254 254
         foreach ($valid_shortcodes as $field => $validators) {
255
-            $shortcodes[ $field ] = $validators['shortcodes'];
255
+            $shortcodes[$field] = $validators['shortcodes'];
256 256
         }
257 257
         $valid_shortcodes = $shortcodes;
258 258
 
259 259
         // if not all fields let's make sure we ONLY include the shortcodes for the specified fields.
260
-        if (! empty($fields)) {
260
+        if ( ! empty($fields)) {
261 261
             $specified_shortcodes = array();
262 262
             foreach ($fields as $field) {
263
-                if (isset($valid_shortcodes[ $field ])) {
264
-                    $specified_shortcodes[ $field ] = $valid_shortcodes[ $field ];
263
+                if (isset($valid_shortcodes[$field])) {
264
+                    $specified_shortcodes[$field] = $valid_shortcodes[$field];
265 265
                 }
266 266
             }
267 267
             $valid_shortcodes = $specified_shortcodes;
268 268
         }
269 269
 
270 270
         // if not merged then let's replace the fields with the localized fields
271
-        if (! $merged) {
271
+        if ( ! $merged) {
272 272
             // let's get all the fields for the set messenger so that we can get the localized label and use that in the returned array.
273 273
             $field_settings = $messenger->get_template_fields();
274 274
             $localized = array();
275 275
             foreach ($valid_shortcodes as $field => $shortcodes) {
276 276
                 // get localized field label
277
-                if (isset($field_settings[ $field ])) {
277
+                if (isset($field_settings[$field])) {
278 278
                     // possible that this is used as a main field.
279
-                    if (empty($field_settings[ $field ])) {
280
-                        if (isset($field_settings['extra'][ $field ])) {
281
-                            $_field = $field_settings['extra'][ $field ]['main']['label'];
279
+                    if (empty($field_settings[$field])) {
280
+                        if (isset($field_settings['extra'][$field])) {
281
+                            $_field = $field_settings['extra'][$field]['main']['label'];
282 282
                         } else {
283 283
                             $_field = $field;
284 284
                         }
285 285
                     } else {
286
-                        $_field = $field_settings[ $field ]['label'];
286
+                        $_field = $field_settings[$field]['label'];
287 287
                     }
288 288
                 } elseif (isset($field_settings['extra'])) {
289 289
                     // loop through extra "main fields" and see if any of their children have our field
290 290
                     foreach ($field_settings['extra'] as $main_field => $fields) {
291
-                        if (isset($fields[ $field ])) {
292
-                            $_field = $fields[ $field ]['label'];
291
+                        if (isset($fields[$field])) {
292
+                            $_field = $fields[$field]['label'];
293 293
                         } else {
294 294
                             $_field = $field;
295 295
                         }
@@ -298,7 +298,7 @@  discard block
 block discarded – undo
298 298
                     $_field = $field;
299 299
                 }
300 300
                 if (isset($_field)) {
301
-                    $localized[ (string) $_field ] = $shortcodes;
301
+                    $localized[(string) $_field] = $shortcodes;
302 302
                 }
303 303
             }
304 304
             $valid_shortcodes = $localized;
@@ -309,10 +309,10 @@  discard block
 block discarded – undo
309 309
             $merged_codes = array();
310 310
             foreach ($valid_shortcodes as $field => $shortcode) {
311 311
                 foreach ($shortcode as $code => $label) {
312
-                    if (isset($merged_codes[ $code ])) {
312
+                    if (isset($merged_codes[$code])) {
313 313
                         continue;
314 314
                     } else {
315
-                        $merged_codes[ $code ] = $label;
315
+                        $merged_codes[$code] = $label;
316 316
                     }
317 317
                 }
318 318
             }
@@ -462,12 +462,12 @@  discard block
 block discarded – undo
462 462
         $sending_messenger = ''
463 463
     ) {
464 464
         // first determine if the url can be to the EE_Message object.
465
-        if (! $message_type->always_generate()) {
465
+        if ( ! $message_type->always_generate()) {
466 466
             return EEH_MSG_Template::generate_browser_trigger($message);
467 467
         }
468 468
 
469 469
         // if $registration object is not valid then exit early because there's nothing that can be generated.
470
-        if (! $registration instanceof EE_Registration) {
470
+        if ( ! $registration instanceof EE_Registration) {
471 471
             throw new EE_Error(
472 472
                 __('Incoming value for registration is not a valid EE_Registration object.', 'event_espresso')
473 473
             );
@@ -475,7 +475,7 @@  discard block
 block discarded – undo
475 475
 
476 476
         // validate given context
477 477
         $contexts = $message_type->get_contexts();
478
-        if ($message->context() !== '' && ! isset($contexts[ $message->context() ])) {
478
+        if ($message->context() !== '' && ! isset($contexts[$message->context()])) {
479 479
             throw new EE_Error(
480 480
                 sprintf(
481 481
                     __('The context %s is not a valid context for %s.', 'event_espresso'),
@@ -486,10 +486,10 @@  discard block
 block discarded – undo
486 486
         }
487 487
 
488 488
         // valid sending messenger but only if sending messenger set.  Otherwise generating messenger is used.
489
-        if (! empty($sending_messenger)) {
489
+        if ( ! empty($sending_messenger)) {
490 490
             $with_messengers = $message_type->with_messengers();
491
-            if (! isset($with_messengers[ $message->messenger() ])
492
-                 || ! in_array($sending_messenger, $with_messengers[ $message->messenger() ]) ) {
491
+            if ( ! isset($with_messengers[$message->messenger()])
492
+                 || ! in_array($sending_messenger, $with_messengers[$message->messenger()])) {
493 493
                 throw new EE_Error(
494 494
                     sprintf(
495 495
                         __(
@@ -625,7 +625,7 @@  discard block
 block discarded – undo
625 625
     public static function get_message_action_icon($type)
626 626
     {
627 627
         $action_icons = self::get_message_action_icons();
628
-        return isset($action_icons[ $type ]) ? $action_icons[ $type ] : '';
628
+        return isset($action_icons[$type]) ? $action_icons[$type] : '';
629 629
     }
630 630
 
631 631
 
@@ -688,7 +688,7 @@  discard block
 block discarded – undo
688 688
     public static function get_message_action_url($type, EE_Message $message = null, $query_params = array())
689 689
     {
690 690
         $action_urls = self::get_message_action_urls($message, $query_params);
691
-        return isset($action_urls[ $type ])  ? $action_urls[ $type ] : '';
691
+        return isset($action_urls[$type]) ? $action_urls[$type] : '';
692 692
     }
693 693
 
694 694
 
@@ -708,7 +708,7 @@  discard block
 block discarded – undo
708 708
         EE_Registry::instance()->load_helper('URL');
709 709
         // if $message is not an instance of EE_Message then let's just do a dummy.
710 710
         $message = empty($message) ? EE_Message_Factory::create() : $message;
711
-        $action_urls =  apply_filters(
711
+        $action_urls = apply_filters(
712 712
             'FHEE__EEH_MSG_Template__get_message_action_url',
713 713
             array(
714 714
                 'view' => EEH_MSG_Template::generate_browser_trigger($message),
@@ -788,7 +788,7 @@  discard block
 block discarded – undo
788 788
     {
789 789
         $url = EEH_MSG_Template::get_message_action_url($type, $message, $query_params);
790 790
         $icon_css = EEH_MSG_Template::get_message_action_icon($type);
791
-        $title = isset($icon_css['label']) ? 'title="' . $icon_css['label'] . '"' : '';
791
+        $title = isset($icon_css['label']) ? 'title="'.$icon_css['label'].'"' : '';
792 792
 
793 793
         if (empty($url) || empty($icon_css) || ! isset($icon_css['css_class'])) {
794 794
             return '';
@@ -797,14 +797,14 @@  discard block
 block discarded – undo
797 797
         $icon_css['css_class'] .= esc_attr(
798 798
             apply_filters(
799 799
                 'FHEE__EEH_MSG_Template__get_message_action_link__icon_css_class',
800
-                ' js-ee-message-action-link ee-message-action-link-' . $type,
800
+                ' js-ee-message-action-link ee-message-action-link-'.$type,
801 801
                 $type,
802 802
                 $message,
803 803
                 $query_params
804 804
             )
805 805
         );
806 806
 
807
-        return '<a href="' . $url . '"' . $title . '><span class="' . esc_attr($icon_css['css_class']) . '"></span></a>';
807
+        return '<a href="'.$url.'"'.$title.'><span class="'.esc_attr($icon_css['css_class']).'"></span></a>';
808 808
     }
809 809
 
810 810
 
@@ -845,7 +845,7 @@  discard block
 block discarded – undo
845 845
     public static function convert_reg_status_to_message_type($reg_status)
846 846
     {
847 847
         $reg_status_array = self::reg_status_to_message_type_array();
848
-        return isset($reg_status_array[ $reg_status ]) ? $reg_status_array[ $reg_status ] : '';
848
+        return isset($reg_status_array[$reg_status]) ? $reg_status_array[$reg_status] : '';
849 849
     }
850 850
 
851 851
 
@@ -883,7 +883,7 @@  discard block
 block discarded – undo
883 883
     public static function convert_payment_status_to_message_type($payment_status)
884 884
     {
885 885
         $payment_status_array = self::payment_status_to_message_type_array();
886
-        return isset($payment_status_array[ $payment_status ]) ? $payment_status_array[ $payment_status ] : '';
886
+        return isset($payment_status_array[$payment_status]) ? $payment_status_array[$payment_status] : '';
887 887
     }
888 888
 
889 889
 
@@ -896,7 +896,7 @@  discard block
 block discarded – undo
896 896
      */
897 897
     public static function get_template_pack($template_pack_name)
898 898
     {
899
-        if (! self::$_template_pack_collection instanceof EE_Object_Collection) {
899
+        if ( ! self::$_template_pack_collection instanceof EE_Object_Collection) {
900 900
             self::$_template_pack_collection = new EE_Messages_Template_Pack_Collection();
901 901
         }
902 902
 
@@ -909,14 +909,14 @@  discard block
 block discarded – undo
909 909
 
910 910
         // nope...let's get it.
911 911
         // not set yet so let's attempt to get it.
912
-        $pack_class_name = 'EE_Messages_Template_Pack_' . str_replace(
912
+        $pack_class_name = 'EE_Messages_Template_Pack_'.str_replace(
913 913
             ' ',
914 914
             '_',
915 915
             ucwords(
916 916
                 str_replace('_', ' ', $template_pack_name)
917 917
             )
918 918
         );
919
-        if (! class_exists($pack_class_name) && $template_pack_name !== 'default') {
919
+        if ( ! class_exists($pack_class_name) && $template_pack_name !== 'default') {
920 920
             return self::get_template_pack('default');
921 921
         } else {
922 922
             $template_pack = new $pack_class_name;
@@ -939,18 +939,18 @@  discard block
 block discarded – undo
939 939
     public static function get_template_pack_collection()
940 940
     {
941 941
         $new_collection = false;
942
-        if (! self::$_template_pack_collection instanceof EE_Messages_Template_Pack_Collection) {
942
+        if ( ! self::$_template_pack_collection instanceof EE_Messages_Template_Pack_Collection) {
943 943
             self::$_template_pack_collection = new EE_Messages_Template_Pack_Collection();
944 944
             $new_collection = true;
945 945
         }
946 946
 
947 947
         // glob the defaults directory for messages
948
-        $templates = glob(EE_LIBRARIES . 'messages/defaults/*', GLOB_ONLYDIR);
948
+        $templates = glob(EE_LIBRARIES.'messages/defaults/*', GLOB_ONLYDIR);
949 949
         foreach ($templates as $template_path) {
950 950
             // grab folder name
951 951
             $template = basename($template_path);
952 952
 
953
-            if (! $new_collection) {
953
+            if ( ! $new_collection) {
954 954
                 // already have it?
955 955
                 if (self::$_template_pack_collection->get_by_name($template) instanceof EE_Messages_Template_Pack) {
956 956
                     continue;
@@ -958,7 +958,7 @@  discard block
 block discarded – undo
958 958
             }
959 959
 
960 960
             // setup classname.
961
-            $template_pack_class_name = 'EE_Messages_Template_Pack_' . str_replace(
961
+            $template_pack_class_name = 'EE_Messages_Template_Pack_'.str_replace(
962 962
                 ' ',
963 963
                 '_',
964 964
                 ucwords(
@@ -969,7 +969,7 @@  discard block
 block discarded – undo
969 969
                     )
970 970
                 )
971 971
             );
972
-            if (! class_exists($template_pack_class_name)) {
972
+            if ( ! class_exists($template_pack_class_name)) {
973 973
                 continue;
974 974
             }
975 975
             self::$_template_pack_collection->add(new $template_pack_class_name);
@@ -1010,7 +1010,7 @@  discard block
 block discarded – undo
1010 1010
         $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1011 1011
         $messenger = $Message_Resource_Manager->valid_messenger($messenger_name);
1012 1012
         $message_type = $Message_Resource_Manager->valid_message_type($message_type_name);
1013
-        if (! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type, $global)) {
1013
+        if ( ! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type, $global)) {
1014 1014
             return array();
1015 1015
         }
1016 1016
         // whew made it this far!  Okay, let's go ahead and create the templates then
@@ -1029,13 +1029,13 @@  discard block
 block discarded – undo
1029 1029
     protected static function _create_new_templates(EE_messenger $messenger, EE_message_type $message_type, $GRP_ID, $global)
1030 1030
     {
1031 1031
         // if we're creating a custom template then we don't need to use the defaults class
1032
-        if (! $global) {
1032
+        if ( ! $global) {
1033 1033
             return EEH_MSG_Template::_create_custom_template_group($messenger, $message_type, $GRP_ID);
1034 1034
         }
1035 1035
         /** @type EE_Messages_Template_Defaults $Message_Template_Defaults */
1036 1036
         $Message_Template_Defaults = EE_Registry::factory(
1037 1037
             'EE_Messages_Template_Defaults',
1038
-            array( $messenger, $message_type, $GRP_ID )
1038
+            array($messenger, $message_type, $GRP_ID)
1039 1039
         );
1040 1040
         // generate templates
1041 1041
         $success = $Message_Template_Defaults->create_new_templates();
@@ -1043,7 +1043,7 @@  discard block
 block discarded – undo
1043 1043
         // if creating the template failed.  Then we should deactivate the related message_type for the messenger because
1044 1044
         // its not active if it doesn't have a template.  Note this is only happening for GLOBAL template creation
1045 1045
         // attempts.
1046
-        if (! $success) {
1046
+        if ( ! $success) {
1047 1047
             /** @var EE_Message_Resource_Manager $message_resource_manager */
1048 1048
             $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1049 1049
             $message_resource_manager->deactivate_message_type_for_messenger($message_type->name, $messenger->name);
@@ -1077,7 +1077,7 @@  discard block
 block discarded – undo
1077 1077
     private static function _create_custom_template_group(EE_messenger $messenger, EE_message_type $message_type, $GRP_ID)
1078 1078
     {
1079 1079
         // defaults
1080
-        $success = array( 'GRP_ID' => null, 'MTP_context' => '' );
1080
+        $success = array('GRP_ID' => null, 'MTP_context' => '');
1081 1081
         // get the template group to use as a template from the db.  If $GRP_ID is empty then we'll assume the base will be the global template matching the messenger and message type.
1082 1082
         $Message_Template_Group = empty($GRP_ID)
1083 1083
             ? EEM_Message_Template_Group::instance()->get_one(
@@ -1091,7 +1091,7 @@  discard block
 block discarded – undo
1091 1091
             )
1092 1092
             : EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1093 1093
         // if we don't have a mtg at this point then we need to bail.
1094
-        if (! $Message_Template_Group instanceof EE_Message_Template_Group) {
1094
+        if ( ! $Message_Template_Group instanceof EE_Message_Template_Group) {
1095 1095
             EE_Error::add_error(
1096 1096
                 sprintf(
1097 1097
                     __(
@@ -1137,7 +1137,7 @@  discard block
 block discarded – undo
1137 1137
         $success['template_name'] = $template_name;
1138 1138
         // add new message templates and add relation to.
1139 1139
         foreach ($message_templates as $message_template) {
1140
-            if (! $message_template instanceof EE_Message_Template) {
1140
+            if ( ! $message_template instanceof EE_Message_Template) {
1141 1141
                 continue;
1142 1142
             }
1143 1143
             $new_message_template = clone $message_template;
@@ -1215,7 +1215,7 @@  discard block
 block discarded – undo
1215 1215
         $Message_Resource_Manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1216 1216
         $messenger = $Message_Resource_Manager->valid_messenger($messenger_name);
1217 1217
         $message_type = $Message_Resource_Manager->valid_message_type($message_type_name);
1218
-        if (! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type)) {
1218
+        if ( ! EEH_MSG_Template::message_type_has_active_templates_for_messenger($messenger, $message_type)) {
1219 1219
             return array();
1220 1220
         }
1221 1221
 
@@ -1227,7 +1227,7 @@  discard block
 block discarded – undo
1227 1227
                 if (in_array($field, $excluded_fields_for_messenger, true)) {
1228 1228
                     continue;
1229 1229
                 }
1230
-                $template_fields[ $context ][ $field ] = $value;
1230
+                $template_fields[$context][$field] = $value;
1231 1231
             }
1232 1232
         }
1233 1233
         if (empty($template_fields)) {
Please login to merge, or discard this patch.