This commit addresses the 500 error on the certificate-reports page by: 1. Adding proper error handling to certificate templates 2. Ensuring required classes are loaded in the right order 3. Adding try-catch blocks for better error reporting 4. Creating diagnostic and troubleshooting tools 5. Fixing method signature issues in the certificate manager The issues were caused by missing database tables or classes not being loaded in the correct order. Additional improvements: - Added certificate system diagnostic scripts - Added comprehensive troubleshooting documentation - Added automated fix deploy script
562 lines
No EOL
18 KiB
PHP
562 lines
No EOL
18 KiB
PHP
<?php
|
|
/**
|
|
* Main plugin class for HVAC Community Events
|
|
*/
|
|
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
class HVAC_Community_Events {
|
|
/**
|
|
* The single instance of the class
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Main instance
|
|
*/
|
|
public static function instance() {
|
|
if (is_null(self::$instance)) {
|
|
self::$instance = new self();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct() {
|
|
HVAC_Logger::info('HVAC_Community_Events constructor started', 'Core');
|
|
$this->define_constants();
|
|
HVAC_Logger::info('Constants defined', 'Core');
|
|
$this->includes();
|
|
HVAC_Logger::info('Includes completed', 'Core');
|
|
$this->init_hooks();
|
|
HVAC_Logger::info('Hooks initialized', 'Core');
|
|
}
|
|
|
|
/**
|
|
* Define constants
|
|
*/
|
|
private function define_constants() {
|
|
// Additional constants can be defined here
|
|
}
|
|
|
|
/**
|
|
* Include required files
|
|
*/
|
|
private function includes() {
|
|
HVAC_Logger::info('Loading required files', 'Core');
|
|
$files_to_include = [
|
|
'class-hvac-roles.php',
|
|
'class-hvac-registration.php',
|
|
'class-hvac-settings.php',
|
|
'community/class-login-handler.php',
|
|
'community/class-event-handler.php',
|
|
'class-hvac-dashboard-data.php',
|
|
'class-event-form-handler.php', // Add our form handler
|
|
'class-event-author-fixer.php', // Fix event author assignment
|
|
'class-hvac-dashboard.php', // New dashboard handler
|
|
'certificates/class-certificate-installer.php', // Certificate database installer
|
|
'certificates/class-certificate-manager.php', // Certificate management
|
|
'certificates/class-certificate-generator.php', // Certificate generation
|
|
'certificates/class-certificate-settings.php', // Certificate settings
|
|
'certificates/class-certificate-template.php', // Certificate template
|
|
'certificates/class-certificate-security.php', // Certificate security
|
|
'certificates/class-certificate-ajax-handler.php', // Certificate AJAX handling
|
|
'community/class-email-debug.php' // Email debugging tools
|
|
];
|
|
// Make sure Login_Handler is loaded first for shortcode registration
|
|
$login_handler_path = HVAC_CE_PLUGIN_DIR . 'includes/community/class-login-handler.php';
|
|
if (file_exists($login_handler_path)) {
|
|
require_once $login_handler_path;
|
|
HVAC_Logger::info("Included file: community/class-login-handler.php", 'Core');
|
|
}
|
|
|
|
foreach ($files_to_include as $file) {
|
|
// Skip Login_Handler as we've already loaded it
|
|
if ($file === 'community/class-login-handler.php') {
|
|
continue;
|
|
}
|
|
|
|
$path = HVAC_CE_PLUGIN_DIR . 'includes/' . $file;
|
|
if (file_exists($path)) {
|
|
require_once $path;
|
|
HVAC_Logger::info("Included file: {$file}", 'Core');
|
|
} else {
|
|
HVAC_Logger::error("Failed to include file: {$file} - File not found", 'Core');
|
|
}
|
|
}
|
|
|
|
// Load Zoho integration if in admin
|
|
if (is_admin()) {
|
|
$zoho_path = HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php';
|
|
if (file_exists($zoho_path)) {
|
|
require_once $zoho_path;
|
|
HVAC_Logger::info("Included Zoho admin interface", 'Core');
|
|
}
|
|
}
|
|
|
|
HVAC_Logger::info('All required files loaded', 'Core');
|
|
}
|
|
|
|
/**
|
|
* Initialize hooks
|
|
*/
|
|
private function init_hooks() {
|
|
// Register activation/deactivation hooks
|
|
// Note: These hooks are typically registered outside the class instance context
|
|
// register_activation_hook(__FILE__, array($this, 'activate')); // This won't work correctly here
|
|
// register_deactivation_hook(__FILE__, array($this, 'deactivate')); // This won't work correctly here
|
|
|
|
// Initialize other hooks
|
|
add_action('init', array($this, 'init'));
|
|
|
|
// Template loading for custom pages
|
|
add_filter('template_include', array($this, 'load_custom_templates'));
|
|
|
|
// Add authentication check for event summary page
|
|
add_action('template_redirect', array($this, 'check_event_summary_auth'));
|
|
|
|
// Add authentication check for email attendees page
|
|
add_action('template_redirect', array($this, 'check_email_attendees_auth'));
|
|
|
|
// Add authentication check for certificate pages
|
|
add_action('template_redirect', array($this, 'check_certificate_pages_auth'));
|
|
} // End init_hooks
|
|
|
|
/**
|
|
* Check authentication for event summary page
|
|
*/
|
|
public function check_event_summary_auth() {
|
|
// Check if we're on the event-summary page
|
|
if (is_page('event-summary') && !is_user_logged_in()) {
|
|
// Redirect to login page
|
|
wp_redirect(home_url('/community-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI'])));
|
|
exit;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check authentication for email attendees page
|
|
*/
|
|
public function check_email_attendees_auth() {
|
|
// Check if we're on the email-attendees page
|
|
if (is_page('email-attendees') && !is_user_logged_in()) {
|
|
// Redirect to login page
|
|
wp_redirect(home_url('/community-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI'])));
|
|
exit;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check authentication for certificate pages
|
|
*/
|
|
public function check_certificate_pages_auth() {
|
|
// Check if we're on certificate-related pages
|
|
if ((is_page('certificate-reports') || is_page('generate-certificates')) && !is_user_logged_in()) {
|
|
// Redirect to login page
|
|
wp_redirect(home_url('/community-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI'])));
|
|
exit;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Plugin activation (Should be called statically or from the main plugin file context)
|
|
*/
|
|
public static function activate() {
|
|
// Activation code here (e.g., page creation, role creation)
|
|
// Note: This method might need to be moved or called differently
|
|
}
|
|
|
|
/**
|
|
* Plugin deactivation (Should be called statically or from the main plugin file context)
|
|
*/
|
|
public static function deactivate() {
|
|
// Remove the hvac_trainer role
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-roles.php'; // Ensure class is available
|
|
HVAC_Roles::remove_hvac_trainer_role();
|
|
HVAC_Logger::info('Deactivation completed: HVAC trainer role removed.', 'Core');
|
|
}
|
|
|
|
/**
|
|
* Initialize function (hooked on 'init')
|
|
*/
|
|
public function init() {
|
|
// Initialize roles
|
|
$this->init_roles();
|
|
|
|
// Initialize settings (admin menu)
|
|
$this->init_settings();
|
|
|
|
// Initialize Zoho admin if in admin
|
|
if (is_admin()) {
|
|
$this->init_zoho_admin();
|
|
$this->init_admin_dashboard();
|
|
}
|
|
|
|
// Initialize forms
|
|
$this->init_forms();
|
|
|
|
// Initialize shortcodes
|
|
$this->init_shortcodes();
|
|
|
|
// Initialize certificate AJAX handler
|
|
if (class_exists('HVAC_Certificate_AJAX_Handler')) {
|
|
HVAC_Certificate_AJAX_Handler::instance();
|
|
}
|
|
|
|
// Initialize event form handler
|
|
if (class_exists('HVAC_Community_Events\Event_Form_Handler')) {
|
|
new \HVAC_Community_Events\Event_Form_Handler();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize roles
|
|
*/
|
|
private function init_roles() {
|
|
$roles = new HVAC_Roles();
|
|
// Note: Role creation is handled in the activate method or the class constructor
|
|
}
|
|
|
|
/**
|
|
* Initialize settings
|
|
*/
|
|
private function init_settings() {
|
|
new HVAC_Settings();
|
|
}
|
|
|
|
/**
|
|
* Initialize Zoho admin
|
|
*/
|
|
private function init_zoho_admin() {
|
|
if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php')) {
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php';
|
|
new HVAC_Zoho_Admin();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize admin dashboard
|
|
*/
|
|
private function init_admin_dashboard() {
|
|
if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php')) {
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php';
|
|
new HVAC_Admin_Dashboard();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize forms
|
|
*/
|
|
private function init_forms() {
|
|
$registration = new HVAC_Registration();
|
|
// Note: Form registration is handled in the class constructor
|
|
}
|
|
|
|
/**
|
|
* Initialize shortcodes
|
|
*/
|
|
private function init_shortcodes() {
|
|
// Registration form shortcode
|
|
add_shortcode('hvac_trainer_registration', array('HVAC_Registration', 'render_registration_form'));
|
|
|
|
// Community login shortcode - initialize Login_Handler to register the shortcode
|
|
new \HVAC_Community_Events\Community\Login_Handler();
|
|
|
|
// Dashboard shortcode
|
|
add_shortcode('hvac_dashboard', array($this, 'render_dashboard'));
|
|
|
|
// Add the event summary shortcode
|
|
add_shortcode('hvac_event_summary', array($this, 'render_event_summary'));
|
|
|
|
// Add trainer profile shortcode
|
|
add_shortcode('hvac_trainer_profile', array($this, 'render_trainer_profile'));
|
|
|
|
// Add edit profile shortcode
|
|
add_shortcode('hvac_edit_profile', array('HVAC_Registration', 'render_edit_profile_form'));
|
|
|
|
// Add email attendees shortcode
|
|
add_shortcode('hvac_email_attendees', array($this, 'render_email_attendees'));
|
|
|
|
// Add certificate reports shortcode
|
|
add_shortcode('hvac_certificate_reports', array($this, 'render_certificate_reports'));
|
|
|
|
// Add generate certificates shortcode
|
|
add_shortcode('hvac_generate_certificates', array($this, 'render_generate_certificates'));
|
|
|
|
// Remove the event form shortcode as we're using TEC's shortcode instead
|
|
// add_shortcode('hvac_event_form', array('HVAC_Community_Event_Handler', 'render_event_form'));
|
|
|
|
// Add future shortcodes here
|
|
}
|
|
|
|
/**
|
|
* Render dashboard content
|
|
*/
|
|
public function render_dashboard() {
|
|
if (!is_user_logged_in()) {
|
|
return '<p>Please log in to view the dashboard.</p>';
|
|
}
|
|
|
|
// Include the dashboard template
|
|
ob_start();
|
|
include HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-dashboard.php';
|
|
return ob_get_clean();
|
|
}
|
|
|
|
/**
|
|
* Render event summary content
|
|
*/
|
|
public function render_event_summary() {
|
|
// Check if user is logged in
|
|
if (!is_user_logged_in()) {
|
|
return '<p>Please log in to view the event summary.</p>';
|
|
}
|
|
|
|
// Get event ID from URL parameter
|
|
$event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0;
|
|
|
|
if ($event_id <= 0) {
|
|
return '<div class="hvac-error">No event ID provided. Please access this page from your dashboard.</div>';
|
|
}
|
|
|
|
// Check if the event exists and user has permission to view it
|
|
$event = get_post($event_id);
|
|
if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) {
|
|
return '<div class="hvac-error">Event not found or invalid.</div>';
|
|
}
|
|
|
|
// Check if the current user has permission to view this event
|
|
// For now, we'll check if they're the post author or have edit_posts capability
|
|
if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) {
|
|
return '<div class="hvac-error">You do not have permission to view this event summary.</div>';
|
|
}
|
|
|
|
// Include the event summary template
|
|
ob_start();
|
|
include HVAC_CE_PLUGIN_DIR . 'templates/event-summary/template-event-summary.php';
|
|
return ob_get_clean();
|
|
}
|
|
|
|
/**
|
|
* Render trainer profile content
|
|
*/
|
|
public function render_trainer_profile() {
|
|
if (!is_user_logged_in()) {
|
|
return '<p>Please log in to view your profile.</p>';
|
|
}
|
|
|
|
// Include the trainer profile template
|
|
ob_start();
|
|
include HVAC_CE_PLUGIN_DIR . 'templates/template-trainer-profile.php';
|
|
return ob_get_clean();
|
|
}
|
|
|
|
/**
|
|
* Render email attendees content
|
|
*/
|
|
public function render_email_attendees() {
|
|
// Check if user is logged in
|
|
if (!is_user_logged_in()) {
|
|
return '<p>Please log in to email event attendees.</p>';
|
|
}
|
|
|
|
// Get event ID from URL parameter
|
|
$event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0;
|
|
|
|
if ($event_id <= 0) {
|
|
return '<div class="hvac-error">No event ID provided. Please access this page from your dashboard or event summary page.</div>';
|
|
}
|
|
|
|
// Check if the event exists and user has permission to view it
|
|
$event = get_post($event_id);
|
|
if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) {
|
|
return '<div class="hvac-error">Event not found or invalid.</div>';
|
|
}
|
|
|
|
// Check if the current user has permission to view this event
|
|
// For now, we'll check if they're the post author or have edit_posts capability
|
|
if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) {
|
|
return '<div class="hvac-error">You do not have permission to email attendees for this event.</div>';
|
|
}
|
|
|
|
// Include the email attendees template
|
|
ob_start();
|
|
include HVAC_CE_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php';
|
|
return ob_get_clean();
|
|
}
|
|
|
|
/**
|
|
* Render certificate reports content
|
|
*/
|
|
public function render_certificate_reports() {
|
|
// Check if user is logged in
|
|
if (!is_user_logged_in()) {
|
|
return '<p>Please log in to view certificate reports.</p>';
|
|
}
|
|
|
|
// Check if the current user has permission to view certificate reports
|
|
// For now, we'll check if they're a trainer or have edit_posts capability
|
|
if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) {
|
|
return '<div class="hvac-error">You do not have permission to view certificate reports.</div>';
|
|
}
|
|
|
|
// Make sure certificate manager is loaded
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php';
|
|
|
|
// Make sure certificate security is loaded
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
|
|
|
|
// Include the certificate reports template with error handling
|
|
try {
|
|
ob_start();
|
|
include HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php';
|
|
return ob_get_clean();
|
|
} catch (Exception $e) {
|
|
return '<div class="hvac-error">Error loading certificate reports: ' . esc_html($e->getMessage()) . '</div>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render generate certificates content
|
|
*/
|
|
public function render_generate_certificates() {
|
|
// Check if user is logged in
|
|
if (!is_user_logged_in()) {
|
|
return '<p>Please log in to generate certificates.</p>';
|
|
}
|
|
|
|
// Get event ID from URL parameter if available
|
|
$event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0;
|
|
|
|
// Check if the event exists and user has permission to view it when event_id is provided
|
|
if ($event_id > 0) {
|
|
$event = get_post($event_id);
|
|
if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) {
|
|
return '<div class="hvac-error">Event not found or invalid.</div>';
|
|
}
|
|
|
|
// Check if the current user has permission to view this event
|
|
if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) {
|
|
return '<div class="hvac-error">You do not have permission to generate certificates for this event.</div>';
|
|
}
|
|
} else {
|
|
// If no event ID is provided, check general permissions
|
|
if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) {
|
|
return '<div class="hvac-error">You do not have permission to generate certificates.</div>';
|
|
}
|
|
}
|
|
|
|
// Make sure certificate manager is loaded
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php';
|
|
|
|
// Make sure certificate security is loaded
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php';
|
|
|
|
// Make sure certificate generator is loaded
|
|
require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-generator.php';
|
|
|
|
// Include the generate certificates template with error handling
|
|
try {
|
|
ob_start();
|
|
include HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php';
|
|
return ob_get_clean();
|
|
} catch (Exception $e) {
|
|
return '<div class="hvac-error">Error loading certificate generation: ' . esc_html($e->getMessage()) . '</div>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Include custom templates for plugin pages
|
|
*/
|
|
public function load_custom_templates($template) {
|
|
// Check for dashboard page
|
|
if (is_page('hvac-dashboard')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-dashboard.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for community-login page
|
|
if (is_page('community-login')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/page-community-login.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for my-events page
|
|
if (is_page('my-events')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/page-my-events.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for trainer-profile page
|
|
if (is_page('trainer-profile')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-trainer-profile.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for event-summary page
|
|
if (is_page('event-summary')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-event-summary.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for email-attendees page
|
|
if (is_page('email-attendees')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for certificate-reports page
|
|
if (is_page('certificate-reports')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for generate-certificates page
|
|
if (is_page('generate-certificates')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for edit-profile page
|
|
if (is_page('edit-profile')) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-edit-profile.php';
|
|
if (file_exists($custom_template)) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Check for single event view (temporary)
|
|
if ( is_singular( 'tribe_events' ) ) {
|
|
$custom_template = HVAC_CE_PLUGIN_DIR . 'templates/single-tribe_events.php';
|
|
if ( file_exists( $custom_template ) ) {
|
|
return $custom_template;
|
|
}
|
|
}
|
|
|
|
// Add future custom templates here
|
|
|
|
return $template;
|
|
} // End load_custom_templates
|
|
|
|
|
|
} // End class HVAC_Community_Events
|