$plugin_dir, 'Zoho' => $zoho_dir, 'Admin' => $admin_dir, 'JavaScript' => $js_dir, 'CSS' => $css_dir, 'Logs' => $logs_dir ); foreach ($dirs as $name => $dir) { echo "$name directory: "; if (file_exists($dir)) { echo "Found at $dir\n"; } else { echo "Not found at $dir. Attempting to create...\n"; if (mkdir($dir, 0755, true)) { echo "Created $name directory successfully.\n"; } else { echo "Failed to create $name directory.\n"; } } } // Create logs directory if (\!file_exists($logs_dir)) { if (mkdir($logs_dir, 0755, true)) { echo "Created logs directory: $logs_dir\n"; } else { echo "Failed to create logs directory: $logs_dir\n"; } } // Check for zoho-config.php $zoho_config_file = $zoho_dir . '/zoho-config.php'; echo "\nChecking for zoho-config.php...\n"; if (file_exists($zoho_config_file)) { echo "Found at $zoho_config_file\n"; // Backup the file $backup_file = $zoho_config_file . '.bak.' . date('YmdHis'); if (copy($zoho_config_file, $backup_file)) { echo "Created backup at $backup_file\n"; } else { echo "Failed to create backup of zoho-config.php\n"; } } else { echo "Not found at $zoho_config_file. Will create a new one.\n"; } // Create or update zoho-config.php echo "\nUpdating zoho-config.php...\n"; $zoho_config_content = <<<'EOT' get_modules(); // Enhanced error handling and detailed response if (\$response && \!isset(\$response['error'])) { wp_send_json_success(array( 'message' => 'Connection successful\!', 'modules' => isset(\$response['modules']) ? count(\$response['modules']) . ' modules available' : 'No modules found' )); } else { \$error_message = isset(\$response['error']) ? \$response['error'] : 'Unknown error'; \$error_code = isset(\$response['code']) ? \$response['code'] : ''; \$error_details = isset(\$response['details']) ? \$response['details'] : ''; // Log the error if (defined('ZOHO_DEBUG_MODE') && ZOHO_DEBUG_MODE) { \$log_message = \"[\" . date('Y-m-d H:i:s') . \"] Connection test failed: \$error_message\\n\"; \$log_message .= \"[\" . date('Y-m-d H:i:s') . \"] Error code: \$error_code\\n\"; \$log_message .= \"[\" . date('Y-m-d H:i:s') . \"] Details: \$error_details\\n\"; \$log_message .= \"[\" . date('Y-m-d H:i:s') . \"] Raw response: \" . json_encode(\$response) . \"\\n\"; if (defined('ZOHO_LOG_FILE')) { error_log(\$log_message, 3, ZOHO_LOG_FILE); } } // Send detailed error data back to frontend wp_send_json_error(array( 'message' => 'Connection failed', 'error' => \$error_message, 'code' => \$error_code, 'details' => \$error_details, 'raw' => json_encode(\$response) )); } }"; // Replace in the file $admin_content = preg_replace($pattern, $replacement, $admin_content); // Save the updated file if (file_put_contents($zoho_admin_file, $admin_content)) { echo "Updated class-zoho-admin.php successfully.\n"; } else { echo "Failed to update class-zoho-admin.php.\n"; } } else { echo "class-zoho-admin.php already patched.\n"; } } else { echo "Not found at $zoho_admin_file. Creating a new file...\n"; // Create new class-zoho-admin.php $admin_content = <<<'EOT' admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('hvac_zoho_admin_nonce'), 'testing_connection' => __('Testing connection...', 'hvac-community-events'), 'connection_success' => __('Connection successful\!', 'hvac-community-events'), 'connection_error' => __('Connection failed', 'hvac-community-events') )); } /** * Render admin page */ public function render_admin_page() { ?>

/>
/>
/>


