page_id = add_submenu_page( 'appointments', __( 'Appointments Settings', 'appointments' ), __( 'Settings', 'appointments' ), App_Roles::get_capability( 'manage_options', App_Roles::CTX_PAGE_SETTINGS ), "app_settings", array( &$this, 'render' ) ); add_action( 'load-' . $this->page_id, array( $this, 'on_load' ) ); } /** * Get the screen tabs * * @return array */ public function get_tabs() { $tabs = array( 'main' => __( 'General', 'appointments' ), 'working_hours' => __( 'Working Hours', 'appointments' ), 'exceptions' => __( 'Exceptions', 'appointments' ), 'services' => __( 'Services', 'appointments' ), 'workers' => __( 'Service Providers', 'appointments' ), 'addons' => __( 'Add-ons', 'appointments' ), 'log' => __( 'Logs', 'appointments' ), ); return apply_filters( 'appointments_tabs', $tabs ); } public function get_sections() { $sections = array( 'main' => array( 'time' => __( 'Time', 'appointments' ), 'accesibility' => __( 'Accessibility', 'appointments' ), 'display' => __( 'Display', 'appointments' ), 'payments' => __( 'Payments', 'appointments' ), 'notifications' => __( 'Notifications', 'appointments' ), 'advanced' => __( 'Advanced', 'appointments' ) ), 'services' => array( 'services' => __( 'Services', 'appointments' ), 'new-service' => __( 'Add new Service', 'appointments' ) ), 'workers' => array( 'workers' => __( 'Service Providers', 'appointments' ), 'new-worker' => __( 'Add new Service Provider', 'appointments' ) ) ); return apply_filters( 'appointments_settings_sections', $sections ); } /** * Get the sections HTML for the current tab * * @param $tab * * @return array */ public function tab_sections_markup( $tab ) { $sections = $this->get_sections(); if ( isset( $sections[ $tab ] ) ) { $content = ''; wp_enqueue_script( 'app-settings', appointments_plugin_url() . 'admin/js/admin-settings.js', array( 'jquery' ), appointments_get_db_version(), true ); $appointments = appointments(); $classes = $appointments->get_classes(); $presets = array(); foreach ( $classes as $class => $name ) { $presets[ $class ] = array(); for ( $k = 1; $k <= 3; $k ++ ) { $presets[ $class ][ $k ] = $appointments->get_preset( $class, $k ); } } wp_localize_script( 'app-settings', 'app_i10n', array( 'classes' => $classes, 'presets' => $presets )); return $content; } return ''; } /** * Return the sections for a tab * * @param $tab * * @return array */ public function get_tab_sections( $tab ) { $sections = $this->get_sections(); if ( isset( $sections[ $tab ] ) ) { return $sections[ $tab ]; } return array(); } /** * Return the current tab slug * * @return string */ public function get_current_tab() { $tabs = $this->get_tabs(); if ( empty( $_GET['tab'] ) ) { return key( $tabs ); } if ( ! array_key_exists( $_GET['tab'], $tabs ) ) { return key( $tabs ); } return $_GET['tab']; } private function _get_tab_link( $tab ) { $url = add_query_arg( 'tab', $tab ); $url = remove_query_arg( array( 'updated', 'added' ), $url ); return $url; } /** * Render the Settings page */ function render() { $appointments = appointments(); $appointments->get_lsw(); $tabs = $this->get_tabs(); $tab = $this->get_current_tab(); ?>

admin_settings_tab($tab); ?>
tab_sections_markup( $tab ); $sections = $this->get_tab_sections( $tab ); $callback_tabs = array( 'addons' => array('App_AddonHandler', 'create_addon_settings'), ); echo $sections_markup; echo '
'; $file = _appointments_get_settings_tab_view_file_path( $tab ); echo '
'; if ( $file ) { require_once( $file ); } else { do_action( 'app-settings-tabs', $tab, $sections ); do_action( "appointments-settings-tab-{$tab}", $sections ); } echo '
'; } /** * Save the settings */ public function on_load() { // Hidden feature to import/export settings if ( current_user_can( 'manage_options' ) && isset( $_GET['app-export-settings'] ) ) { $this->export_settings(); } $addons_action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : ''; if ( $addons_action ) { $this->_save_addons( $addons_action ); wp_redirect( remove_query_arg( array( 'addon', '_wpnonce', 'action' ) ) ); exit; } $action = isset( $_REQUEST['action_app'] ) ? $_REQUEST['action_app'] : false; if ( ! $action ) { return; } check_admin_referer( 'update_app_settings', 'app_nonce' ); $redirect_to = false; switch ( $action ) { case 'save_main': { $this->_save_general_settings(); break; } case 'save_working_hours': { $this->_save_working_hours(); break; } case 'save_exceptions': { $this->_save_exceptions(); break; } case 'save_services': { $this->_save_services(); break; } case 'add_new_service': { $redirect_to = $this->_add_service(); break; } case 'add_new_worker': { $redirect_to = $this->_add_worker(); break; } case 'save_workers': { $this->_save_workers(); break; } case 'save_log': { $this->_delete_logs(); } } do_action( 'appointments_save_settings', $action ); $redirect_to = $redirect_to ? $redirect_to : add_query_arg( 'updated', 1 ); // Redirecting when saving options wp_redirect( $redirect_to ); die; } public function _save_addons( $action ) { if ( 'activate' === $action && isset( $_REQUEST['addon'] ) ) { // Activate addon/s if ( ! is_array( $_REQUEST['addon'] ) ) { check_admin_referer( 'activate-addon' ); Appointments_Addon::activate_addon( $_REQUEST['addon'] ); } else { check_admin_referer( 'bulk-addons' ); foreach ( $_REQUEST['addon'] as $slug ) { Appointments_Addon::activate_addon( $slug ); } } } if ( 'deactivate' === $action && isset( $_REQUEST['addon'] ) ) { // Activate addon/s if ( ! is_array( $_REQUEST['addon'] ) ) { check_admin_referer( 'deactivate-addon' ); Appointments_Addon::deactivate_addon( $_REQUEST['addon'] ); } else { check_admin_referer( 'bulk-addons' ); foreach ( $_REQUEST['addon'] as $slug ) { Appointments_Addon::deactivate_addon( $slug ); } } } } private function _save_general_settings() { $options = appointments_get_options(); $appointments = appointments(); $options["min_time"] = $_POST["min_time"]; $options["additional_min_time"] = trim( $_POST["additional_min_time"] ); $options["admin_min_time"] = $_POST["admin_min_time"]; $options["app_lower_limit"] = trim( $_POST["app_lower_limit"] ); $options["app_limit"] = trim( $_POST["app_limit"] ); $options["clear_time"] = trim( $_POST["clear_time"] ); $options["spam_time"] = trim( $_POST["spam_time"] ); $options["auto_confirm"] = $_POST["auto_confirm"]; $options["allow_worker_wh"] = $_POST["allow_worker_wh"]; $options["allow_worker_confirm"] = $_POST["allow_worker_confirm"]; $options["allow_overwork"] = $_POST["allow_overwork"]; $options["allow_overwork_break"] = $_POST["allow_overwork_break"]; $assigned_to = isset( $_POST["dummy_assigned_to"] ) ? $_POST["dummy_assigned_to"] : 0; $worker = appointments_get_worker( $assigned_to ); $is_dummy = is_a( 'Appointments_Worker', $worker ) && $worker->is_dummy(); $options["dummy_assigned_to"] = ! $is_dummy ? $assigned_to : 0; $options["login_required"] = $_POST["login_required"]; $options["accept_api_logins"] = isset( $_POST["accept_api_logins"] ); $options["facebook-no_init"] = isset( $_POST["facebook-no_init"] ); $options['facebook-app_id'] = trim( $_POST['facebook-app_id'] ); $options['twitter-app_id'] = trim( $_POST['twitter-app_id'] ); $options['twitter-app_secret'] = trim( $_POST['twitter-app_secret'] ); $options["app_page_type"] = $_POST["app_page_type"]; $options["show_legend"] = $_POST["show_legend"]; $options["color_set"] = $_POST["color_set"]; foreach ( $appointments->get_classes() as $class=>$name ) { $options[$class."_color"] = $_POST[$class."_color"]; } $options["ask_name"] = isset( $_POST["ask_name"] ); $options["ask_email"] = isset( $_POST["ask_email"] ); $options["ask_phone"] = isset( $_POST["ask_phone"] ); $options["ask_phone"] = isset( $_POST["ask_phone"] ); $options["ask_address"] = isset( $_POST["ask_address"] ); $options["ask_city"] = isset( $_POST["ask_city"] ); $options["ask_note"] = isset( $_POST["ask_note"] ); $options["additional_css"] = trim( stripslashes_deep($_POST["additional_css"]) ); $options["payment_required"] = $_POST["payment_required"]; $options["percent_deposit"] = trim( str_replace( '%', '', $_POST["percent_deposit"] ) ); $options["fixed_deposit"] = trim( str_replace( $options["currency"], '', $_POST["fixed_deposit"] ) ); /* * Membership plugin is replaced by Membership2. Old options are * only saved when the depreacted Membership plugin is still active. */ if ( class_exists( 'M_Membership' ) ) { $options['members_no_payment'] = isset( $_POST['members_no_payment'] ); // not used?? $options['members_discount'] = trim( str_replace( '%', '', $_POST['members_discount'] ) ); $options['members'] = maybe_serialize( @$_POST["members"] ); } $options['currency'] = $_POST['currency']; $options['mode'] = $_POST['mode']; $options['merchant_email'] = trim( $_POST['merchant_email'] ); $options['return'] = $_POST['return']; $options['allow_free_autoconfirm'] = !empty($_POST['allow_free_autoconfirm']); $options["send_confirmation"] = $_POST["send_confirmation"]; $options["send_notification"] = @$_POST["send_notification"]; $options["confirmation_subject"] = stripslashes_deep( $_POST["confirmation_subject"] ); $options["confirmation_message"] = stripslashes_deep( $_POST["confirmation_message"] ); $options["send_reminder"] = $_POST["send_reminder"]; $options["reminder_time"] = str_replace( " ", "", $_POST["reminder_time"] ); $options["send_reminder_worker"] = $_POST["send_reminder_worker"]; $options["reminder_time_worker"] = str_replace( " ", "", $_POST["reminder_time_worker"] ); $options["reminder_subject"] = stripslashes_deep( $_POST["reminder_subject"] ); $options["reminder_message"] = stripslashes_deep( $_POST["reminder_message"] ); $options["send_removal_notification"] = $_POST["send_removal_notification"]; $options["removal_notification_subject"] = stripslashes_deep( $_POST["removal_notification_subject"] ); $options["removal_notification_message"] = stripslashes_deep( $_POST["removal_notification_message"] ); $options["log_emails"] = $_POST["log_emails"]; $options['disable_js_check_admin'] = isset( $_POST['disable_js_check_admin'] ); $options['disable_js_check_frontend'] = isset( $_POST['disable_js_check_frontend'] ); $options['allow_cancel'] = @$_POST['allow_cancel']; $options['cancel_page'] = @$_POST['cancel_page']; $options['thank_page'] = @$_POST['thank_page']; $options = apply_filters('app-options-before_save', $options); appointments_update_options( $options ); // Flush cache appointments_clear_cache(); if ( isset( $_POST['make_an_appointment'] ) ) { $tpl = !empty($_POST['app_page_type']) ? $_POST['app_page_type'] : false; wp_insert_post( array( 'post_title' => 'Make an Appointment', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => App_Template::get_default_page_template($tpl) ) ); } } private function _save_working_hours() { // Save Working Hours $appointments = appointments(); $location = (int)$_POST['location']; foreach ( array( 'closed', 'open' ) as $stat ) { appointments_update_worker_working_hours( $appointments->worker, $_POST[ $stat ], $stat, $location ); } } private function _save_exceptions() { // Save Exceptions $location = (int)$_POST['location']; $worker_id = absint( $_POST['worker_id'] ); check_admin_referer( 'app_settings_exceptions-' . $worker_id, 'app_exceptions_nonce' ); foreach ( array( 'closed', 'open' ) as $stat ) { $exceptions = $this->_sort( $_POST[$stat]["exceptional_days"] ); appointments_update_worker_exceptions( $worker_id, $stat, $exceptions, $location ); } } private function _save_services() { // Save Services if ( ! is_array( $_POST['services'] ) ) { return; } do_action('app-services-before_save'); foreach ( $_POST["services"] as $ID => $service ) { if ( '' != trim( $service["name"] ) ) { // Update or insert? $_service = appointments_get_service( $ID ); if ( $_service ) { $args = array( 'name' => $service["name"], 'capacity' => (int)$service["capacity"], 'duration' => $service["duration"], 'price' => $service["price"], 'page' => $service["page"] ); appointments_update_service( $ID, $args ); } do_action('app-services-service-updated', $ID); } else { // Entering an empty name means deleting of a service appointments_delete_service( $ID ); } } } private function _add_service() { $args = array( 'name' => sanitize_text_field( $_POST['service_name'] ), 'capacity' => absint( $_POST['service_capacity'] ), 'duration' => absint( $_POST['service_duration'] ), 'price' => sanitize_text_field( $_POST['service_price']), 'page' => absint( $_POST['service_page'] ) ); $app_id = appointments_insert_service( $args ); if ( is_wp_error( $app_id ) ) { wp_die( $app_id->get_error_message() ); } if ( ! $app_id ) { return false; } return admin_url( 'admin.php?page=app_settings&tab=services&added=true#section-services' ); } private function _add_worker() { if ( empty( $_POST["services_provided"] ) ) { wp_die( __( 'Please, select at least one service provided', 'appointments' ) ); } // Insert $args = array( 'ID' => $_POST["user"], 'price' => sanitize_text_field( $_POST['price']), 'services_provided' => $_POST["services_provided"], 'page' => absint( $_POST["worker_page"] ), 'dummy' => isset ( $_POST["dummy"] ) ); $worker_id = appointments_insert_worker( $args ); if ( ! $worker_id ) { return false; } return admin_url( 'admin.php?page=app_settings&tab=workers&added=true#section-workers' ); } private function _save_workers() { // Save Workers if ( ! is_array( $_POST["workers"] ) ) { return; } foreach ( $_POST["workers"] as $worker_id => $worker ) { $new_worker_id = absint( $worker["user"] ); $worker_id = absint( $worker_id ); if ( appointments_is_worker( $worker_id ) ) { // Update if ( ( $new_worker_id != $worker_id ) && ! empty ( $worker["services_provided"] ) ) { // We are trying to chage the user ID $count = appointments_get_worker( $new_worker_id ); // If the new ID already exist, do nothing if ( ! $count ) { // Otherwise, change the ID $args = array( 'ID' => $new_worker_id, 'price' => $worker["price"], 'services_provided' => $worker["services_provided"], 'dummy' => isset( $worker["dummy"] ), 'page' => $worker['page'] ); appointments_update_worker( $worker_id, $args ); } } elseif ( ( $new_worker_id == $worker_id ) && ! empty ( $worker["services_provided"] ) ) { // Do not change user ID but update $args = array( 'price' => $worker["price"], 'services_provided' => $worker["services_provided"], 'dummy' => isset( $worker["dummy"] ), 'page' => $worker['page'] ); appointments_update_worker( $worker_id, $args ); } elseif ( empty( $worker["services_provided"] ) ) { appointments_delete_worker( $worker_id ); } do_action( 'app-workers-worker-updated', $worker_id ); } } } private function _delete_logs(){ $appointments = appointments(); @unlink( $appointments->log_file ); } /** * Sorts a comma delimited string * @since 1.2 */ function _sort( $input ) { if ( strpos( $input, ',') === false ) return $input; $temp = explode( ',', $input ); sort( $temp ); return implode( ',', $temp ); } private function export_settings() { $options = maybe_serialize( appointments_get_options() ); $services = appointments_get_services(); $workers = appointments_get_workers(); } }