Forum Replies Created

Viewing 1 replies (of 1 total)
  • You can use this code. please update your form name.

    class MuktoEmailRestrictionHandler {
    private $wpdb;
    private $table_prefix;
    private $target_form_names;
    private $submissions_table;
    private $values_table;


    public function __construct($target_form_names) {
    global $wpdb;
    $this->wpdb = $wpdb;
    $this->table_prefix = $wpdb->prefix;
    $this->target_form_names = $target_form_names;
    $this->submissions_table = $this->table_prefix . 'e_submissions';
    $this->values_table = $this->table_prefix . 'e_submissions_values';

    // Register the validate_email method as a callback for the elementor_pro/forms/validation/email action hook.
    add_action('elementor_pro/forms/validation/email', array($this, 'validate_email'), 10, 3);
    }

    /**
    * Validate the email address being submitted.
    *
    * @param array $field The email field data.
    * @param \ElementorPro\Modules\Forms\Records\Record $record The form record object.
    * @param \ElementorPro\Modules\Forms\Submissions\Ajax_Handler $ajax_handler The AJAX handler object.
    */
    public function validate_email($field, $record, $ajax_handler) {
    $form_name = $record->get_form_settings('form_name');

    // Check if the current form is one of the target forms.
    if (!in_array($form_name, $this->target_form_names)) {
    return;
    }

    $invalid_emails = $this->get_submitted_emails($record->get_form_settings('id'), $form_name);

    // Check if the email address being submitted is already present in the list of invalid emails.
    if (in_array($field['value'], $invalid_emails)) {
    $ajax_handler->add_error($field['id'], "You have already submitted with this email!");
    }
    }

    /**
    * Retrieve the email addresses that have already been submitted for a specific form.
    *
    * @param int $form_id The form ID.
    * @param string $form_name The name of the form.
    * @return array An array of email addresses that have already been submitted for the given form.
    */
    private function get_submitted_emails($form_id, $form_name) {
    $form_submissions = $this->wpdb->get_results(
    $this->wpdb->prepare(
    "SELECT id FROM {$this->submissions_table} WHERE form_name = %s",
    $form_name
    )
    );
    $form_submission_ids = array_column($form_submissions, 'id');

    if (empty($form_submission_ids)) {
    return array();
    }

    $placeholders = rtrim(str_repeat('%d,', count($form_submission_ids)), ',');
    $results = $this->wpdb->get_results(
    $this->wpdb->prepare(
    "SELECT s.value AS email
    FROM {$this->values_table} AS s
    INNER JOIN (
    SELECT submission_id, MAX(id) AS max_id
    FROM {$this->values_table}
    WHERE
    key = 'email'
    GROUP BY submission_id
    ) AS e ON s.submission_id = e.submission_id AND s.id = e.max_id
    WHERE s.submission_id IN ($placeholders)",
    $form_submission_ids
    )
    );

    return array_column($results, 'email');
    }
    }

    // Create an instance of the MuktoEmailRestrictionHandler class and pass the array of target form names as an argument.
    $email_restriction_handler = new MuktoEmailRestrictionHandler(array('update this form name'));
Viewing 1 replies (of 1 total)