Completed
Branch dependabot/npm_and_yarn/mini-c... (d1a1c5)
by
unknown
80:43 queued 72:47
created

Messages_Admin_Page   F

Complexity

Total Complexity 464

Size/Duplication

Total Lines 4553
Duplicated Lines 7.58 %

Coupling/Cohesion

Components 3
Dependencies 30

Importance

Changes 0
Metric Value
wmc 464
lcom 3
cbo 30
dl 345
loc 4553
rs 0.8
c 0
b 0
f 0

101 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A _init_page_props() 0 13 3
A _load_message_resource_manager() 0 4 1
A get_messengers_for_list_table() 28 28 3
A get_message_types_for_list_table() 27 27 3
A get_contexts_for_message_types_for_list_table() 0 30 5
A get_messengers_select_input() 28 28 5
A get_message_types_select_input() 28 28 5
A get_contexts_for_message_types_select_input() 28 28 5
A _ajax_hooks() 0 9 1
A _define_page_props() 0 12 1
B _set_page_routes() 0 142 7
B _set_page_config() 0 144 1
A _add_screen_options() 0 4 1
A _add_screen_options_default() 0 5 1
A _add_feature_pointers() 0 3 1
A admin_init() 0 3 1
A admin_notices() 0 3 1
A admin_footer_scripts() 0 3 1
A messages_help_tab() 0 4 1
A messengers_help_tab() 0 4 1
A message_types_help_tab() 0 4 1
A messages_overview_help_tab() 0 4 1
A message_templates_help_tab() 0 4 1
A edit_message_template_help_tab() 0 22 1
A message_template_shortcodes_help_tab() 0 9 1
A preview_message_help_tab() 0 4 1
A settings_help_tab() 0 18 1
A load_scripts_styles_default() 0 4 1
A wp_editor_css() 0 19 3
A load_scripts_styles_edit_message_template() 0 35 1
A load_scripts_styles_display_preview_message() 0 25 3
A load_scripts_styles_settings() 0 12 1
A _set_list_table_views_global_mtps() 0 10 1
A _set_list_table_views_custom_mtps() 0 7 1
C _set_list_table_views_default() 0 77 16
A _ee_default_messages_overview_list_table() 0 5 1
A _message_queue_list_table() 0 10 1
B _message_legend_items() 0 56 4
A _custom_mtps_preview() 14 17 1
D get_message_templates() 0 39 10
A get_installed_message_types() 0 11 2
F _add_message_template() 0 44 13
A add_message_template() 0 4 1
F _edit_message_template() 0 503 47
A filter_tinymce_init() 0 4 1
A add_context_switcher() 0 4 1
A add_active_context_element() 0 21 2
B toggle_context_template() 28 63 8
A _add_form_element_before() 0 6 1
A _add_form_element_after() 0 4 1
B switch_template_pack() 0 61 6
A _add_screen_options_global_mtps() 11 11 1
F _reset_to_default_template() 0 84 14
A load_scripts_styles() 7 19 1
B _preview_message() 0 68 5
A noEventsErrorMessage() 0 27 2
A _display_preview_message() 0 4 1
A _register_edit_meta_boxes() 0 27 1
B template_pack_meta_box() 0 71 6
C extra_actions_meta_box() 0 75 14
A _get_shortcode_selector() 0 14 1
A shortcode_meta_box() 0 27 2
A _set_shortcodes() 0 10 2
A _get_shortcodes() 0 14 5
B _set_message_template_group() 0 22 6
B _set_context_switcher() 0 44 8
A _set_message_template_column_values() 0 31 5
F _insert_or_update_message_template() 14 291 41
B _do_test_send() 10 50 8
A _generate_new_templates() 0 11 2
D _trash_or_restore_message_template() 0 58 16
A _delete_message_template() 0 21 5
A _delete_mtp_permanently() 0 21 4
A _learn_more_about_message_templates_link() 0 6 1
A _settings() 0 22 2
B _set_m_mt_settings() 0 64 9
B _message_type_settings_content() 0 72 9
D _messages_settings_metaboxes() 32 120 16
A global_messages_settings_metabox_content() 0 10 1
B _generate_global_settings_form() 0 62 1
B _update_global_settings() 0 33 9
A _get_mt_tabs() 0 12 2
C _get_messenger_box_content() 0 91 12
B activate_messenger_toggle() 12 65 8
C activate_mt_toggle() 12 79 9
B _activate_messenger() 8 31 6
A _deactivate_messenger() 0 8 1
A _activate_message_type_for_messenger() 6 27 3
A _deactivate_message_type_for_messenger() 0 13 1
A _prep_default_response_for_messenger_or_message_type_toggle() 0 5 1
C _setup_response_message_for_activating_messenger_with_message_types() 0 94 8
B _setup_response_message_for_deactivating_messenger_with_message_types() 0 60 7
A update_mt_form() 0 26 3
C save_settings() 52 78 11
A _generate_now() 0 5 1
A _generate_and_send_now() 0 5 1
A _queue_for_resending() 0 5 1
A _send_now() 0 5 1
A _get_msg_ids_from_request() 0 10 3
A _delete_ee_messages() 0 37 4

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like Messages_Admin_Page often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Messages_Admin_Page, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
use EventEspresso\core\exceptions\InvalidDataTypeException;
4
use EventEspresso\core\exceptions\InvalidIdentifierException;
5
use EventEspresso\core\exceptions\InvalidInterfaceException;
6
7
/**
8
 *
9
 * EE_Message_Admin_Page class
10
 *
11
 * for Admin setup of the message pages
12
 *
13
 * @package        Event Espresso
14
 * @subpackage     includes/core/message/EE_Message_Admin_Page.core.php
15
 * @author         Darren Ethier
16
 *
17
 * ------------------------------------------------------------------------
18
 */
19
class Messages_Admin_Page extends EE_Admin_Page
20
{
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 View Code Duplication
    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 View Code Duplication
    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 View Code Duplication
    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 View Code Duplication
    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 View Code Duplication
    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 View Code Duplication
    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="'
0 ignored issues
show
Coding Style Comprehensibility introduced by
$args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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'
0 ignored issues
show
Coding Style Comprehensibility introduced by
$args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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 View Code Duplication
    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 View Code Duplication
    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) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $template_field_structure of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
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;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$template_form_fields was never initialized. Although not strictly required by PHP, it is generally a good practice to add $template_form_fields = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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(
0 ignored issues
show
Coding Style Comprehensibility introduced by
$sidebar_form_fields was never initialized. Although not strictly required by PHP, it is generally a good practice to add $sidebar_form_fields = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
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 View Code Duplication
        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 View Code Duplication
        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
        if (empty($preview)) {
2176
            $this->noEventsErrorMessage();
2177
        }
2178
        // setup display of preview.
2179
        $this->_admin_page_title = $preview_title;
2180
        $this->_template_args['admin_page_title'] = $preview_title;
2181
        $this->_template_args['admin_page_content'] = $preview_button . '<br />' . $preview;
2182
        $this->_template_args['data']['force_json'] = true;
2183
2184
        return '';
2185
    }
2186
2187
2188
    /**
2189
     * Used to set an error if there are no events available for generating a preview/test send.
2190
     *
2191
     * @param bool $test_send  Whether the error should be generated for the context of a test send.
2192
     */
2193
    protected function noEventsErrorMessage($test_send = false)
2194
    {
2195
        $events_url = parent::add_query_args_and_nonce(
2196
            array(
2197
                'action' => 'default',
2198
                'page'   => 'espresso_events',
2199
            ),
2200
            admin_url('admin.php')
2201
        );
2202
        $message = $test_send
2203
            ? __(
2204
                'A test message could not be sent for this message template because there are no events created yet. The preview system uses actual events for generating the test message. %1$sGo see your events%2$s!',
2205
                'event_espresso'
2206
            )
2207
            : __(
2208
                'There is no preview for this message template available because there are no events created yet. The preview system uses actual events for generating the preview. %1$sGo see your events%2$s!',
2209
                'event_espresso'
2210
            );
2211
2212
        EE_Error::add_attention(
2213
            sprintf(
2214
                $message,
2215
                "<a href='{$events_url}'>",
2216
                '</a>'
2217
            )
2218
        );
2219
    }
2220
2221
2222
    /**
2223
     * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
2224
     * gets called automatically.
2225
     *
2226
     * @since 4.5.0
2227
     *
2228
     * @return string
2229
     */
2230
    protected function _display_preview_message()
2231
    {
2232
        $this->display_admin_page_with_no_sidebar();
2233
    }
2234
2235
2236
    /**
2237
     * registers metaboxes that should show up on the "edit_message_template" page
2238
     *
2239
     * @access protected
2240
     * @return void
2241
     */
2242
    protected function _register_edit_meta_boxes()
2243
    {
2244
        add_meta_box(
2245
            'mtp_valid_shortcodes',
2246
            esc_html__('Valid Shortcodes', 'event_espresso'),
2247
            array($this, 'shortcode_meta_box'),
2248
            $this->_current_screen->id,
2249
            'side',
2250
            'default'
2251
        );
2252
        add_meta_box(
2253
            'mtp_extra_actions',
2254
            esc_html__('Extra Actions', 'event_espresso'),
2255
            array($this, 'extra_actions_meta_box'),
2256
            $this->_current_screen->id,
2257
            'side',
2258
            'high'
2259
        );
2260
        add_meta_box(
2261
            'mtp_templates',
2262
            esc_html__('Template Styles', 'event_espresso'),
2263
            array($this, 'template_pack_meta_box'),
2264
            $this->_current_screen->id,
2265
            'side',
2266
            'high'
2267
        );
2268
    }
2269
2270
2271
    /**
2272
     * metabox content for all template pack and variation selection.
2273
     *
2274
     * @since 4.5.0
2275
     * @return string
2276
     * @throws DomainException
2277
     * @throws EE_Error
2278
     * @throws InvalidArgumentException
2279
     * @throws ReflectionException
2280
     * @throws InvalidDataTypeException
2281
     * @throws InvalidInterfaceException
2282
     */
2283
    public function template_pack_meta_box()
