# double-opt-in/2.12/compatibility/avada/AvadaFrontend.class.php

Double Opt-In for Contact Form 7 – Secure, GDPR-Compliant Email Verification, version 2.12. 273 lines.

- Page: https://pluginprobe.com/plugins/double-opt-in/2.12/code/compatibility/avada/AvadaFrontend.class.php
- Raw: https://pluginprobe.com/plugins/double-opt-in/2.12/raw/compatibility/avada/AvadaFrontend.class.php
- Modified: 2022-12-16T11:04:54+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/double-opt-in/2.12/code/compatibility/avada/AvadaFrontend.class.php#L10-L20`.

```php
<?php

namespace forge12\contactform7\CF7DoubleOptIn {
    if (!defined('ABSPATH')) {
        exit;
    }

    /**
     * Class Frontend
     * Responsible to handle the frontend of the Double OptIn
     *
     * @package forge12\contactform7\CF7DoubleOptIn
     */
    class AvadaFrontend
    {
        /**
         * Admin constructor.
         */
        public function __construct()
        {
            add_action('init', array($this, 'validateOptIn'));

            if(!isset($_GET['optin'])) {
                add_filter('fusion_form_send_mail_args', array($this, 'onSubmit'), 10, 3);
            }
        }

        /**
         * Store the optin value for the given object by the hash value
         *
         * @param $hash
         * @param $value
         *
         * @return int The number of rows changed.
         */
        private function updateOptInByHash($hash, $value)
        {
            $OptIn = OptIn::get_by_hash($hash);
            if ($OptIn->is_confirmed()) {
                do_action('f12_cf7_doubleoptin_already_confirmed', $hash, $OptIn);
                return 0;
            }

            do_action('f12_cf7_doubleoptin_before_confirm', $hash, $OptIn);

            $OptIn->set_doubleoptin($value);
            $OptIn->set_updatetime(time());
            $OptIn->set_ipaddr_confirmation(CF7DoubleOptIn::getInstance()->getIPAdress());

            $result = $OptIn->save();
            if ($result) {
                do_action('f12_cf7_doubleoptin_after_confirm', $hash, $OptIn);
            }

            return $result;
        }

        /**
         * Add Stylesheets
         */
        public function validateOptIn()
        {

            if (!isset($_GET['optin'])) {
                return;
            }

            $hash = sanitize_text_field($_GET['optin']);

            $OptIn = OptIn::get_by_hash($hash);

            if (null != $OptIn) {
                if ($OptIn->isType('avada')) {
                    if($this->updateOptInByHash($hash, 1) > 0) {
                        // Setup the contact form 7 which will fire the form send after loading the page)
                        $formData = maybe_unserialize($OptIn->get_content());

                        if (!isset($formData['fields']) || !isset($formData['sendmail_args'])) {
                            return;
                        }

                        $formData = CF7DoubleOptIn::getInstance()->sanitize_array($formData);

                        $_POST = array('formData' => implode('&', $formData['fields']));
                        $_POST['field_labels'] = '';
                        $_POST['form_id'] = $OptIn->get_cf_form_id();
                        $_POST['hidden_field_names'] = '';

                        require_once('AvadaFormSubmit.class.php');
                        $AvadaFormSubmit = new AvadaFormSubmit();
                        $AvadaFormSubmit->submit($OptIn->get_cf_form_id(), $formData['sendmail_args']);
                    }
                }
            }
        }

        /**
         * Add the double opt in link to the body
         *
         * @param string $body
         * @param OptIn $OptIn
         * @param int $page - The Page ID
         *
         * @return string
         */
        private function addDoubleOptInLink($body, $OptIn)
        {
            $link = $OptIn->get_link_optin();

            return str_replace('[doubleoptinlink]', $link, $body);
        }

        /**
         * Add additional placeholder like time, date, subject
         * @param $form \WPCF7_ContactForm
         * @param $submission \WPCF7_Submission
         * @param $body
         * @param $OptIn
         * @param $parameter
         */
        private function addAdditionalPlaceholder($form_data, $body, $OptIn, $parameter)
        {
            # set the default timezone
            date_default_timezone_set(get_option('timezone_string'));
            $placeholder = array(
                'doubleoptin_form_url' => $form_data['submission']['source_url]'],
                'doubleoptin_form_subject' => $parameter['subject'],
                'doubleoptin_form_date' => date(get_option('date_format')),
                'doubleoptin_form_time' => date(get_option('time_format')),
                'doubleoptin_form_email' => get_option('admin_email')
            );

            foreach ($placeholder as $key => $value) {
                $body = str_replace('[' . $key . ']', $value, $body);
            }
            return $body;
        }

        /**
         * Add formular informaition to the database
         *
         * @param \WPCF7_ContactForm
         * @param array
         *
         * @return OptIn|null
         */
        private function addRequest($post_id, $parameter, $sendmail_args, $files = array())
        {
            global $wpdb;

            if (null == $wpdb) {
                return 0;
            }

            $copiedFiles = array();

            if (!empty($files)) {
                foreach ($files as $key => $subfiles) {
                    foreach ($subfiles as $file) {
                        $newFile = explode('/', $file);
                        $name = $newFile[count($newFile) - 1];
                        $name = time() . '_' . $name;
                        $newFile[count($newFile) - 1] = $name;
                        $newFile = implode("/", $newFile);

                        if (copy($file, $newFile)) {
                            $copiedFiles[] = $newFile;
                        }
                    }
                }
            }

            $parameter = \apply_filters('f12_cf7_doubleoptin_add_request_parameter', $parameter);

            $formParameter = CF7DoubleOptIn::getInstance()->getParameter($post_id);

            $form = get_post($post_id);

            $data = array(
                'cf_form_id' => $post_id,
                'doubleoptin' => 0,
                'createtime' => time(),
                'content' => maybe_serialize(array('fields' => $parameter, 'sendmail_args' => $sendmail_args)),
                'files' => maybe_serialize($copiedFiles),
                'ipaddr_register' => CF7DoubleOptIn::getInstance()->getIPAdress(),
                'category' => (int)$formParameter['category'],
                'form' => do_shortcode($form->post_content),
                'email' => $parameter[$formParameter['recipient']],
            );

            $OptIn = new OptIn($data);
            if ($OptIn->save()) {
                return $OptIn;
            }
            return null;
        }

        /**
         * Validate if the optin is enabled.
         */
        private function isOptinEnabled($post_id)
        {
            // Disable optin sending if the optin flag is set.
            if (isset($_GET['optin'])) {
                return false;
            }

            $parameter = CF7DoubleOptIn::getInstance()->getParameter($post_id);

            if ((int)$parameter['enable'] != 1) {
                return false;
            }

            return true;
        }

        private function get_results_from_message($type, $info){
            return [
                'status' => $type,
                'info'   => $info,
            ];
        }

        /**
         * On Form Submit add the double optin if enabled
         * @param array $parameter
         * @param int $post_id
         * @param array $data
         */
        public function onSubmit($form_parameter, $submission_id, $form_data)
        {
            $post_id = isset($_POST['form_id']) ? absint(sanitize_text_field(wp_unslash($_POST['form_id']))) : 0; // phpcs:ignore WordPress.Security.NonceVerification
            if (!$post_id) {
                return;
            }
            $parameter = CF7DoubleOptIn::getInstance()->getParameter($post_id);

            if ($this->isOptinEnabled($post_id)) {

                // Remove Contact Form 7 DB hook to ensure the optin mail is not saved
                $OptIn = $this->addRequest($post_id, $form_data['data'], $form_parameter, $form_parameter['attachments']);
                $body = $this->addDoubleOptInLink($parameter['body'], $OptIn);
                $body = $this->addAdditionalPlaceholder($form_data, $body, $OptIn, $parameter);

                // Update the opt in after setting the opt-in content.
                $OptIn->set_mail_optin($body);
                $OptIn->save();

                // Prepare the Opt-In Mail
                $headers = 'MIME-Version: 1.0' . "\r\n";
                $headers .= 'Content-type: text/html; charset=UTF8' . "\r\n";
                $headers .= 'From: ' . $parameter['sender'] . "\r\n";

//                $recipient = $parameter[$formParameter['recipient']];

                \wp_mail(
                    $form_data['data'][$parameter['recipient']],
                    $parameter['subject'],
                    $body,
                    $headers
                );

                do_action('f12_cf7_doubleoptin_sent', $form_data, $post_id);

                die( wp_json_encode( $this->get_results_from_message( 'success', 'opt-in send' ) ) );

                //$abort = true;
            } else if (isset($_GET['optin'])) {
                $OptIn = OptIn::get_by_hash(esc_sql($_GET['optin']));
            }
        }
    }
}
```
