PluginProbe
Booking Calendar / 10.1.3
Booking Calendar v10.1.3
11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 10.11.2 All 203 releases
booking / core / admin / page-email-trash.php

page-email-trash.php in Booking Calendar 10.1.3, at core/admin/page-email-trash.php

1,063 lines 59.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version 1.0
4 * @package Content
5 * @category Menu
6 * @author wpdevelop
7 *
8 * @web-site https://wpbookingcalendar.com/
9 * @email info@wpbookingcalendar.com
10 *
11 * @modified 2016-12-09
12 */
13
14 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
15
16
17 if ( ! defined( 'WPBC_EMAIL_TRASH_PREFIX' ) ) define( 'WPBC_EMAIL_TRASH_PREFIX', 'booking_email_' ); // Its defined in api-emails.php file & its same for all emails, here its used only for easy coding...
18
19 if ( ! defined( 'WPBC_EMAIL_TRASH_ID' ) ) define( 'WPBC_EMAIL_TRASH_ID', 'trash' ); /* Define Name of Email Template.
20 Note. Prefix "booking_email_" defined in api-emails.php file.
21 Full name of option is - "booking_email_trash"
22 Other email templates names:
23 - 'new_admin'
24 - 'new_visitor'
25 - 'approved'
26 - 'deny' -- pending, trash, deleted
27 - 'payment_request'
28 - 'modification'
29 */
30
31
32 require_once( WPBC_PLUGIN_DIR . '/core/any/api-emails.php' ); // API
33
34
35
36 // <editor-fold defaultstate="collapsed" desc=" Import Old Data " >
37
38 function wpbc_import6_is_old_email_trash_exist() {
39
40 $is_old_data_exist = get_bk_option( 'booking_email_deny_content' );
41
42 if ( ! empty( $is_old_data_exist ) ) // Check if Old data exist
43 return true;
44 else
45 return false;
46 }
47
48 function wpbc_import6_get_old_email_trash_data() {
49
50 $default_values = array();
51 if ( wpbc_import6_is_old_email_trash_exist() ) {
52
53 $default_values['enabled'] = get_bk_option( 'booking_is_email_deny_adress' );
54 $default_values['copy_to_admin'] = get_bk_option( 'booking_is_email_deny_send_copy_to_admin' ); //Parse it to Name and Email
55 $default_values['from'] = get_bk_option( 'booking_email_deny_adress' ); //Parse it to Name and Email, relpace [visitoremail]
56 $default_values['subject'] = get_bk_option( 'booking_email_deny_subject' );
57 $default_values['content'] = get_bk_option( 'booking_email_deny_content' );
58
59 }
60 return $default_values;
61 }
62
63
64 function wpbc_import6_is_new_email_trash_exist() {
65
66 $is_data_exist = get_bk_option( WPBC_EMAIL_TRASH_PREFIX . WPBC_EMAIL_TRASH_ID ); // ''booking_email_' - defined in api-emails.php file.
67
68 if ( ! empty( $is_data_exist ) ) // Check if data exist
69 return true;
70 else
71 return false;
72 }
73
74
75 function wpbc_import6_email__trash__get_fields_array_for_activation() {
76
77
78 if ( ! wpbc_import6_is_new_email_trash_exist() ) { // New Email Template NOT exist
79
80 // Import
81 $old_data = wpbc_import6_get_old_email_trash_data();
82 if ( ! empty( $old_data ) ) { // Get Old data
83
84 /*
85 $old_data = [
86 [enabled] => On
87 [to] => "Booking system" <beta@wpbookingcalendar.com>
88 [from] => [visitoremail]
89 [subject] => New booking
90 [content] => You need to approve a new booking [bookingtype] for: [dates]<br/><br/> Person detail information:<br/> [content]<br/><br/> Currently a new booking is waiting for approval. Please visit the moderation panel [moderatelink]<br/><br/>Thank you, Beta<br/>[siteurl]
91 ]
92 wpbc_get_email_parts() >>> return [
93 [email] => beta@wpbookingcalendar.com
94 [title] => Booking system
95 [original] => "Booking system"
96 [original_to_show] => "Booking system" <beta@wpbookingcalendar.com>
97 ]
98 */
99
100 // Make transform - emails
101 // $email_to = wpbc_get_email_parts( $old_data['to'] );
102 $email_from = wpbc_get_email_parts( $old_data['from'] );
103
104 // $old_data['to'] = $email_to['email']; // 'beta@wpbookingcalendar.com' // booking_email_reservation_adress
105 // $old_data['to_name'] = $email_to['title']; // 'Booking system' // booking_email_reservation_adress
106 /* Description of Code.
107 * Here we replacing any shortcodes, like [visitoremail] to get_option( 'admin_email' )
108 * because we are setting in header "Reply-To" visitor emil from the booking form - its exist by hook for this email template at the wpbc-emails.php file
109 *
110 * Here we need to use for field "From" email with DNS same as DNS in the website. In most cases its have to be the get_option( 'admin_email' )
111 *
112 * After parsing with wpbc_get_email_parts, if we was have [visitoremail] in this field, then $email_from['email'] will be empty. So we check it and set admin email.
113 *
114 */
115 $old_data['from'] = ( empty( $email_from['email'] ) ? get_option( 'admin_email' ) /*$email_from['original']*/ : $email_from['email'] ); // [visitoremail] | email@server.com // booking_email_reservation_from_adress
116 $old_data['from_name'] = $email_from['title']; // [visitoremail] | 'Booking System' | '' // booking_email_reservation_from_adress
117
118 // $old_data['subject'] = html_entity_decode( $old_data['subject'] );
119 // $old_data['content'] = html_entity_decode( $old_data['content'] );
120 }
121
122 // Default
123 $init_fields_values = $old_data;
124 $mail_api = new WPBC_Emails_API_Trash( WPBC_EMAIL_TRASH_ID , $init_fields_values );
125
126 $default_fields_in_settings = $mail_api->get_default_values() ; // Get default fields values, from settings - defined in function init_settings_fields {class WPBC_Emails_API_Trash}
127
128 $fields_values = wp_parse_args( $old_data, $default_fields_in_settings );
129
130 return array( WPBC_EMAIL_TRASH_PREFIX . WPBC_EMAIL_TRASH_ID => $fields_values );
131
132 /*
133 Array (
134 [booking_email_trash] => Array
135 (
136 [enabled] => On
137 [to] => beta@wpbookingcalendar.com
138 [to_name] => Booking system
139 [from] => admin@wpbookingcalendar.com
140 [from_name] =>
141 [subject] => New booking
142 [content] => You need to approve a new booking [bookingtype] for: [dates]...
143 [header_content] =>
144 [footer_content] =>
145 [template_file] => plain
146 [base_color] => #557da1
147 [background_color] => #f5f5f5
148 [body_color] => #fdfdfd
149 [text_color] => #505050
150 [email_content_type] => html
151 )
152 )
153
154 // $mail_api->save_to_db( $fields_values );
155
156 */
157
158 } else { // New Email Template is Exist - return empty array(), its will make loading of data from DB, during activation Mail API class.
159 return array( WPBC_EMAIL_TRASH_PREFIX . WPBC_EMAIL_TRASH_ID => array() );
160 }
161 }
162 // </editor-fold>
163
164
165
166 /** Email F i e l d s */
167 class WPBC_Emails_API_Trash extends WPBC_Emails_API { // O v e r r i d i n g "WPBC_Emails_API" ClASS
168
169
170 /** Overrided functions - define Email Fields & Values */
171 public function init_settings_fields() {
172
173 $this->fields = array();
174
175 $this->fields['enabled'] = array(
176 'type' => 'checkbox'
177 , 'default' => 'On'
178 , 'title' => __('Enable / Disable', 'booking')
179 , 'label' => __('Enable this email notification', 'booking')
180 , 'description' => ''
181 , 'group' => 'general'
182
183 );
184
185
186
187 $this->fields['copy_to_admin'] = array(
188 'type' => 'checkbox'
189 , 'default' => 'Off'
190 , 'title' => __('Copy(ies)', 'booking') //FixIn: 8.1.2.17.1
191 , 'label' => __('Enable / disable sending email(s) to additional addresses', 'booking') . ' (admin@; sales@; others@)' //FixIn: 8.1.2.17.1
192 , 'description' => ''
193 , 'group' => 'general'
194
195 );
196
197 //FixIn: 8.1.2.17
198 $this->fields['to_html_prefix'] = array(
199 'type' => 'pure_html'
200 , 'group' => 'general'
201 , 'html' => '<tr valign="top" class="wpbc_tr_copy_to_admin_to">
202 <th scope="row">
203 <label class="wpbc-form-email" for="'
204 . esc_attr( 'approved_to' )
205 . '">' . wp_kses_post( __('To' ,'booking') ) . ' (' . strtolower( __('Copy(ies)', 'booking') ). ')' //FixIn: 8.1.2.17.1
206 . '</label>
207 </th>
208 <td><fieldset style="float:left;width:50%;margin-right:5%;">'
209 );
210 $this->fields['to'] = array(
211 'type' => 'text' // We are using here 'text' and not 'email', for ability to save several comma seperated emails.
212 , 'default' => get_option( 'admin_email' )
213 //, 'placeholder' => ''
214 , 'title' => ''
215 , 'description' => __('Email Address', 'booking') . '. ' . __('Required', 'booking') . '. '
216 . __('You can put multiple emails separated by', 'booking') . ' <code>;</code>' //FixIn: 8.1.2.17.1
217 , 'description_tag' => ''
218 , 'css' => 'width:100%'
219 , 'group' => 'general'
220 , 'tr_class' => ''
221 , 'only_field' => true
222 , 'validate_as' => array( )
223 );
224 $this->fields['to_html_middle'] = array(
225 'type' => 'pure_html'
226 , 'group' => 'general'
227 , 'html' => '</fieldset><fieldset style="float:left;width:45%;">'
228 );
229 $this->fields['to_name'] = array(
230 'type' => 'text'
231 , 'default' => 'Booking system'
232 //, 'placeholder' => ''
233 , 'title' => ''
234 , 'description' => __('Title', 'booking') . ' (' . __('optional', 'booking') . ').' //. ' ' . __('If empty then title defined as WordPress', 'booking')
235 , 'description_tag' => ''
236 , 'css' => 'width:100%'
237 , 'group' => 'general'
238 , 'tr_class' => ''
239 , 'only_field' => true
240 );
241 $this->fields['to_html_sufix'] = array(
242 'type' => 'pure_html'
243 , 'group' => 'general'
244 , 'html' => ' </fieldset>
245 </td>
246 </tr>'
247 );
248
249 $this->fields['to_hr'] = array( 'type' => 'hr' );
250 /**/
251 //FixIn: 8.1.2.17 - END
252
253
254
255 $this->fields['from_html_prefix'] = array(
256 'type' => 'pure_html'
257 , 'group' => 'general'
258 , 'html' => '<tr valign="top">
259 <th scope="row">
260 <label class="wpbc-form-email" for="'
261 . esc_attr( 'trash_from' )
262 . '">' . wp_kses_post( __('From' ,'booking') )
263 . '</label>
264 </th>
265 <td><fieldset style="float:left;width:50%;margin-right:5%;">'
266 );
267
268 //$activated_user = apply_bk_filter( 'wpbc_is_user_in_activation_process' );
269 //if ( $activated_user === false ) { // Users activation
270 // $user_bk_email = get_user_option('user_email', $activated_user );
271 //}
272 $this->fields['from'] = array(
273 'type' => 'email' // Its can be only 1 email, so check it as Email field.
274 , 'default' => get_option( 'admin_email' )
275 //, 'placeholder' => ''
276 , 'title' => ''
277 , 'description' => __('Email Address', 'booking') . '. ' . __('Required', 'booking') . '.'
278 , 'description_tag' => ''
279 , 'css' => 'width:100%'
280 , 'group' => 'general'
281 , 'tr_class' => ''
282 , 'only_field' => true
283 , 'validate_as' => array( 'required' )
284 );
285 $this->fields['from_html_middle'] = array(
286 'type' => 'pure_html'
287 , 'group' => 'general'
288 , 'html' => '</fieldset><fieldset style="float:left;width:45%;">'
289 );
290 $this->fields['from_name'] = array(
291 'type' => 'text'
292 , 'default' => 'Booking system'
293 //, 'placeholder' => ''
294 , 'title' => ''
295 , 'description' => __('Title', 'booking') . ' (' . __('optional', 'booking') . ').' //. ' ' . __('If empty then title defined as WordPress', 'booking')
296 , 'description_tag' => ''
297 , 'css' => 'width:100%'
298 , 'group' => 'general'
299 , 'tr_class' => ''
300 , 'only_field' => true
301 );
302 $this->fields['from_html_sufix'] = array(
303 'type' => 'pure_html'
304 , 'group' => 'general'
305 , 'html' => ' </fieldset>
306 </td>
307 </tr>'
308 );
309
310
311
312
313
314 $this->fields['subject_before'] = array(
315 'type' => 'pure_html'
316 , 'group' => 'general_content'
317 , 'html' => '<tr><td colspan="2">'
318 .'<div style="margin: 0 0 15px;font-weight: 600;">'
319 .'<label class="wpbc-form-email-subject" for="' . WPBC_EMAIL_TRASH_ID . '_subject">' .
320 __( 'Subject', 'booking' )
321 . '</label></div>'
322 );
323 $this->fields['subject'] = array(
324 'type' => 'text'
325 , 'default' => __( 'Your booking has been declined', 'booking' )
326 //, 'placeholder' => ''
327 , 'title' => __('Subject', 'booking')
328 , 'description' => ''
329 , 'description_tag' => ''
330 , 'css' => 'width:100%;font-size:16px;line-height:34px;font-weight:600;'
331 , 'group' => 'general_content'
332 , 'tr_class' => ''
333 , 'validate_as' => array( 'required' )
334 , 'only_field' => true
335 );
336 $this->fields['subject_after'] = array( 'type' => 'pure_html', 'group' => 'general_content',
337 'html' => '<p style="text-align: right;font-size:12px;">'
338 . sprintf(__('Type your email %ssubject%s for the booking confirmation message.' ,'booking'),'<b>','</b>') . ' ' . __('Required', 'booking')
339 . '.</p>' . '</td></tr>' );
340
341 $blg_title = get_option( 'blogname' );
342 $blg_title = str_replace( array( '"', "'" ), '', $blg_title );
343
344 $email_content = sprintf( __( 'Your booking %s for: %s has been canceled. %sThank you, %s', 'booking' ), '[bookingtype]', '[dates]', '<br/>[denyreason]<br/><br/>[content]<br/><br/>', $blg_title . '<br/>[siteurl]' );
345
346 $this->fields['content_before'] = array(
347 'type' => 'pure_html',
348 'group' => 'general_content',
349 'html' => '<tr><td colspan="2" style="padding-bottom:0;">'
350 . '<div style="margin: 0;font-weight: 600;">'
351 . '<label class="wpbc-form-email-content" for="' . WPBC_EMAIL_TRASH_ID . '_content">' .
352 __( 'Content', 'booking' )
353 . '</label></div>'
354 );
355 $this->fields['content'] = array(
356 'type' => 'wp_textarea'
357 , 'default' => $email_content
358 //, 'placeholder' => ''
359 , 'title' => __('Content', 'booking')
360 , 'description' => ''//__('Type your email message content. ', 'booking')
361 , 'description_tag' => ''
362 , 'css' => ''
363 , 'group' => 'general_content'
364 , 'tr_class' => ''
365 , 'rows' => 17
366 , 'show_in_2_cols' => true
367 , 'only_field' => true
368 );
369 $this->fields['content_after'] = array( 'type' => 'pure_html', 'group' => 'general_content', 'html' => '</td></tr>' );
370 // $this->fields['content'] = htmlspecialchars( $this->fields['content'] );// Convert > to &gt;
371 // $this->fields['content'] = html_entity_decode( $this->fields['content'] );// Convert &gt; to >
372
373
374
375 ////////////////////////////////////////////////////////////////////
376 // Style
377 ////////////////////////////////////////////////////////////////////
378
379
380 $this->fields['header_content'] = array(
381 'type' => 'textarea'
382 , 'default' => ''
383 , 'title' => __('Email Heading', 'booking')
384 , 'description' => __('Enter main heading contained within the email notification.', 'booking')
385 //, 'placeholder' => ''
386 , 'rows' => 2
387 , 'css' => "width:100%;"
388 , 'group' => 'parts'
389 );
390 $this->fields['footer_content'] = array(
391 'type' => 'textarea'
392 , 'default' => ''
393 , 'title' => __('Email Footer Text', 'booking')
394 , 'description' => __('Enter text contained within footer of the email notification', 'booking')
395 //, 'placeholder' => ''
396 , 'rows' => 2
397 , 'css' => 'width:100%;'
398 , 'group' => 'parts'
399 );
400
401 $this->fields['template_file'] = array(
402 'type' => 'select'
403 , 'default' => 'plain'
404 , 'title' => __('Email template', 'booking')
405 , 'description' => __('Choose email template.', 'booking')
406 , 'description_tag' => 'span'
407 , 'css' => ''
408 , 'options' => array(
409 'plain' => __('Plain (without styles)', 'booking')
410 , 'standard' => __('Standard 1 column', 'booking')
411 )
412 , 'group' => 'style'
413 );
414
415 $this->fields['template_file_help'] = array(
416 'type' => 'help'
417 , 'value' => array( sprintf( __('You can override this email template in this folder %s', 'booking')
418 , '<code>' . realpath( dirname(__FILE__) . '/../any/emails_tpl/' ) . '</code>' )
419 )
420 , 'cols' => 2
421 , 'group' => 'style'
422 );
423
424 $this->fields['base_color'] = array(
425 'type' => 'color'
426 , 'default' => '#557da1'
427 , 'title' => __('Base Color', 'booking')
428 , 'description' => __('The base color for email templates.', 'booking')
429 . ' ' . __('Default color', 'booking') .': <code>#557da1</code>.'
430 , 'group' => 'style'
431 , 'tr_class' => 'template_colors'
432 );
433 $this->fields['background_color'] = array(
434 'type' => 'color'
435 , 'default' => '#f5f5f5'
436 , 'title' => __('Background Color', 'booking')
437 , 'description' => __('The background color for email templates.', 'booking')
438 . ' ' . __('Default color', 'booking') .': <code>#f5f5f5</code>.'
439 , 'group' => 'style'
440 , 'tr_class' => 'template_colors'
441 );
442 $this->fields['body_color'] = array(
443 'type' => 'color'
444 , 'default' => '#fdfdfd'
445 , 'title' => __('Email Body Background Color', 'booking')
446 , 'description' => __('The main body background color for email templates.', 'booking')
447 . ' ' . __('Default color', 'booking') .': <code>#fdfdfd</code>.'
448 , 'group' => 'style'
449 , 'tr_class' => 'template_colors'
450 );
451 $this->fields['text_color'] = array(
452 'type' => 'color'
453 , 'default' => '#505050'
454 , 'title' => __('Email Body Text Colour', 'booking')
455 , 'description' => __('The main body text color for email templates.', 'booking')
456 . ' ' . __('Default color', 'booking') .': <code>#505050</code>.'
457 , 'group' => 'style'
458 , 'tr_class' => 'template_colors'
459 );
460
461
462 ////////////////////////////////////////////////////////////////////
463 // Email format: Plain, HTML, MultiPart
464 ////////////////////////////////////////////////////////////////////
465
466
467 $this->fields['email_content_type'] = array(
468 'type' => 'select'
469 , 'default' => 'plain'
470 , 'title' => __('Email format', 'booking')
471 , 'description' => __('Choose which format of email to send.', 'booking')
472 , 'description_tag' => 'p'
473 , 'css' => 'width:100%;'
474 , 'options' => array(
475 'plain' => __('Plain text', 'booking')
476 // , 'html' => __('HTML', 'booking')
477 // , 'multipart' => __('Multipart', 'booking')
478 )
479 , 'group' => 'email_content_type'
480 );
481 if ( class_exists( 'DOMDocument' ) ) {
482 $this->fields['email_content_type']['options']['html'] = __('HTML', 'booking');
483 $this->fields['email_content_type']['options']['multipart'] = __('Multipart', 'booking');
484
485 $this->fields['email_content_type']['default'] = 'html';
486 }
487
488
489
490 ////////////////////////////////////////////////////////////////////
491 // Help
492 ////////////////////////////////////////////////////////////////////
493
494 $this->fields['content_help'] = array(
495 'type' => 'help'
496 , 'value' => array()
497 , 'cols' => 2
498 , 'group' => 'help'
499 , 'css' => 'padding-right: 10px !important;max-height: 598px;overflow: auto;'
500 , 'only_field' => true
501 );
502
503 $skip_shortcodes = array(
504 // 'denyreason'
505 'moderatelink'
506 , 'paymentreason'
507 , 'visitorbookingediturl'
508 //, 'visitorbookingslisting' //FixIn: 8.1.3.5.1
509 , 'visitorbookingcancelurl'
510 , 'visitorbookingpayurl'
511 , 'add_to_google_cal_button' //FixIn: 9.6.3.8
512 );
513 $email_example = sprintf(__('For example: "You have a new reservation %s on the following date(s): %s Contact information: %s You can approve or cancel this booking at: %s Thank you, Reservation service."' ,'booking'),'','[dates]&lt;br/&gt;&lt;br/&gt;','&lt;br/&gt; [content]&lt;br/&gt;&lt;br/&gt;', htmlentities( ' <a href="[moderatelink]">'.__('here' ,'booking').'</a> ') . '&lt;br/&gt;&lt;br/&gt; ');
514
515 $help_fields = wpbc_get_email_help_shortcodes( $skip_shortcodes, $email_example );
516
517 foreach ( $help_fields as $help_fields_key => $help_fields_value ) {
518 $this->fields['content_help']['value'][] = $help_fields_value;
519 }
520
521 }
522
523 }
524
525
526
527 /** Settings Emails P a g e */
528 class WPBC_Settings_Page_Email_Trash extends WPBC_Page_Structure {
529
530 public $email_settings_api = false;
531
532
533 /**
534 * Define interface for Email API
535 *
536 * @param string $selected_email_name - name of Email template
537 * @param array $init_fields_values - array of init form fields data
538 * @return object Email API
539 */
540 public function mail_api( $selected_email_name ='', $init_fields_values = array() ){
541
542 if ( $this->email_settings_api === false ) {
543 $this->email_settings_api = new WPBC_Emails_API_Trash( $selected_email_name , $init_fields_values );
544 }
545
546 return $this->email_settings_api;
547 }
548
549
550 public function in_page() { // P a g e t a g
551 return 'wpbc-settings';
552 }
553
554
555 public function tabs() { // T a b s A r r a y
556
557 $tabs = array();
558
559 // $tabs[ 'email' ] = array(
560 // 'title' => __( 'Emails', 'booking') // Title of TAB
561 // , 'page_title'=> __( 'Emails Settings', 'booking') // Title of Page
562 // , 'hint' => __( 'Emails Settings', 'booking') // Hint
563 // //, 'link' => '' // Can be skiped, then generated link based on Page and Tab tags. Or can be extenral link
564 // //, 'position' => '' // 'left' || 'right' || ''
565 // //, 'css_classes'=> '' // CSS class(es)
566 // //, 'icon' => '' // Icon - link to the real PNG img
567 // , 'font_icon' => 'wpbc_icn_mail_outline' // CSS definition of forn Icon
568 // //, 'default' => false // Is this tab activated by default or not: true || false.
569 // //, 'disabled' => false // Is this tab disbaled: true || false.
570 // //, 'hided' => false // Is this tab hided: true || false.
571 // , 'subtabs' => array()
572 // );
573
574 $subtabs = array();
575
576
577 $is_data_exist = get_bk_option( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_TRASH_ID );
578 if ( ( ! empty( $is_data_exist ) ) && ( isset( $is_data_exist['copy_to_admin'] ) ) && ( $is_data_exist['copy_to_admin'] == 'On' ) )
579 $sufix = '<sup> 2</sup>';
580 else
581 $sufix = '';
582
583
584 $subtabs['trash'] = array(
585 'type' => 'subtab' // Required| Possible values: 'subtab' | 'separator' | 'button' | 'goto-link' | 'html'
586 , 'title' => '<span>' . __( 'Trash / Reject', 'booking' ) . $sufix . '</span>' // Title of TAB
587 , 'page_title' => __('Emails Settings', 'booking') // Title of Page
588 , 'hint' => __('Customization of email template, which is sent to Visitor after rejecting of booking' ,'booking') //FixIn: 8.1.2.17.1
589 , 'link' => '' // link
590 , 'position' => '' // 'left' || 'right' || ''
591 , 'css_classes' => 'wpbc_navigation_top_border' // CSS class(es)
592 //, 'icon' => 'http://.../icon.png' // Icon - link to the real PNG img
593 //, 'font_icon' => 'wpbc_icn_mail_outline' // CSS definition of Font Icon
594 , 'header_font_icon' => 'wpbc_icn_mail_outline' // CSS definition of Font Icon //FixIn: 9.6.1.4
595 , 'default' => false // Is this sub tab activated by default or not: true || false.
596 , 'disabled' => false // Is this sub tab deactivated: true || false.
597 , 'checkbox' => false // or definition array for specific checkbox: array( 'checked' => true, 'name' => 'feature1_active_status' ) //, 'checkbox' => array( 'checked' => $is_checked, 'name' => 'enabled_active_status' )
598 , 'content' => 'content' // Function to load as conten of this TAB
599 , 'is_use_left_navigation' => true
600 , 'show_checked_icon' => true
601 , 'checked_data' => WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_TRASH_ID // This is where we get content
602 );
603
604 $tabs[ 'email' ]['subtabs'] = $subtabs;
605
606 return $tabs;
607 }
608
609
610 /** Show Content of Settings page */
611 public function content() {
612 $this->css();
613
614 // -------------------------------------------------------------------------------------------------------------
615 // Checking
616 // -------------------------------------------------------------------------------------------------------------
617 do_action( 'wpbc_hook_settings_page_header', 'emails_settings'); // Define Notices Section and show some static messages, if needed
618
619 if ( ! wpbc_is_mu_user_can_be_here('activated_user') ) return false; // Check if MU user activated, otherwise show Warning message.
620 // if ( ! wpbc_is_mu_user_can_be_here('only_super_admin') ) return false; // User is not Super admin, so exit. Basically its was already checked at the bottom of the PHP file, just in case.
621
622
623 // -------------------------------------------------------------------------------------------------------------
624 // S u b m i t Main Form
625 // -------------------------------------------------------------------------------------------------------------
626 $submit_form_name = 'wpbc_emails_template'; // Define form name
627 // $this->maybe_update(); // It is run from parent CLASS before showing this content on Actual Selected by user Page
628
629
630 ////////////////////////////////////////////////////////////////////////
631 // JavaScript: Tooltips, Popover, Datepick (js & css)
632 ////////////////////////////////////////////////////////////////////////
633
634 echo '<span class="wpdevelop">';
635
636 wpbc_js_for_bookings_page();
637
638 echo '</span>';
639
640
641 ////////////////////////////////////////////////////////////////////////
642 // Content
643 ////////////////////////////////////////////////////////////////////////
644 ?>
645 <div class="clear"></div>
646
647 <span class="metabox-holder">
648
649 <form name="<?php echo $submit_form_name; ?>" id="<?php echo $submit_form_name; ?>" action="" method="post" autocomplete="off">
650 <?php
651 // N o n c e field, and key for checking S u b m i t
652 wp_nonce_field( 'wpbc_settings_page_' . $submit_form_name );
653 ?><input type="hidden" name="is_form_sbmitted_<?php echo $submit_form_name; ?>" id="is_form_sbmitted_<?php echo $submit_form_name; ?>" value="1" />
654
655 <div class="clear"></div>
656 <?php
657
658 wpbc_email_troubleshooting_help_notice();
659
660 ?>
661 <div class="metabox-holder">
662 <?php
663 wpbc_open_meta_box_section( $submit_form_name . 'general', __('Email is sent to visitor after cancelling of booking (moved to trash).', 'booking') ); //FixIn: 8.1.2.17.1
664
665 $this->mail_api()->show( 'general' );
666
667 wpbc_close_meta_box_section();
668 ?>
669 <div class="wpbc_settings_row wpbc_settings_row_left" >
670 <?php
671 wpbc_open_meta_box_section( $submit_form_name . 'general_content', __('Email Content', 'booking') ); //FixIn: 8.1.2.17.1
672
673 $this->mail_api()->show( 'general_content' );
674
675 wpbc_close_meta_box_section();
676 ?>
677 </div>
678
679 <div class="wpbc_settings_row wpbc_settings_row_right">
680 <?php
681 wpbc_open_meta_box_section( $submit_form_name . 'help', __('Help', 'booking') );
682
683 $this->mail_api()->show( 'help' );
684
685 wpbc_close_meta_box_section();
686 ?>
687 </div>
688 <div class="clear"></div>
689 <?php
690 wpbc_open_meta_box_section( $submit_form_name . 'email_content_type', __('Email Type', 'booking') . ' / ' . __('Email Styles', 'booking') );
691
692 $this->mail_api()->show( 'email_content_type' );
693
694 $this->mail_api()->show( 'style' );
695
696 wpbc_close_meta_box_section();
697
698 wpbc_open_meta_box_section( $submit_form_name . 'parts' , __('Header / Footer', 'booking') );
699
700 $this->mail_api()->show( 'parts' );
701
702 wpbc_close_meta_box_section();
703 ?>
704 </div>
705 <input type="submit" value="<?php echo esc_attr( __( 'Save Changes', 'booking' ) ); ?>" class="button button-primary" />
706 </form>
707 </span>
708 <?php
709
710 $this->enqueue_js();
711 }
712
713
714 /**
715 * This function called from PARENT CLASS for actual selected tab. Firstly it load data and then Maybe Save changes.
716 * @return void
717 */
718 public function maybe_update() {
719
720 // -------------------------------------------------------------------------------------------------------------
721 // Load Data
722 // -------------------------------------------------------------------------------------------------------------
723
724 /* Check if New Email Template Exist or NOT
725 * Exist - return empty array in format: array( OPTION_NAME => array() )
726 * It will load DATA from DB, during creation mail_api CLASS
727 * during initial activation of the API its try to get option from DB
728 * We need to define this API before checking POST, to know all available fields
729 * Define Email Name & define field values from DB, if not exist, then default values.
730 * Not Exist - import Old Data from DB
731 * or get "default" data from settings and return array with this data
732 * This data its initial parameters for definition fields in mail_api CLASS
733 *
734 */
735
736 $init_fields_values = wpbc_import6_email__trash__get_fields_array_for_activation();
737
738 // Get Value of first element - array of default or imported OLD data, because need only array of values without key - name of options for wp_options table
739 $init_fields_values_temp = array_values( $init_fields_values ); //FixIn: 7.0.1.32
740 $init_fields_values = array_shift( $init_fields_values_temp );
741
742
743 $this->mail_api( WPBC_EMAIL_TRASH_ID, $init_fields_values );
744
745
746 // -------------------------------------------------------------------------------------------------------------
747 // Maybe Update Data
748 // -------------------------------------------------------------------------------------------------------------
749
750 $submit_form_name = 'wpbc_emails_template'; // Define form name
751
752 $this->mail_api()->validated_form_id = $submit_form_name; // Define ID of Form for ability to validate fields before submit.
753
754 if ( isset( $_POST['is_form_sbmitted_'. $submit_form_name ] ) ) {
755
756 // Nonce checking {Return false if invalid, 1 if generated between, 0-12 hours ago, 2 if generated between 12-24 hours ago. }
757 $nonce_gen_time = check_admin_referer( 'wpbc_settings_page_' . $submit_form_name ); // Its stop show anything on submiting, if its not refear to the original page
758
759 // Save Changes
760 $this->update();
761 }
762 }
763
764
765 /** Update Email template to DB */
766 public function update() {
767
768 // Get Validated Email fields
769 $validated_fields = $this->mail_api()->validate_post();
770
771 $this->mail_api()->save_to_db( $validated_fields );
772
773 wpbc_show_message ( __('Settings saved.', 'booking'), 5 ); // Show Save message
774 }
775
776 // <editor-fold defaultstate="collapsed" desc=" CSS & JS " >
777
778 /** CSS for this page */
779 private function css() {
780 ?>
781 <style type="text/css">
782 .wpbc-help-message {
783 border:none;
784 margin:0 !important;
785 padding:0 !important;
786 }
787
788 @media (max-width: 399px) {
789 }
790 </style>
791 <?php
792 }
793
794
795 /**
796 * Add Custon JavaScript - for some specific settings options
797 * Executed After post content, after initial definition of settings, and possible definition after POST request.
798 *
799 * @param type $menu_slug
800 *
801 */
802 private function enqueue_js(){
803
804 $js_script = '';
805 //Show or hide colors section in settings page depend form selected email template.
806 $js_script .= " jQuery('select[name=\"trash_template_file\"]').on( 'change', function(){
807 if ( jQuery('select[name=\"trash_template_file\"] option:selected').val() == 'plain' ) {
808 jQuery('.template_colors').hide();
809 } else {
810 jQuery('.template_colors').show();
811 }
812 } ); ";
813 $js_script .= "\n"; //New Line
814 $js_script .= " if ( jQuery('select[name=\"trash_template_file\"] option:selected').val() == 'plain' ) {
815 jQuery('.template_colors').hide();
816 } ";
817
818 // Show Warning messages if Title (optional) is empty - title of email will be "WordPress
819 $js_script .= " jQuery(document).ready(function(){ ";
820 $js_script .= " if ( jQuery('#trash_to_name').val() == '' ) {";
821 $js_script .= " jQuery('#trash_to_name').parent().append('<div class=\'updated\' style=\'border-left-color:#ffb900;padding:5px 10px;\'>". esc_js(__('If empty then title defined as WordPress', 'booking' ))."</div>')";
822 $js_script .= " }";
823 $js_script .= " if ( jQuery('#trash_from_name').val() == '' ) {";
824 $js_script .= " jQuery('#trash_from_name').parent().append('<div class=\'updated\' style=\'border-left-color:#ffb900;padding:5px 10px;\'>". esc_js(__('If empty then title defined as WordPress', 'booking' ))."</div>')";
825 $js_script .= " }";
826 $js_script .= " }); ";
827
828 //FixIn: 8.1.2.17
829 $js_script .= " jQuery('#trash_copy_to_admin').on( 'change', function(){ ";
830 $js_script .= " if ( jQuery('#trash_copy_to_admin').is(':checked') ) {";
831 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').show();";
832 $js_script .= " } else { ";
833 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').hide();";
834 $js_script .= " } ";
835 $js_script .= " }); ";
836 $js_script .= " jQuery(document).ready(function(){ ";
837 $js_script .= " if ( jQuery('#trash_copy_to_admin').is(':checked') ) {";
838 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').show();";
839 $js_script .= " } else { ";
840 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').hide();";
841 $js_script .= " } ";
842 $js_script .= " }); ";
843 //FixIn: 8.1.2.17 - END
844
845 // Eneque JS to the footer of the page
846 wpbc_enqueue_js( $js_script );
847 }
848
849
850 // </editor-fold>
851 }
852 add_action('wpbc_menu_created', array( new WPBC_Settings_Page_Email_Trash() , '__construct') ); // Executed after creation of Menu
853
854
855
856 // <editor-fold defaultstate="collapsed" desc=" Emails Sending" >
857
858 /**
859 * Get ShortCodes to Replace
860 *
861 * @param int $booking_id - ID of booking
862 * @param int $bktype - booking resource type
863 * @param string $formdata - booking form data content
864 */
865 function wpbc__get_replace_shortcodes__email_trash( $booking_id, $bktype, $formdata ) {
866
867 $replace = array();
868
869 // Resources ///////////////////////////////////////////////////////////////
870 $bk_title = wpbc_get_resource_title( $bktype );
871
872 // Dates ///////////////////////////////////////////////////////////////////
873 $my_dates4emeil = wpbc_db__get_sql_dates__in_booking__as_str( $booking_id );
874 if ( get_bk_option( 'booking_date_view_type' ) == 'short' )
875 $my_dates_4_send = wpbc_get_dates_short_format( $my_dates4emeil );
876 else
877 $my_dates_4_send = wpbc_get_dates_comma_string_localized( $my_dates4emeil );
878
879 $my_dates4emeil_check_in_out = explode(',', $my_dates4emeil );
880
881 $my_check_in_date = wpbc_get_dates_comma_string_localized( $my_dates4emeil_check_in_out[0] );
882 $my_check_out_date = wpbc_get_dates_comma_string_localized( $my_dates4emeil_check_in_out[ count( $my_dates4emeil_check_in_out ) - 1 ] );
883 //FixIn: 8.7.2.5
884 $my_check_in_onlydate = wpbc_get_dates_comma_string_localized( wpbc_datetime_localized( date( 'Y-m-d 00:00:00', strtotime( $my_dates4emeil_check_in_out[0] ) ), 'Y-m-d 00:00:00' ) );
885 $my_check_out_onlydate = wpbc_get_dates_comma_string_localized( wpbc_datetime_localized( date( 'Y-m-d 00:00:00', strtotime( $my_dates4emeil_check_in_out[ count( $my_dates4emeil_check_in_out ) - 1 ] ) ), 'Y-m-d 00:00:00' ) );
886
887 $my_check_out_plus1day = wpbc_get_dates_comma_string_localized( wpbc_datetime_localized( date( 'Y-m-d H:i:s', strtotime( $my_dates4emeil_check_in_out[ count( $my_dates4emeil_check_in_out ) - 1 ] . " +1 day" ) ), 'Y-m-d H:i:s' ) ); //FixIn: 6.0.1.11
888
889 // Cost ////////////////////////////////////////////////////////////////////
890 $booking_cost_digits_only = apply_bk_filter( 'get_booking_cost_from_db', '', $booking_id ); //FixIn: 9.2.3.1
891 $booking_cost = wpbc_get_cost_with_currency_for_user( $booking_cost_digits_only );
892 // Other ///////////////////////////////////////////////////////////////////
893 $replace[ 'booking_id' ] = $booking_id;
894 $replace[ 'id' ] = $replace[ 'booking_id' ];
895 $replace[ 'dates' ] = $my_dates_4_send;
896 $replace[ 'check_in_date' ] = $my_check_in_date;
897 $replace[ 'check_out_date' ] = $my_check_out_date;
898 //FixIn: 8.7.2.5
899 $replace[ 'check_in_only_date' ] = $my_check_in_onlydate;
900 $replace[ 'check_out_only_date' ] = $my_check_out_onlydate;
901
902 $replace[ 'check_out_plus1day'] = $my_check_out_plus1day; //FixIn: 6.0.1.11
903 $replace[ 'dates_count' ] = count( $my_dates4emeil_check_in_out );
904 $replace['cost'] = $booking_cost;
905 $replace['cost_digits_only'] = $booking_cost_digits_only;
906 $replace[ 'siteurl' ] = htmlspecialchars_decode( '<a href="' . home_url() . '">' . home_url() . '</a>' );
907 $replace[ 'resource_title'] = wpbc_lang( $bk_title );
908 $replace[ 'bookingtype' ] = $replace[ 'resource_title'];
909 $replace[ 'remote_ip' ] = wpbc_get_user_ip(); //FixIn:7.1.2.4 // The IP address from which the user is viewing the current page.
910 $replace[ 'user_agent' ] = $_SERVER['HTTP_USER_AGENT']; // Contents of the User-Agent: header from the current request, if there is one.
911 $replace[ 'request_url' ] = ( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '' ); // The address of the page (if any) where action was occured. Because we are sending it in Ajax request, we need to use the REFERER HTTP
912 $replace[ 'current_date' ] = date_i18n( get_bk_option( 'booking_date_format' ) );
913 $replace[ 'current_time' ] = date_i18n( get_bk_option( 'booking_time_format' ) );
914
915 // Form Fields /////////////////////////////////////////////////////////////
916 $booking_form_show_array = wpbc__legacy__get_form_content_arr( $formdata, $bktype, '', $replace ); // We use here $replace array, becaise in "Content of booking filds data" form can be shortcodes from above definition
917
918 foreach ( $booking_form_show_array['_all_fields_'] as $shortcode_name => $shortcode_value ) {
919
920 if ( ! isset( $replace[ $shortcode_name ] ) )
921 $replace[ $shortcode_name ] = $shortcode_value;
922 }
923 $replace[ 'content' ] = $booking_form_show_array['content'];
924
925 // Links ///////////////////////////////////////////////////////////////////
926 $replace[ 'moderatelink' ] = htmlspecialchars_decode(
927 // '<a href="' .
928 esc_url( wpbc_get_bookings_url() . '&view_mode=vm_listing&tab=actions&wh_booking_id=' . $booking_id )
929 // . '">' . __('here', 'booking') . '</a>'
930 );
931 $replace[ 'visitorbookingediturl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingediturl]', $booking_id );
932 $replace[ 'visitorbookingslisting' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingslisting]', $booking_id ); //FixIn: 8.1.3.5.1
933 $replace[ 'visitorbookingcancelurl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingcancelurl]', $booking_id );
934 $replace[ 'visitorbookingpayurl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingpayurl]', $booking_id );
935 $replace[ 'bookinghash' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[bookinghash]', $booking_id );
936
937 ////////////////////////////////////////////////////////////////////////////
938 // Get additional replace paramaters to the email shortcodes
939 $replace = apply_filters( 'wpbc_replace_params_for_booking', $replace, $booking_id, $bktype, $formdata ); //FixIn: 8.0.1.7
940
941
942 return $replace;
943
944
945 }
946
947
948 /**
949 * Send email
950 *
951 * @param type $booking_id - ID of booking
952 * @param type $bktype - type
953 * @param type $formdata - booking form data
954 */
955
956 function wpbc_send_email_trash( $trash_id_str, $is_send_emeils, $trashreason = '' ) {
957
958 global $wpdb;
959 $sql = "SELECT * FROM {$wpdb->prefix}booking as bk WHERE bk.booking_id IN ({$trash_id_str})";
960 $result = $wpdb->get_results( $sql );
961
962
963 foreach ( $result as $res ) {
964
965 $booking_id = $res->booking_id;
966 $bktype = $res->booking_type;
967 $formdata = $res->form;
968
969 $previous_active_user = apply_bk_filter( 'wpbc_mu_set_environment_for_owner_of_resource', -1, $bktype ); // MU
970
971 ////////////////////////////////////////////////////////////////////////
972 // Load Data
973 ////////////////////////////////////////////////////////////////////////
974
975 /* Check if New Email Template Exist or NOT
976 * Exist - return empty array in format: array( OPTION_NAME => array() )
977 * Its will load DATA from DB, during creattion mail_api CLASS
978 * during initial activation of the API its try to get option from DB
979 * We need to define this API before checking POST, to know all available fields
980 * Define Email Name & define field values from DB, if not exist, then default values.
981 * Not Exist - import Old Data from DB
982 * or get "default" data from settings and return array with this data
983 * This data its initial parameters for definition fields in mail_api CLASS
984 *
985 */
986
987 $init_fields_values = wpbc_import6_email__trash__get_fields_array_for_activation();
988
989 // Get Value of first element - array of default or imported OLD data, because need only array of values without key - name of options for wp_options table
990 $init_fields_values_temp = array_values( $init_fields_values ); //FixIn: 7.0.1.32
991 $init_fields_values = array_shift( $init_fields_values_temp );
992
993
994 $mail_api = new WPBC_Emails_API_Trash( WPBC_EMAIL_TRASH_ID, $init_fields_values );
995
996 ////////////////////////////////////////////////////////////////////////////
997
998 if ( $mail_api->fields_values['enabled'] == 'Off' ) return false; // Email template deactivated - exit.
999
1000
1001 $replace = wpbc__get_replace_shortcodes__email_trash( $booking_id, $bktype, $formdata );
1002 $replace[ 'denyreason' ] = $trashreason; //FixIn: 7.0.1.1
1003
1004 // Replace shortcodes with custom URL parameter, like: 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl'
1005 foreach ( array( 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl' , 'visitorbookingslisting') as $url_shortcode ) { //FixIn: 7.0.1.8 //FixIn: 8.1.3.5.1
1006
1007 // Loop to search if we are having several such shortcodes in our $mail_api->fields_values['content'] (For example, if we have several languges ).
1008 $pos = 0; //FixIn: 7.0.1.52
1009 do {
1010 $shortcode_params = wpbc_get_params_of_shortcode_in_string( $url_shortcode, $mail_api->fields_values['content'] , $pos );
1011
1012 if ( ( ! empty( $shortcode_params ) ) && ( isset( $shortcode_params['url'] ) ) ){
1013
1014 $pos = $shortcode_params['end'];
1015
1016 $exist_replace = substr( $mail_api->fields_values['content'], $shortcode_params['start'], ( $shortcode_params['end'] - $shortcode_params['start'] ) );
1017
1018 $new_replace = $url_shortcode . rand(1000,9000);
1019
1020 $pos = $shortcode_params['start'] + strlen( $new_replace ); //FixIn: 9.7.3.5.1
1021 $mail_api->fields_values['content'] = str_replace( $exist_replace, $new_replace ,$mail_api->fields_values['content'] );
1022
1023 $replace[ $new_replace ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '['.$exist_replace.']', $booking_id );
1024 } else if ( //FixIn: 8.1.1.8
1025 ( ! empty( $shortcode_params ) )
1026 && ( isset( $shortcode_params['end'] ) )
1027 && ( $shortcode_params['end'] < strlen( $mail_api->fields_values['content'] ) )
1028 ) {
1029 $pos = $shortcode_params['end'];
1030 } else {
1031 $shortcode_params = false; //FixIn: 7.0.1.58
1032 }
1033
1034 } while ( ! empty( $shortcode_params ) ); //FixIn: 7.0.1.52
1035
1036 }
1037
1038 $mail_api->set_replace( $replace );
1039 $mail_api->fields_values['from_name'] = $mail_api->replace_shortcodes( $mail_api->fields_values['from_name'] ); //FixIn: 7.0.1.29
1040
1041
1042 $to = ( isset( $replace['email'] ) ) ? $replace['email'] : ''; // Get To field
1043
1044 if ( ! empty( $replace['email'] ) ) {
1045 $to = wpbc_email_prepand_person_name( $replace['email'], $replace );
1046 }
1047
1048 $to = wpbc_check_for_several_emails_in_form( $to, $formdata, $bktype ); //FixIn: 6.0.1.9
1049
1050 $to = str_replace( ';', ',', $to );
1051
1052 if ( wpbc_is_not_blank_email( $to, $replace['content'] ) ) {
1053 $email_result = $mail_api->send( $to, $replace );
1054 }
1055 make_bk_action( 'wpbc_mu_set_environment_for_user', $previous_active_user ); // MU
1056 }
1057
1058 $email_result = ( isset( $email_result ) ) ? $email_result : false;
1059 return $email_result;
1060 }
1061
1062 // </editor-fold>
1063