2284
    {
2285
        $this->_set_message_template_group();
2286
2287
        $tp_collection = EEH_MSG_Template::get_template_pack_collection();
2288
2289
        $tp_select_values = array();
2290
2291
        foreach ($tp_collection as $tp) {
2292
            // only include template packs that support this messenger and message type!
2293
            $supports = $tp->get_supports();
2294
            if (! isset($supports[ $this->_message_template_group->messenger() ])
2295
                || ! in_array(
2296
                    $this->_message_template_group->message_type(),
2297
                    $supports[ $this->_message_template_group->messenger() ],
2298
                    true
2299
                )
2300
            ) {
2301
                // not supported
2302
                continue;
2303
            }
2304
2305
            $tp_select_values[] = array(
2306
                'text' => $tp->label,
2307
                'id'   => $tp->dbref,
2308
            );
2309
        }
2310
2311
        // if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by
2312
        // the default template pack.  This still allows for the odd template pack to override.
2313
        if (empty($tp_select_values)) {
2314
            $tp_select_values[] = array(
2315
                'text' => esc_html__('Default', 'event_espresso'),
2316
                'id'   => 'default',
2317
            );
2318
        }
2319
2320
        // setup variation select values for the currently selected template.
2321
        $variations = $this->_message_template_group->get_template_pack()->get_variations(
2322
            $this->_message_template_group->messenger(),
2323
            $this->_message_template_group->message_type()
2324
        );
2325
        $variations_select_values = array();
2326
        foreach ($variations as $variation => $label) {
2327
            $variations_select_values[] = array(
2328
                'text' => $label,
2329
                'id'   => $variation,
2330
            );
2331
        }
2332
2333
        $template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
2334
2335
        $template_args['template_packs_selector'] = EEH_Form_Fields::select_input(
0 ignored issues
show
Coding Style Comprehensibility introduced by
$template_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $template_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
2336
            'MTP_template_pack',
2337
            $tp_select_values,
2338
            $this->_message_template_group->get_template_pack_name()
2339
        );
2340
        $template_args['variations_selector'] = EEH_Form_Fields::select_input(
2341
            'MTP_template_variation',
2342
            $variations_select_values,
2343
            $this->_message_template_group->get_template_pack_variation()
2344
        );
2345
        $template_args['template_pack_label'] = $template_pack_labels->template_pack;
2346
        $template_args['template_variation_label'] = $template_pack_labels->template_variation;
2347
        $template_args['template_pack_description'] = $template_pack_labels->template_pack_description;
2348
        $template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
2349
2350
        $template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
2351
2352
        EEH_Template::display_template($template, $template_args);
2353
    }
2354
2355
2356
    /**
2357
     * This meta box holds any extra actions related to Message Templates
2358
     * For now, this includes Resetting templates to defaults and sending a test email.
2359
     *
2360
     * @access  public
2361
     * @return void
2362
     * @throws EE_Error
2363
     */
2364
    public function extra_actions_meta_box()
2365
    {
2366
        $template_form_fields = array();
2367
2368
        $extra_args = array(
2369
            'msgr'   => $this->_message_template_group->messenger(),
2370
            'mt'     => $this->_message_template_group->message_type(),
2371
            'GRP_ID' => $this->_message_template_group->GRP_ID(),
2372
        );
2373
        // first we need to see if there are any fields
2374
        $fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2375
2376
        if (! empty($fields)) {
2377
            // yup there be fields
2378
            foreach ($fields as $field => $config) {
2379
                $field_id = $this->_message_template_group->messenger() . '_' . $field;
2380
                $existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2381
                $default = isset($config['default']) ? $config['default'] : '';
2382
                $default = isset($config['value']) ? $config['value'] : $default;
2383
2384
                // if type is hidden and the value is empty
2385
                // something may have gone wrong so let's correct with the defaults
2386
                $fix = $config['input'] === 'hidden'
2387
                       && isset($existing[ $field ])
2388
                       && empty($existing[ $field ])
2389
                    ? $default
2390
                    : '';
2391
                $existing[ $field ] = isset($existing[ $field ]) && empty($fix)
2392
                    ? $existing[ $field ]
2393
                    : $fix;
2394
2395
                $template_form_fields[ $field_id ] = array(
2396
                    'name'       => 'test_settings_fld[' . $field . ']',
2397
                    'label'      => $config['label'],
2398
                    'input'      => $config['input'],
2399
                    'type'       => $config['type'],
2400
                    'required'   => $config['required'],
2401
                    'validation' => $config['validation'],
2402
                    'value'      => isset($existing[ $field ]) ? $existing[ $field ] : $default,
2403
                    'css_class'  => $config['css_class'],
2404
                    'options'    => isset($config['options']) ? $config['options'] : array(),
2405
                    'default'    => $default,
2406
                    'format'     => $config['format'],
2407
                );
2408
            }
2409
        }
2410
2411
        $test_settings_fields = ! empty($template_form_fields)
2412
            ? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2413
            : '';
2414
2415
        $test_settings_html = '';
2416
        // print out $test_settings_fields
2417
        if (! empty($test_settings_fields)) {
2418
            echo $test_settings_fields;
2419
            $test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2420
            $test_settings_html .= 'name="test_button" value="';
2421
            $test_settings_html .= esc_html__('Test Send', 'event_espresso');
2422
            $test_settings_html .= '" /><div style="clear:both"></div>';
2423
        }
2424
2425
        // and button
2426
        $test_settings_html .= '<p>'
2427
                               . esc_html__('Need to reset this message type and start over?', 'event_espresso')
2428
                               . '</p>';
2429
        $test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2430
        $test_settings_html .= $this->get_action_link_or_button(
2431
            'reset_to_default',
2432
            'reset',
2433
            $extra_args,
2434
            'button-primary reset-default-button'
2435
        );
2436
        $test_settings_html .= '</div><div style="clear:both"></div>';
2437
        echo $test_settings_html;
2438
    }
2439
2440
2441
    /**
2442
     * This returns the shortcode selector skeleton for a given context and field.
2443
     *
2444
     * @since 4.9.rc.000
2445
     * @param string $field           The name of the field retrieving shortcodes for.
2446
     * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2447
     * @return string
2448
     * @throws DomainException
2449
     * @throws EE_Error
2450
     * @throws InvalidArgumentException
2451
     * @throws ReflectionException
2452
     * @throws InvalidDataTypeException
2453
     * @throws InvalidInterfaceException
2454
     */
2455
    protected function _get_shortcode_selector($field, $linked_input_id)
2456
    {
2457
        $template_args = array(
2458
            'shortcodes'      => $this->_get_shortcodes(array($field), true),
2459
            'fieldname'       => $field,
2460
            'linked_input_id' => $linked_input_id,
2461
        );
2462
2463
        return EEH_Template::display_template(
2464
            EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2465
            $template_args,
2466
            true
2467
        );
2468
    }
2469
2470
2471
    /**
2472
     * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2473
     * page)
2474
     *
2475
     * @access public
2476
     * @return void
2477
     * @throws EE_Error
2478
     * @throws InvalidArgumentException
2479
     * @throws ReflectionException
2480
     * @throws InvalidDataTypeException
2481
     * @throws InvalidInterfaceException
2482
     */
2483
    public function shortcode_meta_box()
2484
    {
2485
        $shortcodes = $this->_get_shortcodes(array(), false); // just make sure shortcodes property is set
2486
        // $messenger = $this->_message_template_group->messenger_obj();
2487
        // now let's set the content depending on the status of the shortcodes array
2488
        if (empty($shortcodes)) {
2489
            $content = '<p>' . esc_html__('There are no valid shortcodes available', 'event_espresso') . '</p>';
2490
            echo $content;
2491
        } else {
2492
            // $alt = 0;
2493
            ?>
2494
            <div style="float:right; margin-top:10px"><?php
2495
                            echo $this->_get_help_tab_link('message_template_shortcodes');
2496
                            ?></div>
2497
            <p class="small-text"><?php
2498
                                  printf(
2499
                                      esc_html__(
2500
                                          'You can view the shortcodes usable in your template by clicking the %s icon next to each field.',
2501
                                          'event_espresso'
2502
                                      ),
2503
                                      '<span class="dashicons dashicons-menu"></span>'
2504
                                  );
2505
                                ?>
2506
            </p>
2507
            <?php
2508
        }
2509
    }
2510
2511
2512
    /**
2513
     * used to set the $_shortcodes property for when its needed elsewhere.
2514
     *
2515
     * @access protected
2516
     * @return void
2517
     * @throws EE_Error
2518
     * @throws InvalidArgumentException
2519
     * @throws ReflectionException
2520
     * @throws InvalidDataTypeException
2521
     * @throws InvalidInterfaceException
2522
     */
2523
    protected function _set_shortcodes()
2524
    {
2525
2526
        // no need to run this if the property is already set
2527
        if (! empty($this->_shortcodes)) {
2528
            return;
2529
        }
2530
2531
        $this->_shortcodes = $this->_get_shortcodes();
2532
    }
2533
2534
2535
    /**
2536
     * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2537
     * property)
2538
     *
2539
     * @access  protected
2540
     * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2541
     *                         for. Defaults to all (for the given context)
2542
     * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2543
     * @return array Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2544
     *                         true just an array of shortcode/label pairs.
2545
     * @throws EE_Error
2546
     * @throws InvalidArgumentException
2547
     * @throws ReflectionException
2548
     * @throws InvalidDataTypeException
2549
     * @throws InvalidInterfaceException
2550
     */
2551
    protected function _get_shortcodes($fields = array(), $merged = true)
2552
    {
2553
        $this->_set_message_template_group();
2554
2555
        // we need the messenger and message template to retrieve the valid shortcodes array.
2556
        $GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
2557
            ? absint($this->_req_data['id'])
2558
            : false;
2559
        $context = isset($this->_req_data['context'])
2560
            ? $this->_req_data['context']
2561
            : key($this->_message_template_group->contexts_config());
2562
2563
        return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2564
    }
2565
2566
2567
    /**
2568
     * This sets the _message_template property (containing the called message_template object)
2569
     *
2570
     * @access protected
2571
     * @return void
2572
     * @throws EE_Error
2573
     * @throws InvalidArgumentException
2574
     * @throws ReflectionException
2575
     * @throws InvalidDataTypeException
2576
     * @throws InvalidInterfaceException
2577
     */
2578
    protected function _set_message_template_group()
2579
    {
2580
2581
        if (! empty($this->_message_template_group)) {
2582
            return;
2583
        } //get out if this is already set.
2584
2585
        $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2586
        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2587
2588
        // let's get the message templates
2589
        $MTP = EEM_Message_Template_Group::instance();
2590
2591
        if (empty($GRP_ID)) {
2592
            $this->_message_template_group = $MTP->create_default_object();
2593
        } else {
2594
            $this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2595
        }
2596
2597
        $this->_template_pack = $this->_message_template_group->get_template_pack();
2598
        $this->_variation = $this->_message_template_group->get_template_pack_variation();
2599
    }
2600
2601
2602
    /**
2603
     * sets up a context switcher for edit forms
2604
     *
2605
     * @access  protected
2606
     * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2607
     * @param array                      $args                  various things the context switcher needs.
2608
     * @throws EE_Error
2609
     */
