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
<?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');
});
}
}