Settings > Import page
* @category Settings API
* @author wpdevelop
*
* @web-site https://wpbookingcalendar.com/
* @email info@wpbookingcalendar.com
* @modified 2016-08-07
*
* This is COMMERCIAL SCRIPT
* We are not guarantee correct work and support of Booking Calendar, if some file(s) was modified by someone else then wpdevelop.
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
/** API for Settings Page */
class WPBC_API_SettingsImportGCal extends WPBC_Settings_API {
/**
* Settings API Constructor
* During creation, system try to load values from DB, if exist.
*
* @param type $id - "Pure Name"
*/
public function __construct( $id, $init_fields_values = array(), $options = array() ) {
$default_options = array(
'db_prefix_option' => ''
, 'db_saving_type' => 'separate'
);
// separate_prefix: update_bk_option( $this->options['db_prefix_option'] . $settings_id . '_' . $field_name , $value );
$options = wp_parse_args( $options, $default_options );
/**
* Activation and deactivation of these options already done at the wpbc-gcal.php file
//
// add_bk_action( 'wpbc_other_versions_activation', array( $this, 'activate' ) ); // Activate
// add_bk_action( 'wpbc_other_versions_deactivation', array( $this, 'deactivate' ) ); // Deactivate
*/
parent::__construct( $id, $options, $init_fields_values ); // Define ID of Setting page and options
}
/** Define settings Fields */
public function init_settings_fields() {
$this->fields = array();
// Auto import
if ( wpbc_is_mu_user_can_be_here('only_super_admin') ){
$this->fields['booking_gcal_auto_import_is_active'] = array(
'type' => 'checkbox'
, 'default' => 'Off'
, 'title' => __( 'Activate auto import', 'booking' )
/* translators: 1: ... */
, 'label' => sprintf( __( 'Check this box to %1$sactivate%2$s auto import events and creation bookings from them', 'booking' ),'','')
, 'description' => ''
, 'group' => 'auto_import'
);
// $options = array();
// $options[1] = '1 ' . __( 'hour', 'booking' );
// for ( $i = 2; $i < 24; $i++ ) {
// $options[$i] = $i . ' ' . __( 'hours', 'booking' );
// }
// $options[24] = '1 ' . __( 'day', 'booking' );
// for ( $i = 2; $i < 32; $i++ ) {
// $options[( $i * 24)] = $i . ' ' . __( 'days', 'booking' );
// }
// Fix for legacy code (previously) was only integer value here in hours
$legacy_booking_gcal_auto_import_time = get_bk_option( 'booking_gcal_auto_import_time' );
if ( ( false === strpos( $legacy_booking_gcal_auto_import_time, 'm' ) ) && ( false === strpos( $legacy_booking_gcal_auto_import_time, 'd' ) ) ) {
update_bk_option( 'booking_gcal_auto_import_time', strval( intval( $legacy_booking_gcal_auto_import_time ) * 60 ) . 'm' );
}
// Options
$extra_time = array();
foreach ( range( 15, 55, 15 ) as $extra_num ) { // Each 5 minutes
$extra_time[ $extra_num . 'm' ] = $extra_num . ' ' . __( 'minutes', 'booking' );
}
$extra_time[ '60' . 'm' ] = '1 ' . __( 'hour', 'booking' );
foreach ( range( 75, 115, 15 ) as $extra_num ) { // 1 hour + Each 5 minutes
$extra_time[ $extra_num . 'm' ] = '1 ' . __( 'hour', 'booking' ) . ' ' . ( $extra_num - 60 ) . ' ' . __( 'minutes', 'booking' );
}
foreach ( range( 120, 1380, 60 ) as $extra_num ) { // Each Hour based on minutes
$extra_time[ $extra_num . 'm' ] = ( $extra_num / 60 ) . ' ' . __( 'hours', 'booking' );
}
foreach ( range( 1, 30, 1 ) as $extra_num ) { // Each Day
$extra_time[ $extra_num . 'd' ] = $extra_num . ' ' . __( 'day(s)', 'booking' );
}
$cron_info = '';
$readable_time_of_next_run = WPBC()->cron->get_readable_time_of_last_run( 'wpbc_import_gcal' );
if ( ! empty( $readable_time_of_next_run ) ) {
$cron_info .= ' ' . esc_html__( 'Last import', 'booking' ) . ': ' . $readable_time_of_next_run;
}
$readable_time_of_next_run = WPBC()->cron->get_readable_time_of_next_run( 'wpbc_import_gcal', ''.__( 'during', 'booking' ).'' ) . '';
if ( ! empty( $readable_time_of_next_run ) ) {
$cron_info .= ' ' . esc_html__( 'Next import', 'booking' ) . ': ' . $readable_time_of_next_run;
}
// $active_tasks_arr = WPBC()->cron->get_active_tasks_info();
// if ( ! empty( $active_tasks_arr['wpbc_import_gcal'] ) ) {
// $cron_info .= ' ' . esc_html__( 'Last import', 'booking' ) . ': ' . $active_tasks_arr['wpbc_import_gcal']['last_time__run__local'];
// $cron_info .= ' ' . esc_html__( 'Next import', 'booking' ) . ': ' . $active_tasks_arr['wpbc_import_gcal']['next_time__run__local'];
// $cron_info .= ' ' . __( 'during', 'booking' ) . ': ' . wpbc_get_readable_time_interval( $active_tasks_arr['wpbc_import_gcal']['next_run_after_seconds'] ) . ' ';
// }
$this->fields['booking_gcal_auto_import_time'] = array(
'type' => 'select'
, 'default' => '24'
, 'title' => __('Import events every' ,'booking')
, 'description' => __('Select time duration of import requests.' ,'booking') . $cron_info
, 'description_tag' => 'span'
, 'css' => ''
, 'options' => $extra_time
, 'tr_class' => 'wpbc_sub_settings_grayed wpbc_tr_auto_import'
, 'group' => 'auto_import'
);
}
////////////////////////////////////////////////////////////////////////
// General Google Calendar Settings
$this->fields['booking_gcal_api_key'] = array(
'type' => 'text'
, 'default' => ''
//, 'placeholder' => ''
, 'title' => __('Google API Key', 'booking')
, 'description' => __('Please enter your Google API key. This field required to import events.' ,'booking')
. '
'
. __('Note:' ,'booking') . ' '
/* translators: 1: ... */
. sprintf( __( 'You can check in this %1$sinstruction how to generate and use your Google API key%2$s.', 'booking' )
, ''
,''
)
. '
'
. ( ( wpbc_is_this_demo() ) ? wpbc_get_warning_text_in_demo_mode() : '' )
, 'description_tag' => 'p'
, 'css' => ''//'width:100%'
, 'group' => 'general'
, 'tr_class' => '' // 'wpbc_sub_settings_grayed'
//, 'validate_as' => array( 'required' )
, 'is_demo_safe' => wpbc_is_this_demo()
);
// General Google ID for Free version
if ( ! class_exists('wpdev_bk_personal') )
$this->fields['booking_gcal_feed'] = array(
'type' => 'text'
, 'default' => ''
//, 'placeholder' => ''
, 'title' => __('Google Calendar ID', 'booking')
, 'description' => ( ( wpbc_is_this_demo() ) ? wpbc_get_warning_text_in_demo_mode() : '' )
, 'description_tag' => 'span'
, 'css' => 'width:100%'
, 'group' => 'general'
, 'tr_class' => '' // 'wpbc_sub_settings_grayed'
//, 'validate_as' => array( 'required' )
, 'is_demo_safe' => wpbc_is_this_demo()
);
////////////////////////////////////////////////////////////////////////
// M A X num - Default Settings
$this->fields['booking_gcal_events_max'] = array(
'type' => 'text'
, 'default' => '25'
//, 'placeholder' => ''
, 'title' => __('Maximum number', 'booking')
, 'description' => __('You can specify the maximum number of events to import during one session.' ,'booking')
, 'description_tag' => 'span'
, 'css' => 'width:4em'
, 'group' => 'default_settings'
, 'tr_class' => '' // 'wpbc_sub_settings_grayed'
//, 'validate_as' => array( 'required' )
);
// F R O M /////////////////////////////////////////////////////////
$options = array(
"now" => __('Now' ,'booking')
, "today" => __('00:00 today' ,'booking')
, "week" => __('Start of current week' ,'booking')
, "month-start" => __('Start of current month' ,'booking')
, "month-end" => __('End of current month' ,'booking')
, "any" => __('The start of time' ,'booking')
, "date" => __('Specific date / time' ,'booking')
);
$this->fields['booking_gcal_events_from'] = array(
'type' => 'select'
, 'default' => 'month-start'
, 'title' => __('From', 'booking')
, 'description' => __('Select option, when to start retrieving events.' ,'booking')
, 'description_tag' => 'span'
, 'css' => ''
, 'options' => $options
, 'group' => 'default_settings'
);
/////////////
$this->fields['booking_gcal_events_from_offset_html_prefix'] = array(
'type' => 'pure_html'
, 'group' => 'default_settings'
, 'html' => '
'
);
/////////////
// U N T I L /////////////////////////////////////////////////////
$options = array(
"now" => __('Now' ,'booking')
, "today" => __('00:00 today' ,'booking')
, "week" => __('Start of current week' ,'booking')
, "month-start" => __('Start of current month' ,'booking')
, "month-end" => __('End of current month' ,'booking')
, "any" => __('The end of time' ,'booking')
, "date" => __('Specific date / time' ,'booking')
);
$this->fields['booking_gcal_events_until'] = array(
'type' => 'select'
, 'default' => 'any'
, 'title' => __('Until', 'booking')
, 'description' => __('Select option, when to stop retrieving events.' ,'booking')
, 'description_tag' => 'span'
, 'css' => ''
, 'options' => $options
, 'group' => 'default_settings'
);
/////////////
$this->fields['booking_gcal_events_until_offset_html_prefix'] = array(
'type' => 'pure_html'
, 'group' => 'default_settings'
, 'html' => '
' . sprintf( __( 'You will now see a table loaded with the top item being the API Key. Copy this and paste it into %1$sGoogle API Key%2$s field at this page.', 'booking' ),'','') . '
' . sprintf( __( 'Now copy the Calendar ID to use in the plugin settings in your WordPress admin. Make sure to %1$suse the Calendar ID only, not the entire XML feed URL%2$s.', 'booking' ),'','') . '
';
$this->fields['booking_gcal_events_help']['value'][] = '';
////////////////////////////////////////////////////////////////////////
}
}
/**
* Show Content
* Update Content
* Define Slug
* Define where to show
*/
class WPBC_Page_SettingsImportGCal extends WPBC_Page_Structure {
public $settings_api = false;
/**
* API - for Fields of this Settings Page
*
* @param array $init_fields_values - array of init form fields data - this array can ovveride "default" fields and loaded data.
* @return object API
*/
public function get_api( $init_fields_values = array() ){
if ( $this->settings_api === false ) {
$this->settings_api = new WPBC_API_SettingsImportGCal( 'import_gcal' , $init_fields_values );
}
return $this->settings_api;
}
public function in_page() {
return 'wpbc-settings';
}
public function tabs() {
$tabs = array();
$tabs[ 'sync' ] = array(
'title' => __( 'Sync', 'booking') // Title of TAB
, 'page_title'=> __( 'Sync', 'booking') // Title of Page
, 'hint' => __('Import' ,'booking') . ' / ' . __('Export' ,'booking')
//, 'link' => '' // Can be skiped, then generated link based on Page and Tab tags. Or can be extenral link
//, 'position' => '' // 'left' || 'right' || ''
//, 'css_classes'=> '' // CSS class(es)
//, 'icon' => '' // Icon - link to the real PNG img
, 'font_icon' => 'wpbc_icn_sync_alt' // CSS definition of forn Icon
//, 'default' => false // Is this tab activated by default or not: true || false.
//, 'disabled' => false // Is this tab disbaled: true || false.
//, 'hided' => false // Is this tab hided: true || false.
, 'subtabs' => array()
);
$subtabs = array();
$subtabs[ 'gcal' ] = array(
'type' => 'subtab' // Required| Possible values: 'subtab' | 'separator' | 'button' | 'goto-link' | 'html'
, 'title' => __('Import Google Calendar', 'booking') //__('Google Calendar' ,'booking') . ' - ' . __('Events Import' ,'booking') // Title of TAB
, 'page_title' => __('Import Google Calendar Events', 'booking') //__('Import Settings' ,'booking') // Title of Page
, 'hint' => __('Set up and configure the import of Google Calendar events using the API.' ,'booking') // Hint
, 'link' => '' // link
, 'position' => '' // 'left' || 'right' || ''
, 'css_classes' => '' // CSS class(es)
//, 'icon' => 'http://.../icon.png' // Icon - link to the real PNG img
, 'font_icon' => 'wpbc-bi-google' // CSS definition of Font Icon
, 'default' => false // Is this sub tab activated by default or not: true || false.
, 'disabled' => false // Is this sub tab deactivated: true || false.
, 'checkbox' => false // or definition array for specific checkbox: array( 'checked' => true, 'name' => 'feature1_active_status' ) //, 'checkbox' => array( 'checked' => $is_checked, 'name' => 'enabled_active_status' )
, 'content' => 'content' // Function to load as conten of this TAB
);
$tabs[ 'sync' ]['subtabs'] = $subtabs;
return $tabs;
}
/** Show Content of Settings page */
public function content() {
//$active_tasks_arr = WPBC()->cron->get_active_tasks_info();
//debuge( $active_tasks_arr );
$this->css();
////////////////////////////////////////////////////////////////////////
// Checking
////////////////////////////////////////////////////////////////////////
do_action( 'wpbc_hook_settings_page_header', 'import_gcal_settings'); // Define Notices Section and show some static messages, if needed
if ( ! wpbc_is_mu_user_can_be_here('activated_user') ) return false; // Check if MU user activated, otherwise show Warning message.
// 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.
////////////////////////////////////////////////////////////////////////
// Load Data
////////////////////////////////////////////////////////////////////////
$this->get_api(); // Load fields Data from DB
////////////////////////////////////////////////////////////////////////
// S u b m i t Main Form
////////////////////////////////////////////////////////////////////////
$submit_form_name = 'wpbc_import_gcal'; // Define form name
// $this->get_api()->validated_form_id = $submit_form_name; // Define ID of Form for ability to validate fields (like required field) before submit.
// phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing
if ( isset( $_POST['is_form_sbmitted_'. $submit_form_name ] ) ) {
// Nonce checking {Return false if invalid, 1 if generated between, 0-12 hours ago, 2 if generated between 12-24 hours ago. }
$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
// Save Changes
$this->update();
}
////////////////////////////////////////////////////////////////////////
// JavaScript: Tooltips, Popover, Datepick (js & css)
////////////////////////////////////////////////////////////////////////
echo '';
wpbc_js_for_bookings_page();
echo '';
?>
'wpbc_booking_resources_search_form'
, 'search_get_key' => 'wh_resource_id'
, 'is_pseudo' => false
) );
////////////////////////////////////////////////////////////////////////
// Content ////////////////////////////////////////////////////////////
?>
enqueue_js();
}
/** Save Chanages */
public function update() {
//debuge($_POST);
if ( function_exists( 'wpbc_import_gcal__update') )
wpbc_import_gcal__update();
// Get Validated Email fields
$validated_fields = $this->get_api()->validate_post();
$validated_fields = apply_filters( 'wpbc_fields_before_saving_to_db__import_gcal', $validated_fields ); //Hook for validated fields.
//debuge($validated_fields);
$this->get_api()->save_to_db( $validated_fields );
wpbc_show_changes_saved_message();
// Old way of saving:
// update_bk_option( 'booking_cache_expiration' , WPBC_Settings_API::validate_text_post_static( 'booking_cache_expiration' ) );
}
//TODO: clear unused CSS here
//
/** CSS for this page */
private function css() {
?>
}
add_action('wpbc_menu_created', array( new WPBC_Page_SettingsImportGCal() , '__construct') ); // Executed after creation of Menu
/**
* Override fields array of Settings page, AFTER saving to DB. Some fields have to have different Values.
* Set here values for our pseudo-options, after saving to DB
* Because they was not overloading during this saving
*
* @param array $fields
* @param string $page_id
* @return array - fields
*/
function wpbc_fields_after_saving_to_db__import_gcal( $fields, $page_id ) {
if ( $page_id == 'import_gcal' ) { // Check our API ID relative saving of this settings page
// Update Cron // FixIn: 7.0.1.9.
if ( $fields['booking_gcal_auto_import_is_active']['value'] == 'On' ) {
$booking_gcal_auto_import_time = $fields['booking_gcal_auto_import_time']['value'];
if ( false !== strpos( $booking_gcal_auto_import_time, 'm' ) ) {
$booking_gcal_auto_import_time = str_replace( array( 'm', 'd' ), '', $booking_gcal_auto_import_time );
$booking_gcal_auto_import_time = intval( $booking_gcal_auto_import_time );
$time_dimension = 'm';
} else if ( false !== strpos( $booking_gcal_auto_import_time, 'd' ) ) {
$booking_gcal_auto_import_time = str_replace( array( 'm', 'd' ), '', $booking_gcal_auto_import_time );
$booking_gcal_auto_import_time = intval( $booking_gcal_auto_import_time );
$time_dimension = 'd';
} else { // Old hours
$booking_gcal_auto_import_time = intval( $booking_gcal_auto_import_time );
$time_dimension = 'h';
}
update_bk_option( 'booking_gcal_auto_import_time', $fields['booking_gcal_auto_import_time']['value'] );
// add
WPBC()->cron->update( 'wpbc_import_gcal' , array(
'action' => array( 'wpbc_silent_import_all_events' ) // Action and parameters
, 'start_time' => (time()-1) // Now
, 'last_execution' => time() // Set last time execution
, 'recurrence' => intval( $booking_gcal_auto_import_time ) // Set time value
, 'time_dimension' => $time_dimension // 'h' - hours, 'm' - minutes, 'd' - days
) );
} else {
WPBC()->cron->delete( 'wpbc_import_gcal' ); // delete
}
}
return $fields;
}
add_filter('wpbc_fields_after_saving_to_db', 'wpbc_fields_after_saving_to_db__import_gcal', 10, 2);