2610
    protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2611
    {
2612
        $context_details = $template_group_object->contexts_config();
2613
        $context_label = $template_group_object->context_label();
2614
        ob_start();
2615
        ?>
2616
        <div class="ee-msg-switcher-container">
2617
            <form method="get" action="<?php echo EE_MSG_ADMIN_URL; ?>" id="ee-msg-context-switcher-frm">
2618
                <?php
2619
                foreach ($args as $name => $value) {
2620
                    if ($name === 'context' || empty($value) || $name === 'extra') {
2621
                        continue;
2622
                    }
2623
                    ?>
2624
                    <input type="hidden" name="<?php echo $name; ?>" value="<?php echo $value; ?>"/>
2625
                    <?php
2626
                }
2627
                // setup nonce_url
2628
                wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2629
                ?>
2630
                <select name="context">
2631
                    <?php
2632
                    $context_templates = $template_group_object->context_templates();
2633
                    if (is_array($context_templates)) :
2634
                        foreach ($context_templates as $context => $template_fields) :
2635
                            $checked = ($context === $args['context']) ? 'selected="selected"' : '';
2636
                            ?>
2637
                            <option value="<?php echo $context; ?>" <?php echo $checked; ?>>
2638
                                <?php echo $context_details[ $context ]['label']; ?>
2639
                            </option>
2640
                        <?php endforeach;
2641
                    endif; ?>
2642
                </select>
2643
                <?php $button_text = sprintf(__('Switch %s', 'event_espresso'), ucwords($context_label['label'])); ?>
2644
                <input id="submit-msg-context-switcher-sbmt" class="button-secondary" type="submit"
2645
                       value="<?php echo $button_text; ?>">
2646
            </form>
2647
            <?php echo $args['extra']; ?>
2648
        </div> <!-- end .ee-msg-switcher-container -->
2649
        <?php
2650
        $output = ob_get_contents();
2651
        ob_clean();
2652
        $this->_context_switcher = $output;
2653
    }
2654
2655
2656
    /**
2657
     * utility for sanitizing new values coming in.
2658
     * Note: this is only used when updating a context.
2659
     *
2660
     * @access protected
2661
     *
2662
     * @param int $index This helps us know which template field to select from the request array.
2663
     *
2664
     * @return array
2665
     */
2666
    protected function _set_message_template_column_values($index)
2667
    {
2668
        if (is_array($this->_req_data['MTP_template_fields'][ $index ]['content'])) {
2669
            foreach ($this->_req_data['MTP_template_fields'][ $index ]['content'] as $field => $value) {
2670
                $this->_req_data['MTP_template_fields'][ $index ]['content'][ $field ] = $value;
2671
            }
2672
        }
2673
2674
2675
        $set_column_values = array(
2676
            'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][ $index ]['MTP_ID']),
2677
            'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2678
            'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2679
            'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2680
            'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2681
            'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][ $index ]['name']),
2682
            'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2683
            'MTP_content'        => $this->_req_data['MTP_template_fields'][ $index ]['content'],
2684
            'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2685
                ? absint($this->_req_data['MTP_is_global'])
2686
                : 0,
2687
            'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2688
                ? absint($this->_req_data['MTP_is_override'])
2689
                : 0,
2690
            'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2691
            'MTP_is_active'      => absint($this->_req_data['MTP_is_active']),
2692
        );
2693
2694
2695
        return $set_column_values;
2696
    }
2697
2698
2699
    protected function _insert_or_update_message_template($new = false)
2700
    {
2701
2702
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2703
        $success = 0;
2704
        $override = false;
2705
2706
        // setup notices description
2707
        $messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2708
2709
        // need the message type and messenger objects to be able to use the labels for the notices
2710
        $messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2711
        $messenger_label = $messenger_object instanceof EE_messenger
2712
            ? ucwords($messenger_object->label['singular'])
2713
            : '';
2714
2715
        $message_type_slug = ! empty($this->_req_data['MTP_message_type'])
2716
            ? $this->_req_data['MTP_message_type']
2717
            : '';
2718
        $message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2719
2720
        $message_type_label = $message_type_object instanceof EE_message_type
2721
            ? ucwords($message_type_object->label['singular'])
2722
            : '';
2723
2724
        $context_slug = ! empty($this->_req_data['MTP_context'])
2725
            ? $this->_req_data['MTP_context']
2726
            : '';
2727
        $context = ucwords(str_replace('_', ' ', $context_slug));
2728
2729
        $item_desc = $messenger_label && $message_type_label
2730
            ? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' '
2731
            : '';
2732
        $item_desc .= 'Message Template';
2733
        $query_args = array();
2734
        $edit_array = array();
2735
        $action_desc = '';
2736
2737
        // if this is "new" then we need to generate the default contexts for the selected messenger/message_type for
2738
        // user to edit.
2739
        if ($new) {
2740
            $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2741
            if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2742
                if (empty($edit_array)) {
2743
                    $success = 0;
2744
                } else {
2745
                    $success = 1;
2746
                    $edit_array = $edit_array[0];
2747
                    $query_args = array(
2748
                        'id'      => $edit_array['GRP_ID'],
2749
                        'context' => $edit_array['MTP_context'],
2750
                        'action'  => 'edit_message_template',
2751
                    );
2752
                }
2753
            }
2754
            $action_desc = 'created';
2755
        } else {
2756
            $MTPG = EEM_Message_Template_Group::instance();
2757
            $MTP = EEM_Message_Template::instance();
2758
2759
2760
            // run update for each template field in displayed context
2761
            if (! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2762
                EE_Error::add_error(
2763
                    esc_html__(
2764
                        'There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2765
                        'event_espresso'
2766
                    ),
2767
                    __FILE__,
2768
                    __FUNCTION__,
2769
                    __LINE__
2770
                );
2771
                $success = 0;
2772
            } else {
2773
                // first validate all fields!
2774
                // this filter allows client code to add its own validation to the template fields as well.
2775
                // returning an empty array means everything passed validation.
2776
                // errors in validation should be represented in an array with the following shape:
2777
                // array(
2778
                //   'fieldname' => array(
2779
                //          'msg' => 'error message'
2780
                //          'value' => 'value for field producing error'
2781
                // )
2782
                $custom_validation = (array) apply_filters(
2783
                    'FHEE__Messages_Admin_Page___insert_or_update_message_template__validates',
2784
                    array(),
2785
                    $this->_req_data['MTP_template_fields'],
2786
                    $context_slug,
2787
                    $messenger_slug,
2788
                    $message_type_slug
2789
                );
2790
2791
                $system_validation = $MTPG->validate(
2792
                    $this->_req_data['MTP_template_fields'],
2793
                    $context_slug,
2794
                    $messenger_slug,
2795
                    $message_type_slug
2796
                );
2797
2798
                $system_validation = ! is_array($system_validation) && $system_validation ? array()
2799
                    : $system_validation;
2800
                $validates = array_merge($custom_validation, $system_validation);
2801
2802
                // if $validate returned error messages (i.e. is_array()) then we need to process them and setup an
2803
                // appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.
2804
                //  WE need to make sure there is no actual error messages in validates.
2805
                if (is_array($validates) && ! empty($validates)) {
2806
                    // add the transient so when the form loads we know which fields to highlight
2807
                    $this->_add_transient('edit_message_template', $validates);
2808
2809
                    $success = 0;
2810
2811
                    // setup notices
2812
                    foreach ($validates as $field => $error) {
2813
                        if (isset($error['msg'])) {
2814
                            EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2815
                        }
2816
                    }
2817
                } else {
2818
                    $set_column_values = array();
2819
                    foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2820
                        $set_column_values = $this->_set_message_template_column_values($template_field);
2821
2822
                        $where_cols_n_values = array(
2823
                            'MTP_ID' => $this->_req_data['MTP_template_fields'][ $template_field ]['MTP_ID'],
2824
                        );
2825
                        // if they aren't allowed to use all JS, restrict them to just posty-y tags
2826
                        if (! current_user_can('unfiltered_html')) {
2827
                            if (is_array($set_column_values['MTP_content'])) {
2828
                                foreach ($set_column_values['MTP_content'] as $key => $value) {
2829
                                    // remove slashes so wp_kses works properly (its wp_kses_stripslashes() function
2830
                                    // only removes slashes from double-quotes, so attributes using single quotes always
2831
                                    // appear invalid.) But currently the models expect slashed data, so after wp_kses
2832
                                    // runs we need to re-slash the data. Sheesh. See
2833
                                    // https://events.codebasehq.com/projects/event-espresso/tickets/11211#update-47321587
2834
                                    $set_column_values['MTP_content'][ $key ] = addslashes(
2835
                                        wp_kses(
2836
                                            stripslashes($value),
2837
                                            wp_kses_allowed_html('post')
2838
                                        )
2839
                                    );
2840
                                }
2841
                            } else {
2842
                                $set_column_values['MTP_content'] = wp_kses(
2843
                                    $set_column_values['MTP_content'],
2844
                                    wp_kses_allowed_html('post')
2845
                                );
2846
                            }
2847
                        }
2848
                        $message_template_fields = array(
2849
                            'GRP_ID'             => $set_column_values['GRP_ID'],
2850
                            'MTP_template_field' => $set_column_values['MTP_template_field'],
2851
                            'MTP_context'        => $set_column_values['MTP_context'],
2852
                            'MTP_content'        => $set_column_values['MTP_content'],
2853
                        );
2854
                        if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2855
                            if ($updated === false) {
2856
                                EE_Error::add_error(
2857
                                    sprintf(
2858
                                        esc_html__('%s field was NOT updated for some reason', 'event_espresso'),
2859
                                        $template_field
2860
                                    ),
2861
                                    __FILE__,
2862
                                    __FUNCTION__,
2863
                                    __LINE__
2864
                                );
2865
                            } else {
2866
                                $success = 1;
2867
                            }
2868
                        } else {
2869
                            // only do this logic if we don't have a MTP_ID for this field
2870
                            if (empty($this->_req_data['MTP_template_fields'][ $template_field ]['MTP_ID'])) {
2871
                                // this has already been through the template field validator and sanitized, so it will be
2872
                                // safe to insert this field.  Why insert?  This typically happens when we introduce a new
2873
                                // message template field in a messenger/message type and existing users don't have the
2874
                                // default setup for it.
2875
                                // @link https://events.codebasehq.com/projects/event-espresso/tickets/9465
2876
                                $updated = $MTP->insert($message_template_fields);
2877 View Code Duplication
                                if (! $updated || is_wp_error($updated)) {
2878
                                    EE_Error::add_error(
2879
                                        sprintf(
2880
                                            esc_html__('%s field could not be updated.', 'event_espresso'),
2881
                                            $template_field
2882
                                        ),
2883
                                        __FILE__,
2884
                                        __FUNCTION__,
2885
                                        __LINE__
2886
                                    );
2887
                                    $success = 0;
2888
                                } else {
2889
                                    $success = 1;
2890
                                }
2891
                            }
2892
                        }
2893
                        $action_desc = 'updated';
2894
                    }
2895
2896
                    // we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2897
                    $mtpg_fields = array(
2898
                        'MTP_user_id'      => $set_column_values['MTP_user_id'],
2899
                        'MTP_messenger'    => $set_column_values['MTP_messenger'],
2900
                        'MTP_message_type' => $set_column_values['MTP_message_type'],
2901
                        'MTP_is_global'    => $set_column_values['MTP_is_global'],
2902
                        'MTP_is_override'  => $set_column_values['MTP_is_override'],
2903
                        'MTP_deleted'      => $set_column_values['MTP_deleted'],
2904
                        'MTP_is_active'    => $set_column_values['MTP_is_active'],
2905
                        'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2906
                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2907
                            : '',
2908
                        'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2909
                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2910
                            : '',
2911
                    );
2912
2913
                    $mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2914
                    $updated = $MTPG->update($mtpg_fields, array($mtpg_where));
2915
2916
                    if ($updated === false) {
2917
                        EE_Error::add_error(
2918
                            sprintf(
2919
                                esc_html__(
2920
                                    'The Message Template Group (%d) was NOT updated for some reason',
2921
                                    'event_espresso'
2922
                                ),
2923
                                $set_column_values['GRP_ID']
2924
                            ),
2925
                            __FILE__,
2926
                            __FUNCTION__,
2927
                            __LINE__
2928
                        );
2929
                    } else {
2930
                        // k now we need to ensure the template_pack and template_variation fields are set.
2931
                        $template_pack = ! empty($this->_req_data['MTP_template_pack'])
2932
                            ? $this->_req_data['MTP_template_pack']
2933
                            : 'default';
2934
2935
                        $template_variation = ! empty($this->_req_data['MTP_template_variation'])
2936
                            ? $this->_req_data['MTP_template_variation']
2937
                            : 'default';
2938
2939
                        $mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2940
                        if ($mtpg_obj instanceof EE_Message_Template_Group) {
2941
                            $mtpg_obj->set_template_pack_name($template_pack);
2942
                            $mtpg_obj->set_template_pack_variation($template_variation);
2943
                        }
2944
                        $success = 1;
2945
                    }
2946
                }
