define_shortcodes(); $this->register_shortcodes(); $this->register_ajax_handlers(); } /** * Define all plugin shortcodes * * @return void */ private function define_shortcodes() { $this->shortcodes = array( // Dashboard shortcodes 'hvac_dashboard' => array( 'callback' => array($this, 'render_dashboard'), 'description' => 'Trainer dashboard' ), 'hvac_master_dashboard' => array( 'callback' => array($this, 'render_master_dashboard'), 'description' => 'Master trainer dashboard' ), // Event management shortcodes // ENABLED - Phase 2 Native HVAC Implementation 'hvac_manage_event' => array( 'callback' => array($this, 'render_manage_event'), 'description' => 'Event management hub with integrated navigation' ), 'hvac_create_event' => array( 'callback' => array($this, 'render_create_event'), 'description' => 'Create new event with HVAC Event Form Builder' ), 'hvac_edit_event' => array( 'callback' => array($this, 'render_edit_event'), 'description' => 'Edit event with HVAC Event Form Builder' ), 'hvac_event_summary' => array( 'callback' => array($this, 'render_event_summary'), 'description' => 'Event summary page' ), // Authentication shortcodes 'hvac_community_login' => array( 'callback' => array($this, 'render_login'), 'description' => 'Community login form' ), 'hvac_trainer_registration' => array( 'callback' => array($this, 'render_registration'), 'description' => 'Trainer registration form' ), 'hvac_edit_profile' => array( 'callback' => array($this, 'render_edit_profile'), 'description' => 'Edit trainer profile form' ), // Profile shortcodes 'hvac_trainer_profile' => array( 'callback' => array($this, 'render_trainer_profile'), 'description' => 'Trainer profile page' ), // Certificate shortcodes 'hvac_certificate_reports' => array( 'callback' => array($this, 'render_certificate_reports'), 'description' => 'Certificate reports page' ), 'hvac_generate_certificates' => array( 'callback' => array($this, 'render_generate_certificates'), 'description' => 'Certificate generation page' ), // Communication shortcodes 'hvac_email_attendees' => array( 'callback' => array($this, 'render_email_attendees'), 'description' => 'Email attendees interface' ), 'hvac_communication_templates' => array( 'callback' => array($this, 'render_communication_templates'), 'description' => 'Communication templates management' ), 'hvac_communication_schedules' => array( 'callback' => array($this, 'render_communication_schedules'), 'description' => 'Communication schedules management' ), // Venue shortcodes 'hvac_trainer_venues_list' => array( 'callback' => array($this, 'render_venues_list'), 'description' => 'Trainer venues listing page' ), 'hvac_trainer_venue_manage' => array( 'callback' => array($this, 'render_venue_manage'), 'description' => 'Trainer venue management page' ), // Organizer shortcodes - Handled by HVAC_Organizers class 'hvac_trainer_organizers_list' => array( 'callback' => array($this, 'render_organizers_list'), 'description' => 'Trainer organizers listing page' ), 'hvac_trainer_organizer_manage' => array( 'callback' => array($this, 'render_organizer_manage'), 'description' => 'Trainer organizer management page' ), // Profile shortcodes - additional ones beyond hvac_trainer_profile 'hvac_trainer_profile_view' => array( 'callback' => array($this, 'render_trainer_profile_view'), 'description' => 'Trainer profile view page' ), 'hvac_trainer_profile_edit' => array( 'callback' => array($this, 'render_trainer_profile_edit'), 'description' => 'Trainer profile edit page' ), // Admin shortcodes 'hvac_google_sheets' => array( 'callback' => array($this, 'render_google_sheets_admin'), 'description' => 'Google Sheets integration admin' ), ); // Allow filtering of shortcode definitions $this->shortcodes = apply_filters('hvac_shortcode_definitions', $this->shortcodes); } /** * Register all shortcodes * * @return void */ private function register_shortcodes() { foreach ($this->shortcodes as $tag => $config) { add_shortcode($tag, $config['callback']); } // Log registration HVAC_Logger::info('Registered ' . count($this->shortcodes) . ' shortcodes', 'Shortcodes'); } /** * Get registered shortcodes * * @return array */ public function get_shortcodes() { return $this->shortcodes; } /** * Check if shortcode is registered * * @param string $tag Shortcode tag * @return bool */ public function is_registered($tag) { return isset($this->shortcodes[$tag]); } // ======================================== // Shortcode Render Methods // ======================================== /** * Render dashboard shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_dashboard($atts = array()) { // Add debug comment to verify this method is being called $debug = ''; // Use the HVAC_Community_Events instance method if (class_exists('HVAC_Community_Events')) { $hvac = HVAC_Community_Events::get_instance(); if (method_exists($hvac, 'render_dashboard')) { return $debug . $hvac->render_dashboard(); } } // Fallback if class not available if (!is_user_logged_in()) { return $debug . '

' . __('Please log in to view the dashboard.', 'hvac-community-events') . '

'; } // Include the dashboard template ob_start(); include HVAC_PLUGIN_DIR . 'templates/template-hvac-dashboard.php'; return ob_get_clean(); } /** * Render master dashboard shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_master_dashboard($atts = array()) { // Add debug comment to verify this method is being called $debug = ''; // Use the HVAC_Community_Events instance method if (class_exists('HVAC_Community_Events')) { $hvac = HVAC_Community_Events::get_instance(); if (method_exists($hvac, 'render_master_dashboard')) { return $debug . $hvac->render_master_dashboard(); } } // Fallback if class not available if (!is_user_logged_in()) { return $debug . '

' . __('Please log in to view the master dashboard.', 'hvac-community-events') . '

'; } $user = wp_get_current_user(); if (!in_array('hvac_master_trainer', $user->roles) && !current_user_can('manage_options')) { return $debug . '
' . __('You do not have permission to view the master dashboard. This dashboard is only available to Master Trainers and Administrators.', 'hvac-community-events') . '
'; } // Include the master dashboard template ob_start(); include HVAC_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php'; return ob_get_clean(); } /** * Render manage event shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_manage_event($atts = array()) { // The manage event page uses The Events Calendar Community Events shortcode if (!shortcode_exists('tribe_community_events')) { return '

' . __('Event management requires The Events Calendar Community Events add-on.', 'hvac-community-events') . '

'; } // Get event ID from URL parameter to determine if we're creating or editing $event_id = isset($_GET['event_id']) ? intval($_GET['event_id']) : null; if ($event_id && $event_id > 0) { // Editing existing event - use edit_event view with event ID // This is the proper TEC way to edit events with full field population return do_shortcode('[tribe_community_events view="edit_event" id="' . $event_id . '"]'); } else { // Creating new event - use submission_form view return do_shortcode('[tribe_community_events view="submission_form"]'); } } /** * Render create event shortcode using native HVAC Event Form Builder * * @param array $atts Shortcode attributes * @return string */ public function render_create_event($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to create events.', 'hvac-community-events') . '

'; } $user = wp_get_current_user(); if (!array_intersect(['hvac_trainer', 'hvac_master_trainer'], $user->roles)) { return '

' . __('You must be a trainer to create events.', 'hvac-community-events') . '

'; } // Parse shortcode attributes $atts = shortcode_atts(array( 'include_templates' => 'true', 'template_categories' => 'general,training,workshop,certification', 'show_navigation' => 'true' ), $atts); // Start output buffering ob_start(); try { // Initialize HVAC Event Form Builder if (class_exists('HVAC_Event_Form_Builder')) { $form_builder = new HVAC_Event_Form_Builder('hvac_event_form', $atts['include_templates'] === 'true'); $template_categories = explode(',', $atts['template_categories']); $template_categories = array_map('trim', $template_categories); $form_builder->create_event_form([ 'include_template_selector' => ($atts['include_templates'] === 'true'), 'include_venue_fields' => true, 'include_organizer_fields' => true, 'include_cost_fields' => true, 'include_capacity_fields' => true, 'include_datetime_fields' => true, 'template_categories' => $template_categories ]); ?>
'; HVAC_Menu_System::instance()->render_trainer_menu(); echo '
'; } // Display breadcrumbs if (class_exists('HVAC_Breadcrumbs')) { echo '
'; HVAC_Breadcrumbs::instance()->render(); echo '
'; } ?>

Create New Training Event

✓ Phase 2 Native Implementation - Using HVAC Event Form Builder with template system integration

Event created successfully!
'; } if (isset($_GET['error'])) { echo '
Error creating event. Please try again.
'; } // Render the form echo $form_builder->render(); ?>

Form Builder Not Available

The HVAC Event Form Builder class is not loaded. Please ensure the plugin is properly activated.

Form Loading Error

There was an error loading the event creation form: getMessage()); ?>

' . __('Event summary functionality not available.', 'hvac-community-events') . '

'; } $event_summary = new HVAC_Event_Summary(); return $event_summary->render_summary($atts); } /** * Render login shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_login($atts = array()) { if (!class_exists('\\HVAC_Community_Events\\Community\\Login_Handler')) { return '

' . __('Login functionality not available.', 'hvac-community-events') . '

'; } $login_handler = new \HVAC_Community_Events\Community\Login_Handler(); return $login_handler->render_login_form($atts); } /** * Render registration shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_registration($atts = array()) { // Dependencies are loaded during plugin initialization - no need for conditional require_once if (!class_exists('HVAC_Registration')) { return '

' . __('Registration functionality not available.', 'hvac-community-events') . '

'; } $registration = new HVAC_Registration(); return $registration->render_registration_form($atts); } /** * Render edit profile shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_edit_profile($atts = array()) { if (!class_exists('HVAC_Registration')) { return '

' . __('Profile editing functionality not available.', 'hvac-community-events') . '

'; } $registration = new HVAC_Registration(); return $registration->render_edit_profile_form($atts); } /** * Render trainer profile shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_trainer_profile($atts = array()) { if (!class_exists('HVAC_Trainer_Profile')) { return '

' . __('Profile functionality not available.', 'hvac-community-events') . '

'; } $trainer_profile = new HVAC_Trainer_Profile(); return $trainer_profile->render_profile($atts); } /** * Render certificate reports shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_certificate_reports($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to view certificate reports.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } // Use output buffering to capture template output properly ob_start(); // Set flag to prevent template from echoing directly define('HVAC_SHORTCODE_CONTEXT', true); include HVAC_PLUGIN_DIR . 'templates/certificates/certificate-reports-content.php'; $content = ob_get_clean(); // Return the content for embedding in the WordPress template return $content; } /** * Render generate certificates shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_generate_certificates($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to generate certificates.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } // Include the generate certificates content template ob_start(); include HVAC_PLUGIN_DIR . 'templates/certificates/generate-certificates-content.php'; return ob_get_clean(); } /** * Render email attendees shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_email_attendees($atts = array()) { // Check if user has appropriate permissions // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } ob_start(); include HVAC_PLUGIN_DIR . 'templates/email-attendees.php'; return ob_get_clean(); } /** * Render communication templates shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_communication_templates($atts = array()) { if (!class_exists('HVAC_Trainer_Communication_Templates')) { return '

' . __('Communication templates functionality not available.', 'hvac-community-events') . '

'; } // Use the new trainer communication templates class for read-only access return HVAC_Trainer_Communication_Templates::instance()->render_templates_interface(); } /** * Render communication schedules shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_communication_schedules($atts = array()) { if (!class_exists('HVAC_Communication_Scheduler')) { return '

' . __('Communication scheduler functionality not available.', 'hvac-community-events') . '

'; } // Check permissions if (!current_user_can('edit_tribe_events') && !current_user_can('manage_options')) { return '

' . __('You do not have permission to access this page.', 'hvac-community-events') . '

'; } $scheduler = hvac_communication_scheduler(); ob_start(); $scheduler->render_schedules_page(); return ob_get_clean(); } /** * Render Google Sheets admin shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_google_sheets_admin($atts = array()) { if (!class_exists('HVAC_Google_Sheets_Admin')) { return '

' . __('Google Sheets functionality not available.', 'hvac-community-events') . '

'; } // Check permissions if (!current_user_can('manage_options') && !current_user_can('view_all_trainer_data')) { return '

' . __('You do not have permission to access this page.', 'hvac-community-events') . '

'; } $google_sheets = new HVAC_Google_Sheets_Admin(); ob_start(); $google_sheets->render_admin_page(); return ob_get_clean(); } /** * Render venues list shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_venues_list($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to view venues.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } if (!class_exists('HVAC_Venues')) { return '

' . __('Venues functionality not available.', 'hvac-community-events') . '

'; } return HVAC_Venues::instance()->render_venues_list($atts); } /** * Render venue manage shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_venue_manage($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to manage venues.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } if (!class_exists('HVAC_Venues')) { return '

' . __('Venues functionality not available.', 'hvac-community-events') . '

'; } return HVAC_Venues::instance()->render_venue_manage($atts); } /** * Render organizers list shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_organizers_list($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to view organizers.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } if (!class_exists('HVAC_Organizers')) { return '

' . __('Organizers functionality not available.', 'hvac-community-events') . '

'; } $organizers = HVAC_Organizers::instance(); return $organizers->render_organizers_list($atts); } /** * Render organizer manage shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_organizer_manage($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to manage organizers.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } if (!class_exists('HVAC_Organizers')) { return '

' . __('Organizers functionality not available.', 'hvac-community-events') . '

'; } $organizers = HVAC_Organizers::instance(); return $organizers->render_organizer_manage($atts); } /** * Render trainer profile view shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_trainer_profile_view($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to view your profile.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } if (!class_exists('HVAC_Trainer_Profile_Manager')) { return '

' . __('Profile functionality not available.', 'hvac-community-events') . '

'; } $profile_manager = HVAC_Trainer_Profile_Manager::get_instance(); return $profile_manager->render_profile_view($atts); } /** * Render trainer profile edit shortcode * * @param array $atts Shortcode attributes * @return string */ public function render_trainer_profile_edit($atts = array()) { // Check permissions if (!is_user_logged_in()) { return '

' . __('Please log in to edit your profile.', 'hvac-community-events') . '

'; } // Allow trainers, master trainers, or WordPress admins if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

' . __('You must be a trainer to access this page.', 'hvac-community-events') . '

'; } if (!class_exists('HVAC_Trainer_Profile_Manager')) { return '

' . __('Profile functionality not available.', 'hvac-community-events') . '

'; } $profile_manager = HVAC_Trainer_Profile_Manager::get_instance(); return $profile_manager->render_profile_edit($atts); } /** * Register AJAX handlers */ private function register_ajax_handlers() { // Template preview AJAX handler add_action('wp_ajax_hvac_get_template_preview', array($this, 'ajax_get_template_preview')); add_action('wp_ajax_nopriv_hvac_get_template_preview', array($this, 'ajax_get_template_preview')); // Template loading AJAX handler add_action('wp_ajax_hvac_load_template_data', array($this, 'ajax_load_template_data')); add_action('wp_ajax_nopriv_hvac_load_template_data', array($this, 'ajax_load_template_data')); // Template saving AJAX handler add_action('wp_ajax_hvac_save_template', array($this, 'ajax_save_template')); add_action('wp_ajax_nopriv_hvac_save_template', array($this, 'ajax_save_template')); } /** * AJAX handler for getting template preview data */ public function ajax_get_template_preview() { // Verify nonce if (!wp_verify_nonce($_POST['nonce'] ?? '', 'hvac_event_form_nonce')) { wp_send_json_error('Security check failed'); return; } $template_id = sanitize_text_field($_POST['template_id'] ?? ''); if (empty($template_id)) { wp_send_json_error('No template ID provided'); return; } // Get template manager instance if (!class_exists('HVAC_Event_Template_Manager')) { wp_send_json_error('Template manager not available'); return; } $template_manager = HVAC_Event_Template_Manager::instance(); $template = $template_manager->get_template($template_id); if (!$template) { wp_send_json_error('Template not found'); return; } // Return template data wp_send_json_success($template); } /** * AJAX handler for loading template data into form */ public function ajax_load_template_data() { // Verify nonce if (!wp_verify_nonce($_POST['nonce'] ?? '', 'hvac_event_form_nonce')) { wp_send_json_error('Security check failed'); return; } $template_id = sanitize_text_field($_POST['template_id'] ?? ''); if (empty($template_id)) { wp_send_json_error('No template ID provided'); return; } // Get template manager instance if (!class_exists('HVAC_Event_Template_Manager')) { wp_send_json_error('Template manager not available'); return; } $template_manager = HVAC_Event_Template_Manager::instance(); $template = $template_manager->get_template($template_id); if (!$template || empty($template['field_data'])) { wp_send_json_error('Template data not found'); return; } // Return field data wp_send_json_success($template['field_data']); } /** * AJAX handler for saving new template */ public function ajax_save_template() { // Verify nonce if (!wp_verify_nonce($_POST['nonce'] ?? '', 'hvac_event_form_nonce')) { wp_send_json_error('Security check failed'); return; } // Check user permissions if (!is_user_logged_in()) { wp_send_json_error('Authentication required'); return; } $user = wp_get_current_user(); if (!array_intersect(['hvac_trainer', 'hvac_master_trainer'], $user->roles)) { wp_send_json_error('Insufficient permissions'); return; } // Validate and sanitize input $template_name = sanitize_text_field($_POST['template_name'] ?? ''); $template_description = sanitize_textarea_field($_POST['template_description'] ?? ''); $template_category = sanitize_text_field($_POST['template_category'] ?? ''); $is_public = (bool) ($_POST['is_public'] ?? false); $field_data = $_POST['field_data'] ?? []; if (empty($template_name)) { wp_send_json_error('Template name is required'); return; } if (empty($template_category)) { wp_send_json_error('Template category is required'); return; } // Sanitize field data $sanitized_field_data = []; foreach ($field_data as $key => $value) { $sanitized_key = sanitize_key($key); if (is_array($value)) { $sanitized_field_data[$sanitized_key] = array_map('sanitize_text_field', $value); } else { $sanitized_field_data[$sanitized_key] = sanitize_text_field($value); } } // Get template manager instance if (!class_exists('HVAC_Event_Template_Manager')) { wp_send_json_error('Template manager not available'); return; } $template_manager = HVAC_Event_Template_Manager::instance(); // Prepare template data $template_data = [ 'name' => $template_name, 'description' => $template_description, 'category' => $template_category, 'is_public' => $is_public, 'field_data' => $sanitized_field_data, 'created_by' => $user->ID, 'meta_data' => [ 'source' => 'event_form', 'created_at' => current_time('mysql'), 'user_ip' => $_SERVER['REMOTE_ADDR'] ?? '', ] ]; // Create the template $result = $template_manager->create_template($template_data); if ($result['success']) { wp_send_json_success([ 'message' => 'Template saved successfully', 'template_id' => $result['template_id'] ?? null ]); } else { wp_send_json_error($result['error'] ?? 'Failed to save template'); } } }