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 . '' . __('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 ''; } $user = wp_get_current_user(); if (!array_intersect(['hvac_trainer', 'hvac_master_trainer'], $user->roles) && !current_user_can('manage_options')) { return ''; } // 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 ]); ?>✓ Phase 2 Native Implementation - Using HVAC Event Form Builder with template system integration
' . __('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) && !current_user_can('manage_options')) { 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'); } } }