2947
            }
2948
        }
2949
2950
        // we return things differently if doing ajax
2951
        if (defined('DOING_AJAX') && DOING_AJAX) {
2952
            $this->_template_args['success'] = $success;
2953
            $this->_template_args['error'] = ! $success ? true : false;
2954
            $this->_template_args['content'] = '';
2955
            $this->_template_args['data'] = array(
2956
                'grpID'        => $edit_array['GRP_ID'],
2957
                'templateName' => $edit_array['template_name'],
2958
            );
2959
            if ($success) {
2960
                EE_Error::overwrite_success();
2961
                EE_Error::add_success(
2962
                    esc_html__(
2963
                        '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.',
2964
                        'event_espresso'
2965
                    )
2966
                );
2967
            }
2968
2969
            $this->_return_json();
2970
        }
2971
2972
2973
        // was a test send triggered?
2974
        if (isset($this->_req_data['test_button'])) {
2975
            EE_Error::overwrite_success();
2976
            $this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2977
            $override = true;
2978
        }
2979
2980
        if (empty($query_args)) {
2981
            $query_args = array(
2982
                'id'      => $this->_req_data['GRP_ID'],
2983
                'context' => $context_slug,
2984
                'action'  => 'edit_message_template',
2985
            );
2986
        }
2987
2988
        $this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2989
    }
2990
2991
2992
    /**
2993
     * processes a test send request to do an actual messenger delivery test for the given message template being tested
2994
     *
2995
     * @param  string $context      what context being tested
2996
     * @param  string $messenger    messenger being tested
2997
     * @param  string $message_type message type being tested
2998
     * @throws EE_Error
2999
     * @throws InvalidArgumentException
3000
     * @throws InvalidDataTypeException
3001
     * @throws InvalidInterfaceException
3002
     */
3003
    protected function _do_test_send($context, $messenger, $message_type)
3004
    {
3005
        // set things up for preview
3006
        $this->_req_data['messenger'] = $messenger;
3007
        $this->_req_data['message_type'] = $message_type;
3008
        $this->_req_data['context'] = $context;
3009
        $this->_req_data['GRP_ID'] = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
3010
        $active_messenger = $this->_message_resource_manager->get_active_messenger($messenger);
3011
3012
        // let's save any existing fields that might be required by the messenger
3013
        if (isset($this->_req_data['test_settings_fld'])
3014
            && $active_messenger instanceof EE_messenger
3015
            && apply_filters(
3016
                'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
3017
                true,
3018
                $this->_req_data['test_settings_fld'],
3019
                $active_messenger
3020
            )
3021
        ) {
3022
            $active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
3023
        }
3024
3025
        /**
3026
         * Use filter to add additional controls on whether message can send or not
3027
         */
3028
        if (apply_filters(
3029
            'FHEE__Messages_Admin_Page__do_test_send__can_send',
3030
            true,
3031
            $context,
3032
            $this->_req_data,
3033
            $messenger,
3034
            $message_type
3035
        )) {
3036
            if (EEM_Event::instance()->count() > 0) {
3037
                $success = $this->_preview_message(true);
3038 View Code Duplication
                if ($success) {
3039
                    EE_Error::add_success(__('Test message sent', 'event_espresso'));
3040
                } else {
3041
                    EE_Error::add_error(
3042
                        esc_html__('The test message was not sent', 'event_espresso'),
3043
                        __FILE__,
3044
                        __FUNCTION__,
3045
                        __LINE__
3046
                    );
3047
                }
3048
            } else {
3049
                $this->noEventsErrorMessage(true);
3050
            }
3051
        }
3052
    }
3053
3054
3055
    /**
3056
     * _generate_new_templates
3057
     * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
3058
     * automatically create the defaults for the event.  The user would then be redirected to edit the default context
3059
     * for the event.
3060
     *
3061
     *
3062
     * @param  string $messenger     the messenger we are generating templates for
3063
     * @param array   $message_types array of message types that the templates are generated for.
3064
     * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
3065
     *                               indicate the message_template_group being used as the base.
3066
     *
3067
     * @param bool    $global
3068
     *
3069
     * @return array|bool array of data required for the redirect to the correct edit page or bool if
3070
     *                               encountering problems.
3071
     * @throws EE_Error
3072
     */
3073
    protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
3074
    {
3075
3076
        // if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we
3077
        // just don't generate any templates.
3078
        if (empty($message_types)) {
3079
            return true;
3080
        }
3081
3082
        return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
3083
    }
3084
3085
3086
    /**
3087
     * [_trash_or_restore_message_template]
3088
     *
3089
     * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
3090
     * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
3091
     *                        an individual context (FALSE).
3092
     * @return void
3093
     * @throws EE_Error
3094
     * @throws InvalidArgumentException
3095
     * @throws InvalidDataTypeException
3096
     * @throws InvalidInterfaceException
3097
     */
3098
    protected function _trash_or_restore_message_template($trash = true, $all = false)
3099
    {
3100
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3101
        $MTP = EEM_Message_Template_Group::instance();
3102
3103
        $success = 1;
3104
3105
        // incoming GRP_IDs
3106
        if ($all) {
3107
            // Checkboxes
3108
            if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3109
                // if array has more than one element then success message should be plural.
3110
                // todo: what about nonce?
3111
                $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3112
3113
                // cycle through checkboxes
3114
                while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
0 ignored issues
show
Unused Code introduced by
The assignment to $value is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
3115
                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3116
                    if (! $trashed_or_restored) {
3117
                        $success = 0;
3118
                    }
3119
                }
3120
            } else {
3121
                // grab single GRP_ID and handle
3122
                $GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
3123
                if (! empty($GRP_ID)) {
3124
                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
3125
                    if (! $trashed_or_restored) {
3126
                        $success = 0;
3127
                    }
3128
                } else {
3129
                    $success = 0;
3130
                }
3131
            }
3132
        }
3133
3134
        $action_desc = $trash
3135
            ? esc_html__('moved to the trash', 'event_espresso')
3136
            : esc_html__('restored', 'event_espresso');
3137
3138
        $action_desc = ! empty($this->_req_data['template_switch']) ? esc_html__('switched', 'event_espresso') : $action_desc;
3139
3140
        $item_desc = $all ? _n(
3141
            'Message Template Group',
3142
            'Message Template Groups',
3143
            $success,
3144
            'event_espresso'
3145
        ) : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
3146
3147
        $item_desc = ! empty($this->_req_data['template_switch']) ? _n(
3148
            'template',
3149
            'templates',
3150
            $success,
3151
            'event_espresso'
3152
        ) : $item_desc;
3153
3154
        $this->_redirect_after_action($success, $item_desc, $action_desc, array());
3155
    }
3156
3157
3158
    /**
3159
     * [_delete_message_template]
3160
     * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
3161
     *
3162
     * @return void
3163
     * @throws EE_Error
3164
     * @throws InvalidArgumentException
3165
     * @throws InvalidDataTypeException
3166
     * @throws InvalidInterfaceException
3167
     */
3168
    protected function _delete_message_template()
3169
    {
3170
        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3171
3172
        // checkboxes
3173
        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3174
            // if array has more than one element then success message should be plural
3175
            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3176
3177
            // cycle through bulk action checkboxes
3178
            while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
0 ignored issues
show
Unused Code introduced by
The assignment to $value is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
3179
                $success = $this->_delete_mtp_permanently($GRP_ID);
3180
            }
3181
        } else {
3182
            // grab single grp_id and delete
3183
            $GRP_ID = absint($this->_req_data['id']);
3184
            $success = $this->_delete_mtp_permanently($GRP_ID);
3185
        }
3186
3187
        $this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
3188
    }
3189
3190
3191
    /**
3192
     * helper for permanently deleting a mtP group and all related message_templates
3193
     *
3194
     * @param  int  $GRP_ID        The group being deleted
3195
     * @param  bool $include_group whether to delete the Message Template Group as well.
3196
     * @return bool boolean to indicate the success of the deletes or not.
3197
     * @throws EE_Error
3198
     * @throws InvalidArgumentException
3199
     * @throws InvalidDataTypeException
3200
     * @throws InvalidInterfaceException
3201
     */
3202
    private function _delete_mtp_permanently($GRP_ID, $include_group = true)
3203
    {
3204
        $success = 1;
3205
        $MTPG = EEM_Message_Template_Group::instance();
3206
        // first let's GET this group
3207
        $MTG = $MTPG->get_one_by_ID($GRP_ID);
3208
        // then delete permanently all the related Message Templates
3209
        $deleted = $MTG->delete_related_permanently('Message_Template');
3210
3211
        if ($deleted === 0) {
3212
            $success = 0;
3213
        }
3214
3215
        // now delete permanently this particular group
3216
3217
        if ($include_group && ! $MTG->delete_permanently()) {
3218
            $success = 0;
3219
        }
3220
3221
        return $success;
3222
    }
3223
3224
3225
    /**
3226
     *    _learn_more_about_message_templates_link
3227
     *
3228
     * @access protected
3229
     * @return string
3230
     */
3231
    protected function _learn_more_about_message_templates_link()
3232
    {
3233
        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >'
3234
               . esc_html__('learn more about how message templates works', 'event_espresso')
3235
               . '</a>';
3236
    }
3237
3238
3239
    /**
3240
     * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
3241
     * ajax and other routes.
3242
     *
3243
     * @return void
3244
     * @throws DomainException
3245
     */
3246
    protected function _settings()
3247
    {
3248
3249
3250
        $this->_set_m_mt_settings();
3251
3252
        $selected_messenger = isset($this->_req_data['selected_messenger'])
3253
            ? $this->_req_data['selected_messenger']
3254
            : 'email';
3255
3256
        // let's setup the messenger tabs
3257
        $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
3258
            $this->_m_mt_settings['messenger_tabs'],
3259
            'messenger_links',
3260
            '|',
3261
            $selected_messenger
3262
        );
