?? GreyFile — Mystic File Browser

Current path: home/webdevt/www/demo2/wp-content/plugins/divi-contact-form-helper/d5/server/Frontend/Controllers/



?? Go up: /home/webdevt/www/demo2/wp-content/plugins/divi-contact-form-helper/d5/server/Frontend

?? Viewing: ContactFormSubmissionProcessor.php

<?php

namespace KS_PAC_DCFH\Frontend\Controllers;

use KS_PAC_DCFH\Frontend\Services\ConfirmationEmailService;

if (!defined('ABSPATH')) {
    exit;
}

class ContactFormSubmissionProcessor
{
    public function load(): void
    {
        add_action('et_pb_contact_form_submit', [$this, 'process_form_data'], 10, 3);
    }

    public function process_form_data($processed_fields_values, $et_contact_error, $contact_form_info): void
    {
        if (empty($processed_fields_values)) {
            return;
        }
        // Extract contact form details
        $contact_form_number = $contact_form_info['contact_form_number'];
        // Initialize processed data
        $processed_form_data = [];
        // Instance of contact form rep
        $contact_form_rep = ContactFormDataRepository::instance();
        $contact_form_id = $contact_form_rep->contact_form_id;
        // Instance of confirmation email service
        $confirmation_email = ConfirmationEmailService::instance();
        $confirmation_email_field_id = strtolower($confirmation_email->email_field_id ?? '');
        // Instance of file helper service
        [$year, $month] = ks_pac_dcfh_app()->file_utils()::get_subdir();
        // Process fields
        foreach ($processed_fields_values as $field_data) {
            // Skip if the structure is invalid or missing required keys
            if (!isset($field_data['id'], $field_data['label'], $field_data['value'], $field_data['type'])) {
                continue;
            }
            $field_id = ks_pac_dcfh_app()->misc_utils()::sanitize_key($field_data['id']);
            $field_label = $field_data['label'];
            $field_value = (empty($field_data['value']) && is_array($field_data['value'])) ? stripslashes(implode(', ', $field_data['value'])) : stripslashes($field_data['value']);
            $field_type = $field_data['type'];
            if (in_array($field_data['type'], ['html-block', 'page-break'],true)) {
                continue;
            }
            $is_file_field = in_array($field_type, ['file', 'signature-pad', 'signature_pad'], true);
            if ($is_file_field) {
                $contact_form_rep->temp_files[$field_id] = $field_value;
                if (!$contact_form_rep->save_files_to_db) {
                    continue;
                }
                // Add extra file-related data for DB storage
                $field_values = [
                    'id' => $field_id,
                    'label' => $field_label,
                    'value' => $field_value,
                    'type' => $field_type,
                    'subdir' => "$year/$month",
                    'is_media_library' => $contact_form_rep->save_files_to_media,
                ];
            } else {
                $field_values = [
                    'id' => $field_id,
                    'label' => $field_label,
                    'value' => $field_value,
                    'type' => $field_type,
                ];
            }
            $processed_form_data[] = $field_values;
        }
        // Query Params
        if ($contact_form_rep->save_url_params) {
            $query_params = $this->get_sanitized_query_params();
            $contact_form_rep->query_params = $query_params;
            $processed_form_data = array_merge($processed_form_data, $query_params);
            ks_pac_dcfh_app()->form_settings_manager()::update_contact_form_query_params($contact_form_id, $query_params);
        }
        // Get the original field order
        $form_fields_arr = $contact_form_rep->form_fields_arr ?? [];
        $processed_conditional_fields = $this->processed_conditional_fields($contact_form_number);
        if (!empty($form_fields_arr)) {
            $existing_fields_map = [];
            foreach ($processed_form_data as $field) {
                $existing_fields_map[$field['id']] = $field;
            }
            $conditional_fields_map = [];
            foreach ($processed_conditional_fields as $field) {
                $conditional_fields_map[$field['id']] = $field;
            }
            $ordered_form_data = [];
            foreach ($form_fields_arr as $field_id) {
                if (isset($existing_fields_map[$field_id])) {
                    $ordered_form_data[] = $existing_fields_map[$field_id];
                } elseif (isset($conditional_fields_map[$field_id])) {
                    $ordered_form_data[] = $conditional_fields_map[$field_id];
                }
            }
            foreach ($processed_form_data as $field) {
                if (!in_array($field['id'], $form_fields_arr) && !isset($conditional_fields_map[$field['id']])) {
                    $ordered_form_data[] = $field;
                }
            }
            $processed_form_data = $ordered_form_data;
        } else {
            if (!empty($processed_conditional_fields)) {
                $processed_form_data = array_merge($processed_form_data, $processed_conditional_fields);
            }
        }
        //ks_pac_dcfh_log($processed_form_data, true);
        $contact_form_rep->contact_form_orderindex = $contact_form_number;
        $contact_form_rep->contact_form_processed_data = $processed_form_data;
        $contact_form_rep->contact_form_raw_data = $processed_fields_values;
        $contact_form_rep->contact_form_referrer_url = $this->get_referer_url();
        $contact_form_rep->contact_form_submitter_email = $this->determine_sender_email($processed_fields_values, $confirmation_email_field_id);
        $contact_form_rep->is_contact_form_processed = true;
        // Log Raw Entries
        if (ks_pac_dcfh_app()->settings_rep()->is_setting_enabled('is_entry_logging_enabled')) {
            $this->log_entries($contact_form_rep);
        }
    }