get_client_id(); $client_secret = $zoho_auth->get_client_secret(); $refresh_token = $zoho_auth->get_refresh_token(); if (empty($client_id) || empty($client_secret) || empty($refresh_token)) { echo '

'; _e('Zoho CRM credentials are not fully configured. Please check your zoho-config.php file and .env file.', 'hvac-community-events'); echo '

'; if (empty($client_id)) { echo '

ZOHO_CLIENT_ID is missing or empty.

'; } if (empty($client_secret)) { echo '

ZOHO_CLIENT_SECRET is missing or empty.

'; } if (empty($refresh_token)) { echo '

ZOHO_REFRESH_TOKEN is missing or empty.

'; } echo '
'; } else { echo '

'; _e('Zoho CRM credentials are configured.', 'hvac-community-events'); echo '

'; } ?>
get_modules(); // Enhanced error handling and detailed response if ($response && \!isset($response['error'])) { wp_send_json_success(array( 'message' => 'Connection successful\!', 'modules' => isset($response['modules']) ? count($response['modules']) . ' modules available' : 'No modules found' )); } else { $error_message = isset($response['error']) ? $response['error'] : 'Unknown error'; $error_code = isset($response['code']) ? $response['code'] : ''; $error_details = isset($response['details']) ? $response['details'] : ''; // Log the error if (defined('ZOHO_DEBUG_MODE') && ZOHO_DEBUG_MODE) { $log_message = "[" . date('Y-m-d H:i:s') . "] Connection test failed: $error_message\n"; $log_message .= "[" . date('Y-m-d H:i:s') . "] Error code: $error_code\n"; $log_message .= "[" . date('Y-m-d H:i:s') . "] Details: $error_details\n"; $log_message .= "[" . date('Y-m-d H:i:s') . "] Raw response: " . json_encode($response) . "\n"; if (defined('ZOHO_LOG_FILE')) { error_log($log_message, 3, ZOHO_LOG_FILE); } } // Send detailed error data back to frontend wp_send_json_error(array( 'message' => 'Connection failed', 'error' => $error_message, 'code' => $error_code, 'details' => $error_details, 'raw' => json_encode($response) )); } } } // Initialize the admin class new HVAC_Zoho_Admin(); EOT; if (file_put_contents($zoho_admin_file, $admin_content)) { echo "Created class-zoho-admin.php successfully.\n"; } else { echo "Failed to create class-zoho-admin.php.\n"; } } // Update class-zoho-crm-auth.php $zoho_auth_file = $zoho_dir . '/class-zoho-crm-auth.php'; echo "\nChecking for class-zoho-crm-auth.php...\n"; if (file_exists($zoho_auth_file)) { echo "Found at $zoho_auth_file\n"; // Backup the file $backup_file = $zoho_auth_file . '.bak.' . date('YmdHis'); if (copy($zoho_auth_file, $backup_file)) { echo "Created backup at $backup_file\n"; } else { echo "Failed to create backup of class-zoho-crm-auth.php\n"; } // Read the file $auth_content = file_get_contents($zoho_auth_file); // Check if already patched if (strpos($auth_content, 'load_env_from_dotenv') === false) { echo "Patching class-zoho-crm-auth.php with environment loading...\n"; // Find the beginning of the class definition $pattern = '/class HVAC_Zoho_CRM_Auth/'; // Add environment loading function $replacement = "/** * Load environment variables from .env file */ function load_env_from_dotenv() { // Look for .env file in plugin directory and up to 3 levels up \$search_dirs = [ dirname(dirname(dirname(__FILE__))), // Plugin directory dirname(dirname(dirname(dirname(__FILE__)))), // wp-content/plugins dirname(dirname(dirname(dirname(dirname(__FILE__))))), // wp-content dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))), // WordPress root ]; foreach (\$search_dirs as \$dir) { \$env_file = \$dir . '/.env'; if (file_exists(\$env_file)) { \$lines = file(\$env_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach (\$lines as \$line) { if (strpos(\$line, '=') \!== false && strpos(\$line, '#') \!== 0) { list(\$name, \$value) = explode('=', \$line, 2); \$name = trim(\$name); \$value = trim(\$value); // Remove quotes if present if (strpos(\$value, '\"') === 0 && strrpos(\$value, '\"') === strlen(\$value) - 1) { \$value = substr(\$value, 1, -1); } elseif (strpos(\$value, \"'\") === 0 && strrpos(\$value, \"'\") === strlen(\$value) - 1) { \$value = substr(\$value, 1, -1); } putenv(\"\$name=\$value\"); \$_ENV[\$name] = \$value; } } return true; } } return false; } class HVAC_Zoho_CRM_Auth"; // Replace the class definition $auth_content = preg_replace($pattern, $replacement, $auth_content); // Find the constructor $constructor_pattern = '/public function __construct\(\) {/'; $constructor_replacement = "public function __construct() { // Load environment variables from .env if available load_env_from_dotenv();"; // Replace the constructor $auth_content = preg_replace($constructor_pattern, $constructor_replacement, $auth_content); // Add error logging to API requests $api_pattern = '/public function make_api_request\(\$endpoint, \$method = \'GET\', \$data = array\(\)\) {/'; $api_replacement = "public function make_api_request(\$endpoint, \$method = 'GET', \$data = array()) { // Enhanced error logging if (defined('ZOHO_DEBUG_MODE') && ZOHO_DEBUG_MODE) { \$log_message = \"[\" . date('Y-m-d H:i:s') . \"] API Request: \$method \$endpoint\\n\"; \$log_message .= \"[\" . date('Y-m-d H:i:s') . \"] Data: \" . json_encode(\$data) . \"\\n\"; if (defined('ZOHO_LOG_FILE')) { error_log(\$log_message, 3, ZOHO_LOG_FILE); } }"; // Replace the API request method $auth_content = preg_replace($api_pattern, $api_replacement, $auth_content); // Add detailed logging to the API response $response_pattern = '/\$response = wp_remote_request\(\$url, \$args\);/'; $response_replacement = "\$response = wp_remote_request(\$url, \$args); // Enhanced error logging if (defined('ZOHO_DEBUG_MODE') && ZOHO_DEBUG_MODE) { \$log_message = \"[\" . date('Y-m-d H:i:s') . \"] API Response Code: \" . wp_remote_retrieve_response_code(\$response) . \"\\n\"; if (is_wp_error(\$response)) { \$log_message .= \"[\" . date('Y-m-d H:i:s') . \"] API Error: \" . \$response->get_error_message() . \"\\n\"; } else { \$response_body = wp_remote_retrieve_body(\$response); \$log_message .= \"[\" . date('Y-m-d H:i:s') . \"] API Response Body: \" . substr(\$response_body, 0, 1000) . (strlen(\$response_body) > 1000 ? '...' : '') . \"\\n\"; } if (defined('ZOHO_LOG_FILE')) { error_log(\$log_message, 3, ZOHO_LOG_FILE); } }"; // Replace the response handling $auth_content = preg_replace($response_pattern, $response_replacement, $auth_content); // Add getter methods for credentials if (strpos($auth_content, 'get_client_id') === false) { $auth_content .= <<<'EOT' /** * Get client ID * * @return string */ public function get_client_id() { return $this->client_id; } /** * Get client secret * * @return string */ public function get_client_secret() { return $this->client_secret; } /** * Get refresh token * * @return string */ public function get_refresh_token() { return $this->refresh_token; } EOT; } // Save the updated file if (file_put_contents($zoho_auth_file, $auth_content)) { echo "Updated class-zoho-crm-auth.php successfully.\n"; } else { echo "Failed to update class-zoho-crm-auth.php.\n"; } } else { echo "class-zoho-crm-auth.php already patched.\n"; } } else { echo "Not found at $zoho_auth_file. Will not create a new file since it's too complex.\n"; } // Create a diagnostic tool $diagnostic_file = $zoho_dir . '/diagnostics.php'; echo "\nCreating Zoho diagnostics tool...\n"; $diagnostic_content = <<<'EOT' get_access_token(); echo "Token generation result: " . ($token && \!is_array($token) ? "Success (Token: " . substr($token, 0, 10) . "...)" : "Failed") . "\n"; if (is_array($token) && isset($token['error'])) { echo "Error: " . $token['error'] . "\n"; if (isset($token['details'])) { echo "Details: " . $token['details'] . "\n"; } } // Test API connection echo "Testing API connection...\n"; $modules = $zoho_auth->get_modules(); if (is_array($modules) && \!isset($modules['error'])) { echo "API connection successful\!\n"; echo "Available modules: " . (isset($modules['modules']) ? count($modules['modules']) : '0') . "\n"; if (isset($modules['modules'])) { echo "Module names:\n"; foreach ($modules['modules'] as $module) { echo " - " . $module['api_name'] . "\n"; } } } else { echo "API connection failed\!\n"; echo "Error details: " . print_r($modules, true) . "\n"; } } catch (Exception $e) { echo "Exception: " . $e->getMessage() . "\n"; echo "Stack trace: " . $e->getTraceAsString() . "\n"; } } else { echo "HVAC_Zoho_CRM_Auth class does not exist\!\n"; } echo "\n"; echo "==========================================\n"; echo "Log File Contents (if available)\n"; echo "==========================================\n"; if (defined('ZOHO_LOG_FILE') && file_exists(ZOHO_LOG_FILE) && is_readable(ZOHO_LOG_FILE)) { echo "Log file found at: " . ZOHO_LOG_FILE . "\n"; echo "Log file size: " . filesize(ZOHO_LOG_FILE) . " bytes\n"; echo "Last 50 lines of log file:\n"; $log_lines = file(ZOHO_LOG_FILE); $last_lines = array_slice($log_lines, -50); echo "-------------------------\n"; foreach ($last_lines as $line) { echo $line; } echo "-------------------------\n"; } else { echo "Log file not found or not readable.\n"; } echo "\n"; echo "==========================================\n"; echo "Diagnostics completed at " . date('Y-m-d H:i:s') . "\n"; echo "==========================================\n"; // Exit to prevent any further output exit(); EOT; if (file_put_contents($diagnostic_file, $diagnostic_content)) { echo "Created diagnostics.php successfully.\n"; } else { echo "Failed to create diagnostics.php.\n"; } // Create CSS file for Zoho admin $zoho_css_file = $css_dir . '/zoho-admin.css'; echo "\nChecking for zoho-admin.css...\n"; if (file_exists($zoho_css_file)) { echo "Found at $zoho_css_file\n"; // Backup the file $backup_file = $zoho_css_file . '.bak.' . date('YmdHis'); if (copy($zoho_css_file, $backup_file)) { echo "Created backup at $backup_file\n"; } else { echo "Failed to create backup of zoho-admin.css\n"; } // Read the file $css_content = file_get_contents($zoho_css_file); // Check if already patched if (strpos($css_content, 'hvac-zoho-debug-info') === false) { echo "Adding debug information styling to zoho-admin.css...\n"; // Add debug information styling $css_content .= "\n\n/* Debug Information Styling */ .hvac-zoho-debug-info { margin-top: 15px; padding: 15px; background: #f9f9f9; border: 1px solid #ddd; border-left: 4px solid #dc3232; } .hvac-zoho-debug-info details summary { cursor: pointer; font-weight: bold; color: #0073aa; padding: 5px; background: #f0f0f0; } .hvac-zoho-debug-info pre { margin: 10px 0; padding: 10px; background: #f0f0f0; border: 1px solid #ddd; overflow: auto; max-height: 300px; }"; // Save the updated file if (file_put_contents($zoho_css_file, $css_content)) { echo "Updated zoho-admin.css successfully.\n"; } else { echo "Failed to update zoho-admin.css.\n"; } } else { echo "zoho-admin.css already patched.\n"; } } else { echo "Not found at $zoho_css_file. Creating a new file...\n"; // Create new zoho-admin.css $css_content = <<<'EOT' /* Zoho Admin Styles */ .hvac-zoho-debug-info { margin-top: 15px; padding: 15px; background: #f9f9f9; border: 1px solid #ddd; border-left: 4px solid #dc3232; } .hvac-zoho-debug-info details summary { cursor: pointer; font-weight: bold; color: #0073aa; padding: 5px; background: #f0f0f0; } .hvac-zoho-debug-info pre { margin: 10px 0; padding: 10px; background: #f0f0f0; border: 1px solid #ddd; overflow: auto; max-height: 300px; } EOT; if (file_put_contents($zoho_css_file, $css_content)) { echo "Created zoho-admin.css successfully.\n"; } else { echo "Failed to create zoho-admin.css.\n"; } } // Create JS file for Zoho admin $zoho_js_file = $js_dir . '/zoho-admin.js'; echo "\nChecking for zoho-admin.js...\n"; if (file_exists($zoho_js_file)) { echo "Found at $zoho_js_file\n"; // Backup the file $backup_file = $zoho_js_file . '.bak.' . date('YmdHis'); if (copy($zoho_js_file, $backup_file)) { echo "Created backup at $backup_file\n"; } else { echo "Failed to create backup of zoho-admin.js\n"; } // Read the file $js_content = file_get_contents($zoho_js_file); // Check if already patched if (strpos($js_content, 'hvac-zoho-debug-info') === false) { echo "Patching zoho-admin.js with enhanced error display...\n"; // Find the error handler $pattern = '/error: function\(response\) {([^}]+)}/s'; // Add enhanced error display $replacement = "error: function(response) { $('#hvac-zoho-test-connection-result').empty(); // Create detailed error display var errorHtml = '
'; errorHtml += '

' + response.data.message + ': ' + response.data.error + '

'; // Add error code if available if (response.data.code) { errorHtml += '

Error Code: ' + response.data.code + '

'; } // Add debugging info errorHtml += '
'; // Add details if available if (response.data.details) { errorHtml += '

Details: ' + response.data.details + '

'; } // Add raw response data if available if (response.data.raw) { errorHtml += '
'; errorHtml += 'Raw Response Data (click to expand)'; errorHtml += '
' + JSON.stringify(JSON.parse(response.data.raw), null, 2) + '
'; errorHtml += '
'; } errorHtml += '
'; // Close debug info div errorHtml += '
'; // Close notice div $('#hvac-zoho-test-connection-result').html(errorHtml); }"; // Replace the error handler $js_content = preg_replace($pattern, $replacement, $js_content); // Save the updated file if (file_put_contents($zoho_js_file, $js_content)) { echo "Updated zoho-admin.js successfully.\n"; } else { echo "Failed to update zoho-admin.js.\n"; } } else { echo "zoho-admin.js already patched.\n"; } } else { echo "Not found at $zoho_js_file. Creating a new file...\n"; // Create new zoho-admin.js $js_content = <<<'EOT' jQuery(document).ready(function($) { $('#hvac-zoho-test-connection').on('click', function(e) { e.preventDefault(); var $button = $(this); var $result = $('#hvac-zoho-test-connection-result'); $button.prop('disabled', true); $result.html('

' + hvac_zoho_admin.testing_connection + '

'); $.ajax({ url: hvac_zoho_admin.ajax_url, type: 'POST', data: { action: 'hvac_zoho_test_connection', nonce: hvac_zoho_admin.nonce }, success: function(response) { $button.prop('disabled', false); $result.empty(); if (response.success) { var successHtml = '
'; successHtml += '

' + response.data.message + '

'; if (response.data.modules) { successHtml += '

' + response.data.modules + '

'; } successHtml += '
'; $result.html(successHtml); } else { $result.html('

Connection test failed. Please check the logs.

'); } }, error: function(response) { $button.prop('disabled', false); $result.empty(); // Create detailed error display var errorHtml = '
'; errorHtml += '

' + response.data.message + ': ' + response.data.error + '

'; // Add error code if available if (response.data.code) { errorHtml += '

Error Code: ' + response.data.code + '

'; } // Add debugging info errorHtml += '
'; // Add details if available if (response.data.details) { errorHtml += '

Details: ' + response.data.details + '

'; } // Add raw response data if available if (response.data.raw) { errorHtml += '
'; errorHtml += 'Raw Response Data (click to expand)'; errorHtml += '
' + JSON.stringify(JSON.parse(response.data.raw), null, 2) + '
'; errorHtml += '
'; } errorHtml += '
'; // Close debug info div errorHtml += '
'; // Close notice div $result.html(errorHtml); } }); }); }); EOT; if (file_put_contents($zoho_js_file, $js_content)) { echo "Created zoho-admin.js successfully.\n"; } else { echo "Failed to create zoho-admin.js.\n"; } } echo "\n==========================================\n"; echo "Zoho CRM Integration Patcher completed\n"; echo "==========================================\n"; echo "Timestamp: " . date('Y-m-d H:i:s') . "\n\n"; echo "The following files were patched:\n"; echo "- " . $zoho_config_file . "\n"; echo "- " . $zoho_admin_file . "\n"; echo "- " . $zoho_auth_file . "\n"; echo "- " . $zoho_js_file . "\n"; echo "- " . $zoho_css_file . "\n"; echo "- " . $diagnostic_file . "\n"; echo "\nYou can now test the Zoho CRM integration in the WordPress admin panel.\n"; echo "If issues persist, check the logs at: " . $logs_dir . "/zoho-debug.log\n"; echo "You can also run the diagnostics tool at: /wp-content/plugins/hvac-community-events/includes/zoho/diagnostics.php?run_diagnostics=true\n"; // Exit to prevent any further output exit(); EOPHP < /dev/null