3263
        $this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
3264
        $this->_template_args['after_admin_page_content'] = '</div><!-- end .ui-widget -->';
3265
3266
        $this->display_admin_page_with_sidebar();
3267
    }
3268
3269
3270
    /**
3271
     * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
3272
     *
3273
     * @access protected
3274
     * @return void
3275
     * @throws DomainException
3276
     */
3277
    protected function _set_m_mt_settings()
3278
    {
3279
        // first if this is already set then lets get out no need to regenerate data.
3280
        if (! empty($this->_m_mt_settings)) {
3281
            return;
3282
        }
3283
3284
        // get all installed messengers and message_types
3285
        /** @type EE_messenger[] $messengers */
3286
        $messengers = $this->_message_resource_manager->installed_messengers();
3287
        /** @type EE_message_type[] $message_types */
3288
        $message_types = $this->_message_resource_manager->installed_message_types();
3289
3290
3291
        // assemble the array for the _tab_text_links helper
3292
3293
        foreach ($messengers as $messenger) {
3294
            $this->_m_mt_settings['messenger_tabs'][ $messenger->name ] = array(
3295
                'label' => ucwords($messenger->label['singular']),
3296
                'class' => $this->_message_resource_manager->is_messenger_active($messenger->name)
3297
                    ? 'messenger-active'
3298
                    : '',
3299
                'href'  => $messenger->name,
3300
                'title' => esc_html__('Modify this Messenger', 'event_espresso'),
3301
                'slug'  => $messenger->name,
3302
                'obj'   => $messenger,
3303
            );
3304
3305
3306
            $message_types_for_messenger = $messenger->get_valid_message_types();
3307
3308
            foreach ($message_types as $message_type) {
3309
                // first we need to verify that this message type is valid with this messenger. Cause if it isn't then
3310
                // it shouldn't show in either the inactive OR active metabox.
3311
                if (! in_array($message_type->name, $message_types_for_messenger, true)) {
3312
                    continue;
3313
                }
3314
3315
                $a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger(
3316
                    $messenger->name,
3317
                    $message_type->name
3318
                )
3319
                    ? 'active'
3320
                    : 'inactive';
3321
3322
                $this->_m_mt_settings['message_type_tabs'][ $messenger->name ][ $a_or_i ][ $message_type->name ] = array(
3323
                    'label'    => ucwords($message_type->label['singular']),
3324
                    'class'    => 'message-type-' . $a_or_i,
3325
                    'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
3326
                    'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
3327
                    'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
3328
                    'title'    => $a_or_i === 'active'
3329
                        ? esc_html__('Drag this message type to the Inactive window to deactivate', 'event_espresso')
3330
                        : esc_html__('Drag this message type to the messenger to activate', 'event_espresso'),
3331
                    'content'  => $a_or_i === 'active'
3332
                        ? $this->_message_type_settings_content($message_type, $messenger, true)
3333
                        : $this->_message_type_settings_content($message_type, $messenger),
3334
                    'slug'     => $message_type->name,
3335
                    'active'   => $a_or_i === 'active',
3336
                    'obj'      => $message_type,
3337
                );
3338
            }
3339
        }
3340
    }
3341
3342
3343
    /**
3344
     * This just prepares the content for the message type settings
3345
     *
3346
     * @param  EE_message_type $message_type The message type object
3347
     * @param  EE_messenger    $messenger    The messenger object
3348
     * @param  boolean         $active       Whether the message type is active or not
3349
     * @return string html output for the content
3350
     * @throws DomainException
3351
     */
3352
    protected function _message_type_settings_content($message_type, $messenger, $active = false)
3353
    {
3354
        // get message type fields
3355
        $fields = $message_type->get_admin_settings_fields();
3356
        $settings_template_args['template_form_fields'] = '';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$settings_template_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $settings_template_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
3357
3358
        if (! empty($fields) && $active) {
3359
            $existing_settings = $message_type->get_existing_admin_settings($messenger->name);
3360
            foreach ($fields as $fldname => $fldprops) {
3361
                $field_id = $messenger->name . '-' . $message_type->name . '-' . $fldname;
3362
                $template_form_field[ $field_id ] = array(
0 ignored issues
show
Coding Style Comprehensibility introduced by
$template_form_field was never initialized. Although not strictly required by PHP, it is generally a good practice to add $template_form_field = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
3363
                    'name'       => 'message_type_settings[' . $fldname . ']',
3364
                    'label'      => $fldprops['label'],
3365
                    'input'      => $fldprops['field_type'],
3366
                    'type'       => $fldprops['value_type'],
3367
                    'required'   => $fldprops['required'],
3368
                    'validation' => $fldprops['validation'],
3369
                    'value'      => isset($existing_settings[ $fldname ])
3370
                        ? $existing_settings[ $fldname ]
3371
                        : $fldprops['default'],
3372
                    'options'    => isset($fldprops['options'])
3373
                        ? $fldprops['options']
3374
                        : array(),
3375
                    'default'    => isset($existing_settings[ $fldname ])
3376
                        ? $existing_settings[ $fldname ]
3377
                        : $fldprops['default'],
3378
                    'css_class'  => 'no-drag',
3379
                    'format'     => $fldprops['format'],
3380
                );
3381
            }
3382
3383
3384
            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3385
                ? $this->_generate_admin_form_fields(
3386
                    $template_form_field,
3387
                    'string',
3388
                    'ee_mt_activate_form'
3389
                )
3390
                : '';
3391
        }
3392
3393
        $settings_template_args['description'] = $message_type->description;
3394
        // we also need some hidden fields
3395
        $settings_template_args['hidden_fields'] = array(
3396
            'message_type_settings[messenger]'    => array(
3397
                'type'  => 'hidden',
3398
                'value' => $messenger->name,
3399
            ),
3400
            'message_type_settings[message_type]' => array(
3401
                'type'  => 'hidden',
3402
                'value' => $message_type->name,
3403
            ),
3404
            'type'                                => array(
3405
                'type'  => 'hidden',
3406
                'value' => 'message_type',
3407
            ),
3408
        );
3409
3410
        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3411
            $settings_template_args['hidden_fields'],
3412
            'array'
3413
        );
3414
        $settings_template_args['show_form'] = empty($settings_template_args['template_form_fields'])
3415
            ? ' hidden'
3416
            : '';
3417
3418
3419
        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
3420
        $content = EEH_Template::display_template($template, $settings_template_args, true);
3421
3422
        return $content;
3423
    }
3424
3425
3426
    /**
3427
     * Generate all the metaboxes for the message types and register them for the messages settings page.
3428
     *
3429
     * @access protected
3430
     * @return void
3431
     * @throws DomainException
3432
     */
3433
    protected function _messages_settings_metaboxes()
3434
    {
3435
        $this->_set_m_mt_settings();
3436
        $m_boxes = $mt_boxes = array();
3437
        $m_template_args = $mt_template_args = array();
3438
3439
        $selected_messenger = isset($this->_req_data['selected_messenger'])
3440
            ? $this->_req_data['selected_messenger']
3441
            : 'email';
3442
3443
        if (isset($this->_m_mt_settings['messenger_tabs'])) {
3444
            foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
3445
                $hide_on_message = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
3446
                $hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
3447
                // messenger meta boxes
3448
                $active = $selected_messenger === $messenger;
3449
                $active_mt_tabs = isset(
3450
                    $this->_m_mt_settings['message_type_tabs'][ $messenger ]['active']
3451
                )
3452
                    ? $this->_m_mt_settings['message_type_tabs'][ $messenger ]['active']
3453
                    : '';
3454
                $m_boxes[ $messenger . '_a_box' ] = sprintf(
3455
                    esc_html__('%s Settings', 'event_espresso'),
3456
                    $tab_array['label']
3457
                );
3458
                $m_template_args[ $messenger . '_a_box' ] = array(
3459
                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3460
                    'inactive_message_types' => isset(
3461
                        $this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive']
3462
                    )
3463
                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive'])
3464
                        : '',
3465
                    'content'                => $this->_get_messenger_box_content($tab_array['obj']),
3466
                    'hidden'                 => $active ? '' : ' hidden',
3467
                    'hide_on_message'        => $hide_on_message,
3468
                    'messenger'              => $messenger,
3469
                    'active'                 => $active,
3470
                );
3471
                // message type meta boxes
3472
                // (which is really just the inactive container for each messenger
3473
                // showing inactive message types for that messenger)
3474
                $mt_boxes[ $messenger . '_i_box' ] = esc_html__('Inactive Message Types', 'event_espresso');
3475
                $mt_template_args[ $messenger . '_i_box' ] = array(
3476
                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
3477
                    'inactive_message_types' => isset(
3478
                        $this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive']
3479
                    )
3480
                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][ $messenger ]['inactive'])
3481
                        : '',
3482
                    'hidden'                 => $active ? '' : ' hidden',
3483
                    'hide_on_message'        => $hide_on_message,
3484
                    'hide_off_message'       => $hide_off_message,
3485
                    'messenger'              => $messenger,
3486
                    'active'                 => $active,
3487
                );
3488
            }
3489
        }
3490
3491
3492
        // register messenger metaboxes
3493
        $m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
3494 View Code Duplication
        foreach ($m_boxes as $box => $label) {
3495
            $callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[ $box ]);
3496
            $msgr = str_replace('_a_box', '', $box);
3497
            add_meta_box(
3498
                'espresso_' . $msgr . '_settings',
3499
                $label,
3500
                function ($post, $metabox) {
3501
                    echo EEH_Template::display_template(
3502
                        $metabox["args"]["template_path"],
3503
                        $metabox["args"]["template_args"],
3504
                        true
3505
                    );
3506
                },
3507
                $this->_current_screen->id,
3508
                'normal',
3509
                'high',
3510
                $callback_args
3511
            );
3512
        }
3513
3514
        // register message type metaboxes
3515
        $mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
3516 View Code Duplication
        foreach ($mt_boxes as $box => $label) {
3517
            $callback_args = array(
3518
                'template_path' => $mt_template_path,
3519
                'template_args' => $mt_template_args[ $box ],
3520
            );
3521
            $mt = str_replace('_i_box', '', $box);
3522
            add_meta_box(
3523
                'espresso_' . $mt . '_inactive_mts',
3524
                $label,
3525
                function ($post, $metabox) {
3526
                    echo EEH_Template::display_template(
3527
                        $metabox["args"]["template_path"],
3528
                        $metabox["args"]["template_args"],
3529
                        true
3530
                    );
3531
                },
3532
                $this->_current_screen->id,
3533
                'side',
3534
                'high',
3535
                $callback_args
3536
            );
3537
        }
3538
3539
        // register metabox for global messages settings but only when on the main site.  On single site installs this
3540
        // will always result in the metabox showing, on multisite installs the metabox will only show on the main site.
3541
        if (is_main_site()) {
3542
            add_meta_box(
3543
                'espresso_global_message_settings',
3544
                esc_html__('Global Message Settings', 'event_espresso'),
3545
                array($this, 'global_messages_settings_metabox_content'),
3546
                $this->_current_screen->id,
3547
                'normal',
3548
                'low',
3549
                array()
3550
            );
3551
        }