    private function processed_conditional_fields(int $order_index): array
    {
        $processed_fields = [];
        $hidden_data_str = isset($_POST["et_pb_contact_email_hidden_fields_$order_index"]) ? sanitize_text_field($_POST["et_pb_contact_email_hidden_fields_$order_index"]) : null; // phpcs:ignore WordPress.Security.NonceVerification
        if (!$hidden_data_str) {
            return $processed_fields;
        }
        $hidden_fields = json_decode(str_replace('\\', '', $hidden_data_str), true);
        foreach ($hidden_fields as $field) {
            $field_id = "{$field}_cond_meta";
            $field_data = $_POST[$field_id] ?? null; // phpcs:ignore
            if (empty($field_data)) {
                continue;
            }
            $meta_array = json_decode(base64_decode($field_data), true);
            if (!empty($meta_array)) {
                $processed_fields[] = [
                    'id' => $meta_array['id'],
                    'label' => $meta_array['label'],
                    'type' => $meta_array['type'],
                    'value' => '',
                ];
            }
        }

        return $processed_fields;
    }

    private function determine_sender_email($processed_fields_values, $confirmation_email_field_id): string
    {
        $contact_emails = [
            'high' => [],
            'medium' => [],
            'low' => []
        ];
        // Collect email addresses based on priority
        foreach ($processed_fields_values as $field_data) {
            $id = $field_data['id'];
            $value = (empty($field_data['value']) && is_array($field_data['value'])) ? implode(', ', $field_data['value']) : $field_data['value'];
            $type = $field_data['type'];
            $is_required = $field_data['isRequired'];
            if (is_email($value)) {
                $priority = 'low';
                if ($confirmation_email_field_id === strtolower($id)) {
                    $priority = 'high';
                } elseif ($type === 'email' && $is_required) {
                    $priority = 'medium';
                }
                $contact_emails[$priority][] = $value;
            }
        }
        // Check if user is logged in and has a preferred email field
        if (preg_match("/\bdcfh_site_userinfo_email\b/", $confirmation_email_field_id) && is_user_logged_in()) {
            $user_data = wp_get_current_user();

            return $user_data->user_email ?? '';
        }
        // Return the highest priority email available
        foreach (['high', 'medium', 'low'] as $priority) {
            if (!empty($contact_emails[$priority])) {
                return $contact_emails[$priority][0];
            }
        }

        return '';
    }

    private function get_referer_url(): string
    {
        return isset($_POST['et_pb_contact_field_referer_url']) ? sanitize_text_field($_POST['et_pb_contact_field_referer_url']) : ''; // phpcs:ignore WordPress.Security.NonceVerification
    }

    private function get_sanitized_query_params(): array
    {
        $queryParams = [];
        $queryString = sanitize_text_field(wp_unslash($_SERVER['QUERY_STRING'] ?? ''));
        if (empty($queryString)) {
            return $queryParams;
        }
        $pairs = explode('&', $queryString);
        foreach ($pairs as $pair) {
            [$key, $value] = array_map('urldecode', explode('=', $pair, 2));
            $sanitized_key = ks_pac_dcfh_app()->misc_utils()::sanitize_key($key);
            $label = ks_pac_dcfh_app()->misc_utils()::sanitize_string($sanitized_key);
            $queryParams[$sanitized_key] = [
                'id' => $sanitized_key,
                'label' => $label,
                'value' => stripslashes($value),
                'type' => 'query',
            ];
        }

        return $queryParams;
    }

    private function log_entries($contact_form_rep): void
    {
        $log_id = uniqid('dcfh_', true);
        $log_data = [
            'log_id' => $log_id,
            'is_wp_mail_sent' => 'Pending',
            'contact_form_id' => $contact_form_rep->contact_form_id,
        ];
        // Capture relevant POST data
        foreach ($_POST as $key => $value) { // phpcs:ignore WordPress.Security.NonceVerification
            if (strpos($key, 'et_pb_contact_') === 0 ||
                preg_match('/^_wpnonce-et-pb-contact-form-submitted-\d+$/', $key) ||
                $key === '_wp_http_referer') {
                $log_data[$key] = $value;
            }
        }
        // Flag to detect mail failure
        $mail_failed = false;
        add_action('wp_mail_failed', function ($wp_error) use (&$log_data, &$mail_failed) {
            if (is_wp_error($wp_error)) {
                $mail_failed = true;
                $log_data['is_wp_mail_sent'] = 'No';
                $log_data['wp_mail_failed_reason'] = $wp_error->get_error_message();
            }
        });
        add_action('shutdown', function () use (&$log_data, &$mail_failed) {
            if (!$mail_failed) {
                $log_data['is_wp_mail_sent'] = 'Yes';
            }
            ks_pac_dcfh_log($log_data, false, 'divi_contact_form');
        });
    }
}


??

??