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-deny.php

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

1,071 lines 60.4 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 2015-04-09
12 */
13
14 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
15
16
17 if ( ! defined( 'WPBC_EMAIL_DENY_PREFIX' ) ) define( 'WPBC_EMAIL_DENY_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_DENY_ID' ) ) define( 'WPBC_EMAIL_DENY_ID', 'deny' ); /* Define Name of Email Template.
20 Note. Prefix "booking_email_" defined in api-emails.php file.
21 Full name of option is - "booking_email_deny"
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_deny_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_deny_data() {
49
50 $default_values = array();
51 if ( wpbc_import6_is_old_email_deny_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_deny_exist() {
65
66 $is_data_exist = get_bk_option( WPBC_EMAIL_DENY_PREFIX . WPBC_EMAIL_DENY_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__deny__get_fields_array_for_activation() {
76
77
78 if ( ! wpbc_import6_is_new_email_deny_exist() ) { // New Email Template NOT exist
79
80 // Import
81 $old_data = wpbc_import6_get_old_email_deny_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_Deny( WPBC_EMAIL_DENY_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_Deny}
127
128 $fields_values = wp_parse_args( $old_data, $default_fields_in_settings );
129
130 return array( WPBC_EMAIL_DENY_PREFIX . WPBC_EMAIL_DENY_ID => $fields_values );
131
132 /*
133 Array (
134 [booking_email_deny] => 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_DENY_PREFIX . WPBC_EMAIL_DENY_ID => array() );
160 }
161 }
162 // </editor-fold>
163
164
165
166 /** Email F i e l d s */
167 class WPBC_Emails_API_Deny 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
198
199 //FixIn: 8.1.2.17
200 $this->fields['to_html_prefix'] = array(
201 'type' => 'pure_html'
202 , 'group' => 'general'
203 , 'html' => '<tr valign="top" class="wpbc_tr_copy_to_admin_to">
204 <th scope="row">
205 <label class="wpbc-form-email" for="'
206 . esc_attr( 'approved_to' )
207 . '">' . wp_kses_post( __('To' ,'booking') ) . ' (' . strtolower( __('Copy(ies)', 'booking') ). ')' //FixIn: 8.1.2.17.1
208 . '</label>
209 </th>
210 <td><fieldset style="float:left;width:50%;margin-right:5%;">'
211 );
212 $this->fields['to'] = array(
213 'type' => 'text' // We are using here 'text' and not 'email', for ability to save several comma seperated emails.
214 , 'default' => get_option( 'admin_email' )
215 //, 'placeholder' => ''
216 , 'title' => ''
217 , 'description' => __('Email Address', 'booking') . '. ' . __('Required', 'booking') . '. '
218 . __('You can put multiple emails separated by', 'booking') . ' <code>;</code>' //FixIn: 8.1.2.17.1
219 , 'description_tag' => ''
220 , 'css' => 'width:100%'
221 , 'group' => 'general'
222 , 'tr_class' => ''
223 , 'only_field' => true
224 , 'validate_as' => array( )
225 );
226 $this->fields['to_html_middle'] = array(
227 'type' => 'pure_html'
228 , 'group' => 'general'
229 , 'html' => '</fieldset><fieldset style="float:left;width:45%;">'
230 );
231 $this->fields['to_name'] = array(
232 'type' => 'text'
233 , 'default' => 'Booking system'
234 //, 'placeholder' => ''
235 , 'title' => ''
236 , 'description' => __('Title', 'booking') . ' (' . __('optional', 'booking') . ').' //. ' ' . __('If empty then title defined as WordPress', 'booking')
237 , 'description_tag' => ''
238 , 'css' => 'width:100%'
239 , 'group' => 'general'
240 , 'tr_class' => ''
241 , 'only_field' => true
242 );
243 $this->fields['to_html_sufix'] = array(
244 'type' => 'pure_html'
245 , 'group' => 'general'
246 , 'html' => ' </fieldset>
247 </td>
248 </tr>'
249 );
250
251 $this->fields['to_hr'] = array( 'type' => 'hr' );
252 /**/
253 //FixIn: 8.1.2.17 - END
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( 'deny_from' )
262 . '">' . wp_kses_post( __('From' ,'booking') )
263 . '</label>
264 </th>
265 <td><fieldset style="float:left;width:50%;margin-right:5%;">'
266 );
267 $this->fields['from'] = array(
268 'type' => 'email' // Its can be only 1 email, so check it as Email field.
269 , 'default' => get_option( 'admin_email' )
270 //, 'placeholder' => ''
271 , 'title' => ''
272 , 'description' => __('Email Address', 'booking') . '. ' . __('Required', 'booking') . '.'
273 , 'description_tag' => ''
274 , 'css' => 'width:100%'
275 , 'group' => 'general'
276 , 'tr_class' => ''
277 , 'only_field' => true
278 , 'validate_as' => array( 'required' )
279 );
280 $this->fields['from_html_middle'] = array(
281 'type' => 'pure_html'
282 , 'group' => 'general'
283 , 'html' => '</fieldset><fieldset style="float:left;width:45%;">'
284 );
285 $this->fields['from_name'] = array(
286 'type' => 'text'
287 , 'default' => 'Booking system'
288 //, 'placeholder' => ''
289 , 'title' => ''
290 , 'description' => __('Title', 'booking') . ' (' . __('optional', 'booking') . ').' //. ' ' . __('If empty then title defined as WordPress', 'booking')
291 , 'description_tag' => ''
292 , 'css' => 'width:100%'
293 , 'group' => 'general'
294 , 'tr_class' => ''
295 , 'only_field' => true
296 );
297 $this->fields['from_html_sufix'] = array(
298 'type' => 'pure_html'
299 , 'group' => 'general'
300 , 'html' => ' </fieldset>
301 </td>
302 </tr>'
303 );
304
305
306
307
308
309 $this->fields['subject_before'] = array(
310 'type' => 'pure_html'
311 , 'group' => 'general_content'
312 , 'html' => '<tr><td colspan="2">'
313 .'<div style="margin: 0 0 15px;font-weight: 600;">'
314 .'<label class="wpbc-form-email-subject" for="' . WPBC_EMAIL_DENY_ID . '_subject">' .
315 __( 'Subject', 'booking' )
316 . '</label></div>'
317 );
318 $this->fields['subject'] = array(
319 'type' => 'text'
320 , 'default' => __( 'Your booking has been declined', 'booking' )
321 //, 'placeholder' => ''
322 , 'title' => __('Subject', 'booking')
323 , 'description' => ''
324 , 'description_tag' => ''
325 , 'css' => 'width:100%;font-size:16px;line-height:34px;font-weight:600;'
326 , 'group' => 'general_content'
327 , 'tr_class' => ''
328 , 'validate_as' => array( 'required' )
329 , 'only_field' => true
330 );
331 $this->fields['subject_after'] = array( 'type' => 'pure_html', 'group' => 'general_content',
332 'html' => '<p style="text-align: right;font-size:12px;">'
333 . sprintf(__('Type your email %ssubject%s for the booking confirmation message.' ,'booking'),'<b>','</b>') . ' ' . __('Required', 'booking')
334 . '.</p>' . '</td></tr>' );
335
336 $blg_title = get_option( 'blogname' );
337 $blg_title = str_replace( array( '"', "'" ), '', $blg_title );
338
339 $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]' );
340
341 $this->fields['content_before'] = array(
342 'type' => 'pure_html',
343 'group' => 'general_content',
344 'html' => '<tr><td colspan="2" style="padding-bottom:0;">'
345 . '<div style="margin: 0;font-weight: 600;">'
346 . '<label class="wpbc-form-email-content" for="' . WPBC_EMAIL_DENY_ID . '_content">' .
347 __( 'Content', 'booking' )
348 . '</label></div>'
349 );
350 $this->fields['content'] = array(
351 'type' => 'wp_textarea'
352 , 'default' => $email_content
353 //, 'placeholder' => ''
354 , 'title' => __('Content', 'booking')
355 , 'description' => ''//__('Type your email message content. ', 'booking')
356 , 'description_tag' => ''
357 , 'css' => ''
358 , 'group' => 'general_content'
359 , 'tr_class' => ''
360 , 'rows' => 17
361 , 'show_in_2_cols' => true
362 , 'only_field' => true
363 );
364 $this->fields['content_after'] = array( 'type' => 'pure_html', 'group' => 'general_content', 'html' => '</td></tr>' );
365 // $this->fields['content'] = htmlspecialchars( $this->fields['content'] );// Convert > to &gt;
366 // $this->fields['content'] = html_entity_decode( $this->fields['content'] );// Convert &gt; to >
367
368
369
370 ////////////////////////////////////////////////////////////////////
371 // Style
372 ////////////////////////////////////////////////////////////////////
373
374
375 $this->fields['header_content'] = array(
376 'type' => 'textarea'
377 , 'default' => ''
378 , 'title' => __('Email Heading', 'booking')
379 , 'description' => __('Enter main heading contained within the email notification.', 'booking')
380 //, 'placeholder' => ''
381 , 'rows' => 2
382 , 'css' => "width:100%;"
383 , 'group' => 'parts'
384 );
385 $this->fields['footer_content'] = array(
386 'type' => 'textarea'
387 , 'default' => ''
388 , 'title' => __('Email Footer Text', 'booking')
389 , 'description' => __('Enter text contained within footer of the email notification', 'booking')
390 //, 'placeholder' => ''
391 , 'rows' => 2
392 , 'css' => 'width:100%;'
393 , 'group' => 'parts'
394 );
395
396 $this->fields['template_file'] = array(
397 'type' => 'select'
398 , 'default' => 'plain'
399 , 'title' => __('Email template', 'booking')
400 , 'description' => __('Choose email template.', 'booking')
401 , 'description_tag' => 'span'
402 , 'css' => ''
403 , 'options' => array(
404 'plain' => __('Plain (without styles)', 'booking')
405 , 'standard' => __('Standard 1 column', 'booking')
406 )
407 , 'group' => 'style'
408 );
409
410 $this->fields['template_file_help'] = array(
411 'type' => 'help'
412 , 'value' => array( sprintf( __('You can override this email template in this folder %s', 'booking')
413 , '<code>' . realpath( dirname(__FILE__) . '/../any/emails_tpl/' ) . '</code>' )
414 )
415 , 'cols' => 2
416 , 'group' => 'style'
417 );
418
419 $this->fields['base_color'] = array(
420 'type' => 'color'
421 , 'default' => '#557da1'
422 , 'title' => __('Base Color', 'booking')
423 , 'description' => __('The base color for email templates.', 'booking')
424 . ' ' . __('Default color', 'booking') .': <code>#557da1</code>.'
425 , 'group' => 'style'
426 , 'tr_class' => 'template_colors'
427 );
428 $this->fields['background_color'] = array(
429 'type' => 'color'
430 , 'default' => '#f5f5f5'
431 , 'title' => __('Background Color', 'booking')
432 , 'description' => __('The background color for email templates.', 'booking')
433 . ' ' . __('Default color', 'booking') .': <code>#f5f5f5</code>.'
434 , 'group' => 'style'
435 , 'tr_class' => 'template_colors'
436 );
437 $this->fields['body_color'] = array(
438 'type' => 'color'
439 , 'default' => '#fdfdfd'
440 , 'title' => __('Email Body Background Color', 'booking')
441 , 'description' => __('The main body background color for email templates.', 'booking')
442 . ' ' . __('Default color', 'booking') .': <code>#fdfdfd</code>.'
443 , 'group' => 'style'
444 , 'tr_class' => 'template_colors'
445 );
446 $this->fields['text_color'] = array(
447 'type' => 'color'
448 , 'default' => '#505050'
449 , 'title' => __('Email Body Text Colour', 'booking')
450 , 'description' => __('The main body text color for email templates.', 'booking')
451 . ' ' . __('Default color', 'booking') .': <code>#505050</code>.'
452 , 'group' => 'style'
453 , 'tr_class' => 'template_colors'
454 );
455
456
457 ////////////////////////////////////////////////////////////////////
458 // Email format: Plain, HTML, MultiPart
459 ////////////////////////////////////////////////////////////////////
460
461
462 $this->fields['email_content_type'] = array(
463 'type' => 'select'
464 , 'default' => 'plain'
465 , 'title' => __('Email format', 'booking')
466 , 'description' => __('Choose which format of email to send.', 'booking')
467 , 'description_tag' => 'p'
468 , 'css' => 'width:100%;'
469 , 'options' => array(
470 'plain' => __('Plain text', 'booking')
471 // , 'html' => __('HTML', 'booking')
472 // , 'multipart' => __('Multipart', 'booking')
473 )
474 , 'group' => 'email_content_type'
475 );
476 if ( class_exists( 'DOMDocument' ) ) {
477 $this->fields['email_content_type']['options']['html'] = __('HTML', 'booking');
478 $this->fields['email_content_type']['options']['multipart'] = __('Multipart', 'booking');
479
480 $this->fields['email_content_type']['default'] = 'html';
481 }
482
483
484
485 ////////////////////////////////////////////////////////////////////
486 // Help
487 ////////////////////////////////////////////////////////////////////
488
489 $this->fields['content_help'] = array(
490 'type' => 'help'
491 , 'value' => array()
492 , 'cols' => 2
493 , 'group' => 'help'
494 , 'css' => 'padding-right: 10px !important;max-height: 598px;overflow: auto;'
495 , 'only_field' => true
496 );
497
498 $skip_shortcodes = array(
499 // 'denyreason'
500 'moderatelink'
501 , 'paymentreason'
502 , 'visitorbookingediturl'
503 //, 'visitorbookingslisting' //FixIn: 8.1.3.5.1
504 , 'visitorbookingcancelurl'
505 , 'visitorbookingpayurl'
506 );
507 $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; ');
508
509 $help_fields = wpbc_get_email_help_shortcodes( $skip_shortcodes, $email_example );
510
511 foreach ( $help_fields as $help_fields_key => $help_fields_value ) {
512 $this->fields['content_help']['value'][] = $help_fields_value;
513 }
514
515 }
516
517 }
518
519
520
521 /** Settings Emails P a g e */
522 class WPBC_Settings_Page_Email_Deny extends WPBC_Page_Structure {
523
524 public $email_settings_api = false;
525
526
527 /**
528 * Define interface for Email API
529 *
530 * @param string $selected_email_name - name of Email template
531 * @param array $init_fields_values - array of init form fields data
532 * @return object Email API
533 */
534 public function mail_api( $selected_email_name ='', $init_fields_values = array() ){
535
536 if ( $this->email_settings_api === false ) {
537 $this->email_settings_api = new WPBC_Emails_API_Deny( $selected_email_name , $init_fields_values );
538 }
539
540 return $this->email_settings_api;
541 }
542
543
544 public function in_page() { // P a g e t a g
545 return 'wpbc-settings';
546 }
547
548
549 public function tabs() { // T a b s A r r a y
550
551 $tabs = array();
552
553 // $tabs[ 'email' ] = array(
554 // 'title' => __( 'Emails', 'booking') // Title of TAB
555 // , 'page_title'=> __( 'Emails Settings', 'booking') // Title of Page
556 // , 'hint' => __( 'Emails Settings', 'booking') // Hint
557 // //, 'link' => '' // Can be skiped, then generated link based on Page and Tab tags. Or can be extenral link
558 // //, 'position' => '' // 'left' || 'right' || ''
559 // //, 'css_classes'=> '' // CSS class(es)
560 // //, 'icon' => '' // Icon - link to the real PNG img
561 // , 'font_icon' => 'wpbc_icn_mail_outline' // CSS definition of forn Icon
562 // //, 'default' => false // Is this tab activated by default or not: true || false.
563 // //, 'disabled' => false // Is this tab disbaled: true || false.
564 // //, 'hided' => false // Is this tab hided: true || false.
565 // , 'subtabs' => array()
566 // );
567
568 $subtabs = array();
569
570 $is_data_exist = get_bk_option( WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_DENY_ID );
571 if ( ( ! empty( $is_data_exist ) ) && ( isset( $is_data_exist['copy_to_admin'] ) ) && ( $is_data_exist['copy_to_admin'] == 'On' ) )
572 $sufix = '<sup> 2</sup>';
573 else
574 $sufix = '';
575
576
577 $subtabs['deny'] = array(
578 'type' => 'subtab' // Required| Possible values: 'subtab' | 'separator' | 'button' | 'goto-link' | 'html'
579 , 'title' => '<span>' . __( 'Pending', 'booking' ) . $sufix . '</span>' // Title of TAB
580 , 'page_title' => __('Emails Settings', 'booking') // Title of Page
581 , 'hint' => __('Customization of email template, which is sent to Visitor, when booking status is set to Pending' ,'booking') //FixIn: 8.1.2.17.1
582 , 'link' => '' // link
583 , 'position' => '' // 'left' || 'right' || ''
584 , 'css_classes' => 'wpbc_navigation_top_border' // CSS class(es)
585 //, 'icon' => 'http://.../icon.png' // Icon - link to the real PNG img
586 //, 'font_icon' => 'wpbc_icn_mail_outline' // CSS definition of Font Icon
587 , 'header_font_icon' => 'wpbc_icn_mail_outline' // CSS definition of Font Icon //FixIn: 9.6.1.4
588 , 'default' => false // Is this sub tab activated by default or not: true || false.
589 , 'disabled' => false // Is this sub tab deactivated: true || false.
590 , 'checkbox' => false // or definition array for specific checkbox: array( 'checked' => true, 'name' => 'feature1_active_status' ) //, 'checkbox' => array( 'checked' => $is_checked, 'name' => 'enabled_active_status' )
591 , 'content' => 'content' // Function to load as conten of this TAB
592 , 'is_use_left_navigation' => true
593 , 'show_checked_icon' => true
594 , 'checked_data' => WPBC_EMAIL_NEW_ADMIN_PREFIX . WPBC_EMAIL_DENY_ID // This is where we get content
595 );
596
597 $tabs[ 'email' ]['subtabs'] = $subtabs;
598
599 return $tabs;
600 }
601
602
603 /** Show Content of Settings page */
604 public function content() {
605 $this->css();
606
607 // -------------------------------------------------------------------------------------------------------------
608 // Checking
609 // -------------------------------------------------------------------------------------------------------------
610 do_action( 'wpbc_hook_settings_page_header', 'emails_settings'); // Define Notices Section and show some static messages, if needed
611
612 if ( ! wpbc_is_mu_user_can_be_here('activated_user') ) return false; // Check if MU user activated, otherwise show Warning message.
613 // 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.
614
615
616 // -------------------------------------------------------------------------------------------------------------
617 // S u b m i t Main Form
618 // -------------------------------------------------------------------------------------------------------------
619 $submit_form_name = 'wpbc_emails_template'; // Define form name
620 // $this->maybe_update(); // It is run from parent CLASS before showing this content on Actual Selected by user Page
621
622
623 ////////////////////////////////////////////////////////////////////////
624 // JavaScript: Tooltips, Popover, Datepick (js & css)
625 ////////////////////////////////////////////////////////////////////////
626
627 echo '<span class="wpdevelop">';
628
629 wpbc_js_for_bookings_page();
630
631 echo '</span>';
632
633
634 ////////////////////////////////////////////////////////////////////////
635 // Content
636 ////////////////////////////////////////////////////////////////////////
637 ?>
638 <div class="clear"></div>
639
640 <span class="metabox-holder">
641
642 <form name="<?php echo $submit_form_name; ?>" id="<?php echo $submit_form_name; ?>" action="" method="post" autocomplete="off">
643 <?php
644 // N o n c e field, and key for checking S u b m i t
645 wp_nonce_field( 'wpbc_settings_page_' . $submit_form_name );
646 ?><input type="hidden" name="is_form_sbmitted_<?php echo $submit_form_name; ?>" id="is_form_sbmitted_<?php echo $submit_form_name; ?>" value="1" />
647
648 <div class="clear"></div>
649 <?php
650
651 wpbc_email_troubleshooting_help_notice();
652
653 ?>
654 <div class="metabox-holder">
655 <?php
656 wpbc_open_meta_box_section( $submit_form_name . 'general', __('Email is sent to Visitor after booking set as Pending.', 'booking') ); //FixIn: 8.1.2.17.1
657
658 $this->mail_api()->show( 'general' );
659
660 wpbc_close_meta_box_section();
661 ?>
662 <div class="wpbc_settings_row wpbc_settings_row_left" >
663 <?php
664 wpbc_open_meta_box_section( $submit_form_name . 'general_content', __('Email Content', 'booking') ); //FixIn: 8.1.2.17.1
665
666 $this->mail_api()->show( 'general_content' );
667
668 wpbc_close_meta_box_section();
669 ?>
670 </div>
671
672 <div class="wpbc_settings_row wpbc_settings_row_right">
673 <?php
674 wpbc_open_meta_box_section( $submit_form_name . 'help', __('Help', 'booking') );
675
676 $this->mail_api()->show( 'help' );
677
678 wpbc_close_meta_box_section();
679 ?>
680 </div>
681 <div class="clear"></div>
682 <?php
683 wpbc_open_meta_box_section( $submit_form_name . 'email_content_type', __('Email Type', 'booking') . ' / ' . __('Email Styles', 'booking') );
684
685 $this->mail_api()->show( 'email_content_type' );
686
687 $this->mail_api()->show( 'style' );
688
689 wpbc_close_meta_box_section();
690
691 wpbc_open_meta_box_section( $submit_form_name . 'parts' , __('Header / Footer', 'booking') );
692
693 $this->mail_api()->show( 'parts' );
694
695 wpbc_close_meta_box_section();
696 ?>
697 </div>
698 <input type="submit" value="<?php echo esc_attr( __( 'Save Changes', 'booking' ) ); ?>" class="button button-primary" />
699 </form>
700 </span>
701 <?php
702
703 $this->enqueue_js();
704 }
705
706
707 /**
708 * This function called from PARENT CLASS for actual selected tab. Firstly it load data and then Maybe Save changes.
709 * @return void
710 */
711 public function maybe_update() {
712
713 // -------------------------------------------------------------------------------------------------------------
714 // Load Data
715 // -------------------------------------------------------------------------------------------------------------
716
717 /* Check if New Email Template Exist or NOT
718 * Exist - return empty array in format: array( OPTION_NAME => array() )
719 * It will load DATA from DB, during creation mail_api CLASS
720 * during initial activation of the API its try to get option from DB
721 * We need to define this API before checking POST, to know all available fields
722 * Define Email Name & define field values from DB, if not exist, then default values.
723 * Not Exist - import Old Data from DB
724 * or get "default" data from settings and return array with this data
725 * This data its initial parameters for definition fields in mail_api CLASS
726 *
727 */
728
729 $init_fields_values = wpbc_import6_email__deny__get_fields_array_for_activation();
730
731 // 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
732 $init_fields_values_temp = array_values( $init_fields_values ); //FixIn: 7.0.1.32
733 $init_fields_values = array_shift( $init_fields_values_temp );
734
735
736 $this->mail_api( WPBC_EMAIL_DENY_ID, $init_fields_values );
737
738
739 // -------------------------------------------------------------------------------------------------------------
740 // Maybe Update Data
741 // -------------------------------------------------------------------------------------------------------------
742
743 $submit_form_name = 'wpbc_emails_template'; // Define form name
744
745 $this->mail_api()->validated_form_id = $submit_form_name; // Define ID of Form for ability to validate fields before submit.
746
747 if ( isset( $_POST['is_form_sbmitted_'. $submit_form_name ] ) ) {
748
749 // Nonce checking {Return false if invalid, 1 if generated between, 0-12 hours ago, 2 if generated between 12-24 hours ago. }
750 $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
751
752 // Save Changes
753 $this->update();
754 }
755 }
756
757
758 /** Update Email template to DB */
759 public function update() {
760
761 // Get Validated Email fields
762 $validated_fields = $this->mail_api()->validate_post();
763
764 $this->mail_api()->save_to_db( $validated_fields );
765
766 wpbc_show_message ( __('Settings saved.', 'booking'), 5 ); // Show Save message
767 }
768
769 // <editor-fold defaultstate="collapsed" desc=" CSS & JS " >
770
771 /** CSS for this page */
772 private function css() {
773 ?>
774 <style type="text/css">
775 .wpbc-help-message {
776 border:none;
777 margin:0 !important;
778 padding:0 !important;
779 }
780
781 @media (max-width: 399px) {
782 }
783 </style>
784 <?php
785 }
786
787
788 /**
789 * Add Custon JavaScript - for some specific settings options
790 * Executed After post content, after initial definition of settings, and possible definition after POST request.
791 *
792 * @param type $menu_slug
793 *
794 */
795 private function enqueue_js(){ // $page_tag, $active_page_tab, $active_page_subtab ) {
796 $js_script = '';
797 //Show or hide colors section in settings page depend form selected email template.
798 $js_script .= " jQuery('select[name=\"deny_template_file\"]').on( 'change', function(){
799 if ( jQuery('select[name=\"deny_template_file\"] option:selected').val() == 'plain' ) {
800 jQuery('.template_colors').hide();
801 } else {
802 jQuery('.template_colors').show();
803 }
804 } ); ";
805 $js_script .= "\n"; //New Line
806 $js_script .= " if ( jQuery('select[name=\"deny_template_file\"] option:selected').val() == 'plain' ) {
807 jQuery('.template_colors').hide();
808 } ";
809
810 // Show Warning messages if Title (optional) is empty - title of email will be "WordPress
811 $js_script .= " jQuery(document).ready(function(){ ";
812 $js_script .= " if ( jQuery('#deny_to_name').val() == '' ) {";
813 $js_script .= " jQuery('#deny_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>')";
814 $js_script .= " }";
815 $js_script .= " if ( jQuery('#deny_from_name').val() == '' ) {";
816 $js_script .= " jQuery('#deny_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>')";
817 $js_script .= " }";
818 $js_script .= " }); ";
819
820 //FixIn: 8.1.2.17
821 $js_script .= " jQuery('#deny_copy_to_admin').on( 'change', function(){ ";
822 $js_script .= " if ( jQuery('#deny_copy_to_admin').is(':checked') ) {";
823 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').show();";
824 $js_script .= " } else { ";
825 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').hide();";
826 $js_script .= " } ";
827 $js_script .= " }); ";
828 $js_script .= " jQuery(document).ready(function(){ ";
829 $js_script .= " if ( jQuery('#deny_copy_to_admin').is(':checked') ) {";
830 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').show();";
831 $js_script .= " } else { ";
832 $js_script .= " jQuery('.wpbc_tr_copy_to_admin_to').hide();";
833 $js_script .= " } ";
834 $js_script .= " }); ";
835 //FixIn: 8.1.2.17 - END
836
837 // Eneque JS to the footer of the page
838 wpbc_enqueue_js( $js_script );
839 }
840
841
842 // </editor-fold>
843 }
844 add_action('wpbc_menu_created', array( new WPBC_Settings_Page_Email_Deny() , '__construct') ); // Executed after creation of Menu
845
846
847
848 // <editor-fold defaultstate="collapsed" desc=" Emails Sending" >
849
850 /**
851 * Get ShortCodes to Replace
852 *
853 * @param int $booking_id - ID of booking
854 * @param int $bktype - booking resource type
855 * @param string $formdata - booking form data content
856 */
857 function wpbc__get_replace_shortcodes__email_deny( $booking_id, $bktype, $formdata ) {
858
859 $replace = array();
860
861 // Resources ///////////////////////////////////////////////////////////////
862 $bk_title = wpbc_get_resource_title( $bktype );
863
864 // Dates ///////////////////////////////////////////////////////////////////
865 $my_dates4emeil = wpbc_db__get_sql_dates__in_booking__as_str( $booking_id );
866 if ( get_bk_option( 'booking_date_view_type' ) == 'short' )
867 $my_dates_4_send = wpbc_get_dates_short_format( $my_dates4emeil );
868 else
869 $my_dates_4_send = wpbc_get_dates_comma_string_localized( $my_dates4emeil );
870
871 $my_dates4emeil_check_in_out = explode(',', $my_dates4emeil );
872
873 $my_check_in_date = wpbc_get_dates_comma_string_localized( $my_dates4emeil_check_in_out[0] );
874 $my_check_out_date = wpbc_get_dates_comma_string_localized( $my_dates4emeil_check_in_out[ count( $my_dates4emeil_check_in_out ) - 1 ] );
875 //FixIn: 8.7.2.5
876 $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' ) );
877 $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' ) );
878
879 $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
880
881 // Cost ////////////////////////////////////////////////////////////////////
882 $booking_cost_digits_only = apply_bk_filter( 'get_booking_cost_from_db', '', $booking_id ); //FixIn: 9.2.3.1
883 $booking_cost = wpbc_get_cost_with_currency_for_user( $booking_cost_digits_only );
884 // Other ///////////////////////////////////////////////////////////////////
885 $replace[ 'booking_id' ] = $booking_id;
886 $replace[ 'id' ] = $replace[ 'booking_id' ];
887 $replace[ 'dates' ] = $my_dates_4_send;
888 $replace[ 'check_in_date' ] = $my_check_in_date;
889 $replace[ 'check_out_date' ] = $my_check_out_date;
890 //FixIn: 8.7.2.5
891 $replace[ 'check_in_only_date' ] = $my_check_in_onlydate;
892 $replace[ 'check_out_only_date' ] = $my_check_out_onlydate;
893
894 $replace[ 'check_out_plus1day'] = $my_check_out_plus1day; //FixIn: 6.0.1.11
895 $replace[ 'dates_count' ] = count( $my_dates4emeil_check_in_out );
896 $replace['cost'] = $booking_cost;
897 $replace['cost_digits_only'] = $booking_cost_digits_only;
898 $replace[ 'siteurl' ] = htmlspecialchars_decode( '<a href="' . home_url() . '">' . home_url() . '</a>' );
899 $replace[ 'resource_title'] = wpbc_lang( $bk_title );
900 $replace[ 'bookingtype' ] = $replace[ 'resource_title'];
901 $replace[ 'remote_ip' ] = wpbc_get_user_ip(); //FixIn:7.1.2.4 // The IP address from which the user is viewing the current page.
902 $replace[ 'user_agent' ] = $_SERVER['HTTP_USER_AGENT']; // Contents of the User-Agent: header from the current request, if there is one.
903 $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
904 $replace[ 'current_date' ] = date_i18n( get_bk_option( 'booking_date_format' ) );
905 $replace[ 'current_time' ] = date_i18n( get_bk_option( 'booking_time_format' ) );
906
907 // Form Fields /////////////////////////////////////////////////////////////
908 $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
909
910 foreach ( $booking_form_show_array['_all_fields_'] as $shortcode_name => $shortcode_value ) {
911
912 if ( ! isset( $replace[ $shortcode_name ] ) )
913 $replace[ $shortcode_name ] = $shortcode_value;
914 }
915 $replace[ 'content' ] = $booking_form_show_array['content'];
916
917 // Links ///////////////////////////////////////////////////////////////////
918 $replace[ 'moderatelink' ] = htmlspecialchars_decode(
919 // '<a href="' .
920 esc_url( wpbc_get_bookings_url() . '&view_mode=vm_listing&tab=actions&wh_booking_id=' . $booking_id )
921 // . '">' . __('here', 'booking') . '</a>'
922 );
923 $replace[ 'visitorbookingediturl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingediturl]', $booking_id );
924 $replace[ 'visitorbookingslisting' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingslisting]', $booking_id ); //FixIn: 8.1.3.5.1
925 $replace[ 'visitorbookingcancelurl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingcancelurl]', $booking_id );
926 $replace[ 'visitorbookingpayurl' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[visitorbookingpayurl]', $booking_id );
927 $replace[ 'bookinghash' ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '[bookinghash]', $booking_id );
928 //FixIn: 9.6.3.8
929 $google_calendar_link = wpbc_booking_do_action__get_google_calendar_link( array(
930 'form_data' => $booking_form_show_array['_all_fields_'],
931 'form_show' => $booking_form_show_array['content'], //strip_tags( $parsed_form_show ),
932 'dates_short' => array(
933 $my_dates4emeil_check_in_out[0]
934 , '-'
935 , $my_dates4emeil_check_in_out[ count( $my_dates4emeil_check_in_out ) - 1 ]
936 )
937 ) );
938 $replace['add_to_google_cal_url'] = htmlspecialchars_decode( esc_url( $google_calendar_link ) );
939 $replace['add_to_google_cal_button'] = '<a href="' . esc_attr( $replace['add_to_google_cal_url'] ) . '" target="_blank" rel="nofollow">Add to Google Calendar</a>';
940
941
942
943 ////////////////////////////////////////////////////////////////////////////
944 // Get additional replace paramaters to the email shortcodes
945 $replace = apply_filters( 'wpbc_replace_params_for_booking', $replace, $booking_id, $bktype, $formdata ); //FixIn: 8.0.1.7
946
947
948 return $replace;
949
950
951 }
952
953
954 /**
955 * Send email
956 *
957 * @param type $booking_id - ID of booking
958 * @param type $bktype - type
959 * @param type $formdata - booking form data
960 */
961
962 function wpbc_send_email_deny( $deny_id_str, $is_send_emeils, $denyreason = '' ) {
963
964 global $wpdb;
965 $sql = "SELECT * FROM {$wpdb->prefix}booking as bk WHERE bk.booking_id IN ({$deny_id_str})";
966 $result = $wpdb->get_results( $sql );
967
968
969 foreach ( $result as $res ) {
970
971 $booking_id = $res->booking_id;
972 $bktype = $res->booking_type;
973 $formdata = $res->form;
974
975 $previous_active_user = apply_bk_filter( 'wpbc_mu_set_environment_for_owner_of_resource', -1, $bktype ); // MU
976
977 ////////////////////////////////////////////////////////////////////////
978 // Load Data
979 ////////////////////////////////////////////////////////////////////////
980
981 /* Check if New Email Template Exist or NOT
982 * Exist - return empty array in format: array( OPTION_NAME => array() )
983 * Its will load DATA from DB, during creattion mail_api CLASS
984 * during initial activation of the API its try to get option from DB
985 * We need to define this API before checking POST, to know all available fields
986 * Define Email Name & define field values from DB, if not exist, then default values.
987 * Not Exist - import Old Data from DB
988 * or get "default" data from settings and return array with this data
989 * This data its initial parameters for definition fields in mail_api CLASS
990 *
991 */
992
993 $init_fields_values = wpbc_import6_email__deny__get_fields_array_for_activation();
994
995 // 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
996 $init_fields_values_temp = array_values( $init_fields_values ); //FixIn: 7.0.1.32
997 $init_fields_values = array_shift( $init_fields_values_temp );
998
999
1000 $mail_api = new WPBC_Emails_API_Deny( WPBC_EMAIL_DENY_ID, $init_fields_values );
1001
1002 ////////////////////////////////////////////////////////////////////////////
1003
1004 if ( $mail_api->fields_values['enabled'] == 'Off' ) return false; // Email template deactivated - exit.
1005
1006
1007 $replace = wpbc__get_replace_shortcodes__email_deny( $booking_id, $bktype, $formdata );
1008 $replace[ 'denyreason' ] = $denyreason; //FixIn: 7.0.1.1
1009
1010 // Replace shortcodes with custom URL parameter, like: 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl'
1011 foreach ( array( 'visitorbookingediturl', 'visitorbookingcancelurl', 'visitorbookingpayurl' , 'visitorbookingslisting') as $url_shortcode ) { //FixIn: 7.0.1.8 //FixIn: 8.1.3.5.1
1012
1013 // Loop to search if we are having several such shortcodes in our $mail_api->fields_values['content'] (For example, if we have several languges ).
1014 $pos = 0; //FixIn: 7.0.1.52
1015 do {
1016 $shortcode_params = wpbc_get_params_of_shortcode_in_string( $url_shortcode, $mail_api->fields_values['content'] , $pos );
1017
1018 if ( ( ! empty( $shortcode_params ) ) && ( isset( $shortcode_params['url'] ) ) ){
1019
1020 $pos = $shortcode_params['end'];
1021
1022 $exist_replace = substr( $mail_api->fields_values['content'], $shortcode_params['start'], ( $shortcode_params['end'] - $shortcode_params['start'] ) );
1023
1024 $new_replace = $url_shortcode . rand(1000,9000);
1025
1026 $pos = $shortcode_params['start'] + strlen( $new_replace ); //FixIn: 9.7.3.5.1
1027 $mail_api->fields_values['content'] = str_replace( $exist_replace, $new_replace ,$mail_api->fields_values['content'] );
1028
1029 $replace[ $new_replace ] = apply_bk_filter( 'wpdev_booking_set_booking_edit_link_at_email', '['.$exist_replace.']', $booking_id );
1030 } else if ( //FixIn: 8.1.1.8
1031 ( ! empty( $shortcode_params ) )
1032 && ( isset( $shortcode_params['end'] ) )
1033 && ( $shortcode_params['end'] < strlen( $mail_api->fields_values['content'] ) )
1034 ) {
1035 $pos = $shortcode_params['end'];
1036 } else {
1037 $shortcode_params = false; //FixIn: 7.0.1.58
1038 }
1039
1040 } while ( ! empty( $shortcode_params ) ); //FixIn: 7.0.1.52
1041
1042 }
1043
1044 $mail_api->set_replace( $replace );
1045 $mail_api->fields_values['from_name'] = $mail_api->replace_shortcodes( $mail_api->fields_values['from_name'] ); //FixIn: 7.0.1.29
1046
1047
1048 $to = ( isset( $replace['email'] ) ) ? $replace['email'] : ''; // Get To field
1049
1050 if ( ! empty( $replace['email'] ) ) {
1051 $to = wpbc_email_prepand_person_name( $replace['email'], $replace );
1052 }
1053
1054 $to = wpbc_check_for_several_emails_in_form( $to, $formdata, $bktype ); //FixIn: 6.0.1.9
1055
1056 $to = str_replace( ';', ',', $to );
1057
1058
1059 if ( wpbc_is_not_blank_email( $to, $replace['content'] ) ) {
1060 $email_result = $mail_api->send( $to, $replace );
1061 }
1062
1063 make_bk_action( 'wpbc_mu_set_environment_for_user', $previous_active_user ); // MU
1064 }
1065
1066 $email_result = ( isset( $email_result ) ) ? $email_result : false;
1067 return $email_result;
1068 }
1069
1070 // </editor-fold>
1071