3552
    }
3553
3554
3555
    /**
3556
     *  This generates the content for the global messages settings metabox.
3557
     *
3558
     * @return string
3559
     * @throws EE_Error
3560
     * @throws InvalidArgumentException
3561
     * @throws ReflectionException
3562
     * @throws InvalidDataTypeException
3563
     * @throws InvalidInterfaceException
3564
     */
3565
    public function global_messages_settings_metabox_content()
3566
    {
3567
        $form = $this->_generate_global_settings_form();
3568
        echo $form->form_open(
3569
            $this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
3570
            'POST'
3571
        )
3572
             . $form->get_html()
3573
             . $form->form_close();
3574
    }
3575
3576
3577
    /**
3578
     * This generates and returns the form object for the global messages settings.
3579
     *
3580
     * @return EE_Form_Section_Proper
3581
     * @throws EE_Error
3582
     * @throws InvalidArgumentException
3583
     * @throws ReflectionException
3584
     * @throws InvalidDataTypeException
3585
     * @throws InvalidInterfaceException
3586
     */
3587
    protected function _generate_global_settings_form()
3588
    {
3589
        EE_Registry::instance()->load_helper('HTML');
3590
        /** @var EE_Network_Core_Config $network_config */
3591
        $network_config = EE_Registry::instance()->NET_CFG->core;
3592
3593
        return new EE_Form_Section_Proper(
3594
            array(
3595
                'name'            => 'global_messages_settings',
3596
                'html_id'         => 'global_messages_settings',
3597
                'html_class'      => 'form-table',
3598
                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3599
                'subsections'     => apply_filters(
3600
                    'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3601
                    array(
3602
                        'do_messages_on_same_request' => new EE_Select_Input(
3603
                            array(
3604
                                true  => esc_html__("On the same request", "event_espresso"),
3605
                                false => esc_html__("On a separate request", "event_espresso"),
3606
                            ),
3607
                            array(
3608
                                'default'         => $network_config->do_messages_on_same_request,
3609
                                'html_label_text' => esc_html__(
3610
                                    'Generate and send all messages:',
3611
                                    'event_espresso'
3612
                                ),
3613
                                'html_help_text'  => esc_html__(
3614
                                    '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.',
3615
                                    'event_espresso'
3616
                                ),
3617
                            )
3618
                        ),
3619
                        'delete_threshold'            => new EE_Select_Input(
3620
                            array(
3621
                                0  => esc_html__('Forever', 'event_espresso'),
3622
                                3  => esc_html__('3 Months', 'event_espresso'),
3623
                                6  => esc_html__('6 Months', 'event_espresso'),
3624
                                9  => esc_html__('9 Months', 'event_espresso'),
3625
                                12 => esc_html__('12 Months', 'event_espresso'),
3626
                                24 => esc_html__('24 Months', 'event_espresso'),
3627
                                36 => esc_html__('36 Months', 'event_espresso'),
3628
                            ),
3629
                            array(
3630
                                'default'         => EE_Registry::instance()->CFG->messages->delete_threshold,
3631
                                'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3632
                                'html_help_text'  => esc_html__(
3633
                                    'You can control how long a record of processed messages is kept via this option.',
3634
                                    'event_espresso'
3635
                                ),
3636
                            )
3637
                        ),
3638
                        'update_settings'             => new EE_Submit_Input(
3639
                            array(
3640
                                'default'         => esc_html__('Update', 'event_espresso'),
3641
                                'html_label_text' => '&nbsp',
3642
                            )
3643
                        ),
3644
                    )
3645
                ),
3646
            )
3647
        );
3648
    }
3649
3650
3651
    /**
3652
     * This handles updating the global settings set on the admin page.
3653
     *
3654
     * @throws EE_Error
3655
     * @throws InvalidDataTypeException
3656
     * @throws InvalidInterfaceException
3657
     * @throws InvalidArgumentException
3658
     * @throws ReflectionException
3659
     */
3660
    protected function _update_global_settings()
3661
    {
3662
        /** @var EE_Network_Core_Config $network_config */
3663
        $network_config = EE_Registry::instance()->NET_CFG->core;
3664
        $messages_config = EE_Registry::instance()->CFG->messages;
3665
        $form = $this->_generate_global_settings_form();
3666
        if ($form->was_submitted()) {
3667
            $form->receive_form_submission();
3668
            if ($form->is_valid()) {
3669
                $valid_data = $form->valid_data();
3670
                foreach ($valid_data as $property => $value) {
3671
                    $setter = 'set_' . $property;
3672
                    if (method_exists($network_config, $setter)) {
3673
                        $network_config->{$setter}($value);
3674
                    } elseif (property_exists($network_config, $property)
3675
                        && $network_config->{$property} !== $value
3676
                    ) {
3677
                        $network_config->{$property} = $value;
3678
                    } elseif (property_exists($messages_config, $property)
3679
                        && $messages_config->{$property} !== $value
3680
                    ) {
3681
                        $messages_config->{$property} = $value;
3682
                    }
3683
                }
3684
                // only update if the form submission was valid!
3685
                EE_Registry::instance()->NET_CFG->update_config(true, false);
3686
                EE_Registry::instance()->CFG->update_espresso_config();
3687
                EE_Error::overwrite_success();
3688
                EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3689
            }
3690
        }
3691
        $this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3692
    }
3693
3694
3695
    /**
3696
     * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3697
     *
3698
     * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3699
     * @return string html formatted tabs
3700
     * @throws DomainException
3701
     */
3702
    protected function _get_mt_tabs($tab_array)
3703
    {
3704
        $tab_array = (array) $tab_array;
3705
        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3706
        $tabs = '';
3707
3708
        foreach ($tab_array as $tab) {
3709
            $tabs .= EEH_Template::display_template($template, $tab, true);
3710
        }
3711
3712
        return $tabs;
3713
    }
3714
3715
3716
    /**
3717
     * This prepares the content of the messenger meta box admin settings
3718
     *
3719
     * @param  EE_messenger $messenger The messenger we're setting up content for
3720
     * @return string html formatted content
3721
     * @throws DomainException
3722
     */
3723
    protected function _get_messenger_box_content(EE_messenger $messenger)
3724
    {
3725
3726
        $fields = $messenger->get_admin_settings_fields();
3727
        $settings_template_args['template_form_fields'] = '';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$settings_template_args was never initialized. Although not strictly required by PHP, it is generally a good practice to add $settings_template_args = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
3728
3729
        // is $messenger active?
3730
        $settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3731
3732
3733
        if (! empty($fields)) {
3734
            $existing_settings = $messenger->get_existing_admin_settings();
3735
3736
            foreach ($fields as $fldname => $fldprops) {
3737
                $field_id = $messenger->name . '-' . $fldname;
3738
                $template_form_field[ $field_id ] = array(
0 ignored issues
show
Coding Style Comprehensibility introduced by
$template_form_field was never initialized. Although not strictly required by PHP, it is generally a good practice to add $template_form_field = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
3739
                    'name'       => 'messenger_settings[' . $field_id . ']',
3740
                    'label'      => $fldprops['label'],
3741
                    'input'      => $fldprops['field_type'],
3742
                    'type'       => $fldprops['value_type'],
3743
                    'required'   => $fldprops['required'],
3744
                    'validation' => $fldprops['validation'],
3745
                    'value'      => isset($existing_settings[ $field_id ])
3746
                        ? $existing_settings[ $field_id ]
3747
                        : $fldprops['default'],
3748
                    'css_class'  => '',
3749
                    'format'     => $fldprops['format'],
3750
                );
3751
            }
3752
3753
3754
            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3755
                ? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3756
                : '';
3757
        }
3758
3759
        // we also need some hidden fields
3760
        $settings_template_args['hidden_fields'] = array(
3761
            'messenger_settings[messenger]' => array(
3762
                'type'  => 'hidden',
3763
                'value' => $messenger->name,
3764
            ),
3765
            'type'                          => array(
3766
                'type'  => 'hidden',
3767
                'value' => 'messenger',
3768
            ),
3769
        );
3770
3771
        // make sure any active message types that are existing are included in the hidden fields
3772
        if (isset($this->_m_mt_settings['message_type_tabs'][ $messenger->name ]['active'])) {
3773
            foreach ($this->_m_mt_settings['message_type_tabs'][ $messenger->name ]['active'] as $mt => $values) {
3774
                $settings_template_args['hidden_fields'][ 'messenger_settings[message_types][' . $mt . ']' ] = array(
3775
                    'type'  => 'hidden',
3776
                    'value' => $mt,
3777
                );
3778
            }
3779
        }
3780
        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3781
            $settings_template_args['hidden_fields'],
3782
            'array'
3783
        );
3784
        $active = $this->_message_resource_manager->is_messenger_active($messenger->name);
3785
3786
        $settings_template_args['messenger'] = $messenger->name;
3787
        $settings_template_args['description'] = $messenger->description;
3788
        $settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3789
3790
3791
        $settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active(
3792
            $messenger->name
3793
        )
3794
            ? $settings_template_args['show_hide_edit_form']
3795
            : ' hidden';
3796
3797
        $settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3798
            ? ' hidden'
3799
            : $settings_template_args['show_hide_edit_form'];
3800
3801
3802
        $settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3803
        $settings_template_args['nonce'] = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3804
        $settings_template_args['on_off_status'] = $active ? true : false;
3805
        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3806
        $content = EEH_Template::display_template(
3807
            $template,
3808
            $settings_template_args,
3809
            true
3810
        );
3811
3812
        return $content;
3813
    }
3814
3815
3816
    /**
3817
     * used by ajax on the messages settings page to activate|deactivate the messenger
3818
     *
3819
     * @throws DomainException
3820
     * @throws EE_Error
3821
     * @throws InvalidDataTypeException
3822
     * @throws InvalidInterfaceException
3823
     * @throws InvalidArgumentException
3824
     * @throws ReflectionException
3825
     */
3826
    public function activate_messenger_toggle()
3827
    {
3828
        $success = true;
3829
        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3830
        // let's check that we have required data
3831
        if (! isset($this->_req_data['messenger'])) {
3832
            EE_Error::add_error(
3833
                esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3834
                __FILE__,
3835
                __FUNCTION__,
3836
                __LINE__
3837
            );
3838
            $success = false;
3839
        }
3840
3841
        // do a nonce check here since we're not arriving via a normal route
3842
        $nonce = isset($this->_req_data['activate_nonce'])
3843
            ? sanitize_text_field($this->_req_data['activate_nonce'])
3844
            : '';
3845
        $nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3846
3847
        $this->_verify_nonce($nonce, $nonce_ref);
3848
3849
3850
        if (! isset($this->_req_data['status'])) {
3851
            EE_Error::add_error(
3852
                esc_html__(
3853
                    'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3854
                    'event_espresso'
3855
                ),
3856
                __FILE__,
3857
                __FUNCTION__,
3858
                __LINE__
3859
            );
3860
            $success = false;
3861
        }
3862
3863
        // do check to verify we have a valid status.
3864
        $status = $this->_req_data['status'];
3865
3866 View Code Duplication
        if ($status !== 'off' && $status !== 'on') {
3867
            EE_Error::add_error(
3868
                sprintf(
3869
                    esc_html__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3870
                    $this->_req_data['status']
3871
                ),
3872
                __FILE__,
3873
                __FUNCTION__,
3874
                __LINE__
3875
            );
3876
            $success = false;
3877
        }
3878
3879
        if ($success) {
3880
            // made it here?  Stop dawdling then!!
3881
            $success = $status === 'off'
3882
                ? $this->_deactivate_messenger($this->_req_data['messenger'])
3883
                : $this->_activate_messenger($this->_req_data['messenger']);
3884
        }
3885
3886
        $this->_template_args['success'] = $success;
3887
3888
        // no special instructions so let's just do the json return (which should automatically do all the special stuff).
3889
        $this->_return_json();
3890
    }
3891
3892
3893
    /**
3894
     * used by ajax from the messages settings page to activate|deactivate a message type
3895
     *
3896
     * @throws DomainException
3897
     * @throws EE_Error
3898
     * @throws ReflectionException
3899
     * @throws InvalidDataTypeException
3900
     * @throws InvalidInterfaceException
3901
     * @throws InvalidArgumentException
3902
     */
3903
    public function activate_mt_toggle()
3904
    {
3905
        $success = true;
3906
        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3907
3908
        // let's make sure we have the necessary data
3909
        if (! isset($this->_req_data['message_type'])) {
3910
            EE_Error::add_error(
3911
                esc_html__('Message Type name needed to toggle activation. None given', 'event_espresso'),
3912
                __FILE__,
3913
                __FUNCTION__,
3914
                __LINE__
3915
            );
3916
            $success = false;
3917
        }
3918
3919
        if (! isset($this->_req_data['messenger'])) {
3920
            EE_Error::add_error(
3921
                esc_html__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3922
                __FILE__,
3923
                __FUNCTION__,
3924
                __LINE__
3925
            );
3926
            $success = false;
3927
        }
3928
3929
        if (! isset($this->_req_data['status'])) {
3930
            EE_Error::add_error(
3931
                esc_html__(
3932
                    'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3933
                    'event_espresso'
3934
                ),
3935
                __FILE__,
3936
                __FUNCTION__,
3937
                __LINE__
3938
            );
3939
            $success = false;
3940
        }
3941
3942
3943
        // do check to verify we have a valid status.
3944
        $status = $this->_req_data['status'];
3945
3946 View Code Duplication
        if ($status !== 'activate' && $status !== 'deactivate') {
3947
            EE_Error::add_error(
3948
                sprintf(
3949
                    esc_html__('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3950
                    $this->_req_data['status']
3951
                ),
3952
                __FILE__,
3953
                __FUNCTION__,
3954
                __LINE__
3955
            );
3956
            $success = false;
3957
        }
3958
3959
3960
        // do a nonce check here since we're not arriving via a normal route
3961
        $nonce = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3962
        $nonce_ref = $this->_req_data['message_type'] . '_nonce';
3963
3964
        $this->_verify_nonce($nonce, $nonce_ref);
3965
3966
        if ($success) {
3967
            // made it here? um, what are you waiting for then?
3968
            $success = $status === 'deactivate'
3969
                ? $this->_deactivate_message_type_for_messenger(
3970
                    $this->_req_data['messenger'],
3971
                    $this->_req_data['message_type']
3972
                )
3973
                : $this->_activate_message_type_for_messenger(
3974
                    $this->_req_data['messenger'],
3975
                    $this->_req_data['message_type']
3976
                );
3977
        }
3978
3979
        $this->_template_args['success'] = $success;
3980
        $this->_return_json();
3981
    }
3982
3983
3984
    /**
3985
     * Takes care of processing activating a messenger and preparing the appropriate response.
3986
     *
3987
     * @param string $messenger_name The name of the messenger being activated
3988
     * @return bool
3989
     * @throws DomainException
3990
     * @throws EE_Error
3991
     * @throws InvalidArgumentException
3992
     * @throws ReflectionException
3993
     * @throws InvalidDataTypeException
3994
     * @throws InvalidInterfaceException
3995
     */
3996
    protected function _activate_messenger($messenger_name)
3997
    {
3998
        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3999
        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4000
        $message_types_to_activate = $active_messenger instanceof EE_Messenger
4001
            ? $active_messenger->get_default_message_types()
4002
            : array();
4003
4004
        // ensure is active
4005
        $this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
4006
4007
        // set response_data for reload
4008
        foreach ($message_types_to_activate as $message_type_name) {
4009
            /** @var EE_message_type $message_type */
4010
            $message_type = $this->_message_resource_manager->get_message_type($message_type_name);
4011 View Code Duplication
            if ($this->_message_resource_manager->is_message_type_active_for_messenger(
4012
                $messenger_name,
4013
                $message_type_name
4014
            )
4015
                && $message_type instanceof EE_message_type
4016
            ) {
4017
                $this->_template_args['data']['active_mts'][] = $message_type_name;
4018
                if ($message_type->get_admin_settings_fields()) {
4019
                    $this->_template_args['data']['mt_reload'][] = $message_type_name;
4020
                }
4021
            }
4022
        }
4023
4024
        // add success message for activating messenger
4025
        return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
4026
    }
4027
4028
4029
    /**
4030
     * Takes care of processing deactivating a messenger and preparing the appropriate response.
4031
     *
4032
     * @param string $messenger_name The name of the messenger being activated
4033
     * @return bool
4034
     * @throws DomainException
4035
     * @throws EE_Error
4036
     * @throws InvalidArgumentException
4037
     * @throws ReflectionException
4038
     * @throws InvalidDataTypeException
4039
     * @throws InvalidInterfaceException
4040
     */
4041
    protected function _deactivate_messenger($messenger_name)
4042
    {
4043
        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4044
        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4045
        $this->_message_resource_manager->deactivate_messenger($messenger_name);
4046
4047
        return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
4048
    }
4049
4050
4051
    /**
4052
     * Takes care of processing activating 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 activated for.
4055
     * @param string $message_type_name The name of the message type being activated 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 _activate_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_activate = $this->_message_resource_manager->get_message_type($message_type_name);
4070
4071
        // ensure is active
4072
        $this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
4073
4074
        // set response for load
4075 View Code Duplication
        if ($this->_message_resource_manager->is_message_type_active_for_messenger(
4076
            $messenger_name,
4077
            $message_type_name
4078
        )
4079
        ) {
4080
            $this->_template_args['data']['active_mts'][] = $message_type_name;
4081
            if ($message_type_to_activate->get_admin_settings_fields()) {
4082
                $this->_template_args['data']['mt_reload'][] = $message_type_name;
4083
            }
4084
        }
4085
4086
        return $this->_setup_response_message_for_activating_messenger_with_message_types(
4087
            $active_messenger,
4088
            $message_type_to_activate
4089
        );
4090
    }
4091
4092
4093
    /**
4094
     * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
4095
     *
4096
     * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
4097
     * @param string $message_type_name The name of the message type being deactivated for the messenger
4098
     * @return bool
4099
     * @throws DomainException
4100
     * @throws EE_Error
4101
     * @throws InvalidArgumentException
4102
     * @throws ReflectionException
4103
     * @throws InvalidDataTypeException
4104
     * @throws InvalidInterfaceException
4105
     */
4106
    protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
4107
    {
4108
        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
4109
        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
4110
        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
4111
        $message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
4112
        $this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
4113
4114
        return $this->_setup_response_message_for_deactivating_messenger_with_message_types(
4115
            $active_messenger,
4116
            $message_type_to_deactivate
4117
        );
4118
    }
4119
4120
4121
    /**
4122
     * This just initializes the defaults for activating messenger and message type responses.
4123
     */
4124
    protected function _prep_default_response_for_messenger_or_message_type_toggle()
4125
    {
4126
        $this->_template_args['data']['active_mts'] = array();
4127
        $this->_template_args['data']['mt_reload'] = array();
4128
    }
4129
4130
4131
    /**
4132
     * Setup appropriate response for activating a messenger and/or message types
4133
     *
4134
     * @param EE_messenger         $messenger
4135
     * @param EE_message_type|null $message_type
4136
     * @return bool
4137
     * @throws DomainException
4138
     * @throws EE_Error
4139
     * @throws InvalidArgumentException
4140
     * @throws ReflectionException
4141
     * @throws InvalidDataTypeException
4142
     * @throws InvalidInterfaceException
4143
     */
4144
    protected function _setup_response_message_for_activating_messenger_with_message_types(
4145
        $messenger,
4146
        EE_Message_Type $message_type = null
4147
    ) {
4148
        // if $messenger isn't a valid messenger object then get out.
4149
        if (! $messenger instanceof EE_Messenger) {
4150
            EE_Error::add_error(
4151
                esc_html__('The messenger being activated is not a valid messenger', 'event_espresso'),
4152
                __FILE__,
4153
                __FUNCTION__,
4154
                __LINE__
4155
            );
4156
4157
            return false;
4158
        }
4159
        // activated
4160
        if ($this->_template_args['data']['active_mts']) {
4161
            EE_Error::overwrite_success();
4162
            // activated a message type with the messenger
4163
            if ($message_type instanceof EE_message_type) {
4164
                EE_Error::add_success(
4165
                    sprintf(
4166
                        esc_html__(
4167
                            '%s message type has been successfully activated with the %s messenger',
4168
                            'event_espresso'
4169
                        ),
4170
                        ucwords($message_type->label['singular']),
4171
                        ucwords($messenger->label['singular'])
4172
                    )
4173
                );
4174
4175
                // if message type was invoice then let's make sure we activate the invoice payment method.
4176
                if ($message_type->name === 'invoice') {
4177
                    EE_Registry::instance()->load_lib('Payment_Method_Manager');
4178
                    $pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
4179
                    if ($pm instanceof EE_Payment_Method) {
4180
                        EE_Error::add_attention(
4181
                            esc_html__(
4182
                                '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.',
4183
                                'event_espresso'
4184
                            )
4185
                        );
4186
                    }
4187
                }
4188
                // just toggles the entire messenger
4189
            } else {
4190
                EE_Error::add_success(
4191
                    sprintf(
4192
                        esc_html__('%s messenger has been successfully activated', 'event_espresso'),
4193
                        ucwords($messenger->label['singular'])
4194
                    )
4195
                );
4196
            }
4197
4198
            return true;
4199
4200
            // possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
4201
            // message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
4202
            // in which case we just give a success message for the messenger being successfully activated.
4203
        } else {
4204
            if (! $messenger->get_default_message_types()) {
4205
                // messenger doesn't have any default message types so still a success.
4206
                EE_Error::add_success(
4207
                    sprintf(
4208
                        esc_html__('%s messenger was successfully activated.', 'event_espresso'),
4209
                        ucwords($messenger->label['singular'])
4210
                    )
4211
                );
4212
4213
                return true;
4214
            } else {
4215
                EE_Error::add_error(
4216
                    $message_type instanceof EE_message_type
4217
                        ? sprintf(
4218
                            esc_html__(
4219
                                '%s message type was not successfully activated with the %s messenger',
4220
                                'event_espresso'
4221
                            ),
4222
                            ucwords($message_type->label['singular']),
4223
                            ucwords($messenger->label['singular'])
4224
                        )
4225
                        : sprintf(
4226
                            esc_html__('%s messenger was not successfully activated', 'event_espresso'),
4227
                            ucwords($messenger->label['singular'])
4228
                        ),
4229
                    __FILE__,
4230
                    __FUNCTION__,
4231
                    __LINE__
4232
                );
4233
4234
                return false;
4235
            }
4236
        }
4237
    }
4238
4239
4240
    /**
4241
     * This sets up the appropriate response for deactivating a messenger and/or message type.
4242
     *
4243
     * @param EE_messenger         $messenger
4244
     * @param EE_message_type|null $message_type
4245
     * @return bool
4246
     * @throws DomainException
4247
     * @throws EE_Error
4248
     * @throws InvalidArgumentException
4249
     * @throws ReflectionException
4250
     * @throws InvalidDataTypeException
4251
     * @throws InvalidInterfaceException
4252
     */
4253
    protected function _setup_response_message_for_deactivating_messenger_with_message_types(
4254
        $messenger,
4255
        EE_message_type $message_type = null
4256
    ) {
4257
        EE_Error::overwrite_success();
4258
4259
        // if $messenger isn't a valid messenger object then get out.
4260
        if (! $messenger instanceof EE_Messenger) {
4261
            EE_Error::add_error(
4262
                esc_html__('The messenger being deactivated is not a valid messenger', 'event_espresso'),
4263
                __FILE__,
4264
                __FUNCTION__,
4265
                __LINE__
4266
            );
4267
4268
            return false;
4269
        }
4270
4271
        if ($message_type instanceof EE_message_type) {
4272
            $message_type_name = $message_type->name;
4273
            EE_Error::add_success(
4274
                sprintf(
4275
                    esc_html__(
4276
                        '%s message type has been successfully deactivated for the %s messenger.',
4277
                        'event_espresso'
4278
                    ),
4279
                    ucwords($message_type->label['singular']),
4280
                    ucwords($messenger->label['singular'])
4281
                )
4282
            );
4283
        } else {
4284
            $message_type_name = '';
4285
            EE_Error::add_success(
4286
                sprintf(
4287
                    esc_html__('%s messenger has been successfully deactivated.', 'event_espresso'),
4288
                    ucwords($messenger->label['singular'])
4289
                )
4290
            );
4291
        }
4292
4293
        // if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
4294
        if ($messenger->name === 'html' || $message_type_name === 'invoice') {
4295
            EE_Registry::instance()->load_lib('Payment_Method_Manager');
4296
            $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
4297
            if ($count_updated > 0) {
4298
                $msg = $message_type_name === 'invoice'
4299
                    ? esc_html__(
4300
                        '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.',
4301
                        'event_espresso'
4302
                    )
4303
                    : esc_html__(
4304
                        '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.',
4305
                        'event_espresso'
4306
                    );
4307
                EE_Error::add_attention($msg);
4308
            }
4309
        }
4310
4311
        return true;
4312
    }
4313
4314
4315
    /**
4316
     * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
4317
     *
4318
     * @throws DomainException
4319
     */
4320
    public function update_mt_form()
4321
    {
4322
        if (! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
4323
            EE_Error::add_error(
4324
                esc_html__('Require message type or messenger to send an updated form', 'event_espresso'),
4325
                __FILE__,
4326
                __FUNCTION__,
4327
                __LINE__
4328
            );
4329
            $this->_return_json();
4330
        }
4331
4332
        $message_types = $this->get_installed_message_types();
4333
4334
        $message_type = $message_types[ $this->_req_data['message_type'] ];
4335
        $messenger = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
4336
4337
        $content = $this->_message_type_settings_content(
4338
            $message_type,
4339
            $messenger,
4340
            true
4341
        );
4342
        $this->_template_args['success'] = true;
4343
        $this->_template_args['content'] = $content;
4344
        $this->_return_json();
4345
    }
4346
4347
4348
    /**
4349
     * this handles saving the settings for a messenger or message type
4350
     *
4351
     */
4352
    public function save_settings()
4353
    {
4354 View Code Duplication
        if (! isset($this->_req_data['type'])) {
4355
            EE_Error::add_error(
4356
                esc_html__(
4357
                    'Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
4358
                    'event_espresso'
4359
                ),
4360
                __FILE__,
4361
                __FUNCTION__,
4362
                __LINE__
4363
            );
4364
            $this->_template_args['error'] = true;
4365
            $this->_return_json();
4366
        }
4367
4368
4369
        if ($this->_req_data['type'] === 'messenger') {
4370
            // this should be an array.
4371
            $settings = $this->_req_data['messenger_settings'];
4372
            $messenger = $settings['messenger'];
4373
            // let's setup the settings data
4374 View Code Duplication
            foreach ($settings as $key => $value) {
4375
                switch ($key) {
4376
                    case 'messenger':
4377
                        unset($settings['messenger']);
4378
                        break;
4379
                    case 'message_types':
4380
                        unset($settings['message_types']);
4381
                        break;
4382
                    default:
4383
                        $settings[ $key ] = $value;
4384
                        break;
4385
                }
4386
            }
4387
            $this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
4388
        } elseif ($this->_req_data['type'] === 'message_type') {
4389
            $settings = $this->_req_data['message_type_settings'];
4390
            $messenger = $settings['messenger'];
4391
            $message_type = $settings['message_type'];
4392
4393 View Code Duplication
            foreach ($settings as $key => $value) {
4394
                switch ($key) {
4395
                    case 'messenger':
4396
                        unset($settings['messenger']);
4397
                        break;
4398
                    case 'message_type':
4399
                        unset($settings['message_type']);
4400
                        break;
4401
                    default:
4402
                        $settings[ $key ] = $value;
4403
                        break;
4404
                }
4405
            }
4406
4407
            $this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
4408
        }
4409
4410
        // okay we should have the data all setup.  Now we just update!
4411
        $success = $this->_message_resource_manager->update_active_messengers_option();
4412
4413 View Code Duplication
        if ($success) {
4414
            EE_Error::add_success(__('Settings updated', 'event_espresso'));
4415
        } else {
4416
            EE_Error::add_error(
4417
                esc_html__(
4418
                    'Settings did not get updated',
4419
                    'event_espresso'
4420
                ),
4421
                __FILE__,
4422
                __FUNCTION__,
4423
                __LINE__
4424
            );
4425
        }
4426
4427
        $this->_template_args['success'] = $success;
4428
        $this->_return_json();
4429
    }
4430
4431
4432
4433
4434
    /**  EE MESSAGE PROCESSING ACTIONS **/
4435
4436
4437
    /**
4438
     * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
4439
     * However, this does not send immediately, it just queues for sending.
4440
     *
4441
     * @since 4.9.0
4442
     * @throws EE_Error
4443
     * @throws InvalidDataTypeException
4444
     * @throws InvalidInterfaceException
4445
     * @throws InvalidArgumentException
4446
     * @throws ReflectionException
4447
     */
4448
    protected function _generate_now()
4449
    {
4450
        EED_Messages::generate_now($this->_get_msg_ids_from_request());
4451
        $this->_redirect_after_action(false, '', '', array(), true);
4452
    }
4453
4454
4455
    /**
4456
     * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
4457
     * are EEM_Message::status_resend or EEM_Message::status_idle
4458
     *
4459
     * @since 4.9.0
4460
     * @throws EE_Error
4461
     * @throws InvalidDataTypeException
4462
     * @throws InvalidInterfaceException
4463
     * @throws InvalidArgumentException
4464
     * @throws ReflectionException
4465
     */
4466
    protected function _generate_and_send_now()
4467
    {
4468
        EED_Messages::generate_and_send_now($this->_get_msg_ids_from_request());
4469
        $this->_redirect_after_action(false, '', '', array(), true);
4470
    }
4471
4472
4473
    /**
4474
     * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
4475
     *
4476
     * @since 4.9.0
4477
     * @throws EE_Error
4478
     * @throws InvalidDataTypeException
4479
     * @throws InvalidInterfaceException
4480
     * @throws InvalidArgumentException
4481
     * @throws ReflectionException
4482
     */
4483
    protected function _queue_for_resending()
4484
    {
4485
        EED_Messages::queue_for_resending($this->_get_msg_ids_from_request());
4486
        $this->_redirect_after_action(false, '', '', array(), true);
4487
    }
4488
4489
4490
    /**
4491
     *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
4492
     *
4493
     * @since 4.9.0
4494
     * @throws EE_Error
4495
     * @throws InvalidDataTypeException
4496
     * @throws InvalidInterfaceException
4497
     * @throws InvalidArgumentException
4498
     * @throws ReflectionException
4499
     */
4500
    protected function _send_now()
4501
    {
4502
        EED_Messages::send_now($this->_get_msg_ids_from_request());
4503
        $this->_redirect_after_action(false, '', '', array(), true);
4504
    }
4505
4506
4507
    /**
4508
     * Deletes EE_messages for IDs in the request.
4509
     *
4510
     * @since 4.9.0
4511
     * @throws EE_Error
4512
     * @throws InvalidDataTypeException
4513
     * @throws InvalidInterfaceException
4514
     * @throws InvalidArgumentException
4515
     */
4516
    protected function _delete_ee_messages()
4517
    {
4518
        $msg_ids = $this->_get_msg_ids_from_request();
4519
        $deleted_count = 0;
4520
        foreach ($msg_ids as $msg_id) {
4521
            if (EEM_Message::instance()->delete_by_ID($msg_id)) {
4522
                $deleted_count++;
4523
            }
4524
        }
4525
        if ($deleted_count) {
4526
            EE_Error::add_success(
4527
                esc_html(
4528
                    _n(
4529
                        'Message successfully deleted',
4530
                        'Messages successfully deleted',
4531
                        $deleted_count,
4532
                        'event_espresso'
4533
                    )
4534
                )
4535
            );
4536
            $this->_redirect_after_action(
4537
                false,
4538
                '',
4539
                '',
4540
                array(),
4541
                true
4542
            );
4543
        } else {
4544
            EE_Error::add_error(
4545
                _n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
4546
                __FILE__,
4547
                __FUNCTION__,
4548
                __LINE__
4549
            );
4550
            $this->_redirect_after_action(false, '', '', array(), true);
4551
        }
4552
    }
4553
4554
4555
    /**
4556
     *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
4557
     *
4558
     * @since 4.9.0
4559
     * @return array
4560
     */
4561
    protected function _get_msg_ids_from_request()
4562
    {
4563
        if (! isset($this->_req_data['MSG_ID'])) {
4564
            return array();
4565
        }
4566
4567
        return is_array($this->_req_data['MSG_ID'])
4568
            ? array_keys($this->_req_data['MSG_ID'])
4569
            : array($this->_req_data['MSG_ID']);
4570
    }
4571
}
4572