name = esc_html__( 'Contact Form', 'et_builder' ); $this->plural = esc_html__( 'Contact Forms', 'et_builder' ); $this->slug = 'et_pb_contact_form'; $this->vb_support = 'on'; $this->child_slug = 'et_pb_contact_field'; $this->child_item_text = esc_html__( 'Field', 'et_builder' ); $this->_use_unique_id = true; $this->main_css_element = '%%order_class%%.et_pb_contact_form_container'; $this->settings_modal_toggles = array( 'general' => array( 'toggles' => array( 'main_content' => et_builder_i18n( 'Text' ), 'email' => esc_html__( 'Email', 'et_builder' ), 'elements' => et_builder_i18n( 'Elements' ), 'redirect' => esc_html__( 'Redirect', 'et_builder' ), 'spam' => esc_html__( 'Spam Protection', 'et_builder' ), ), ), ); $this->advanced_fields = array( 'borders' => array( 'default' => array( 'css' => array( 'main' => array( 'border_radii' => sprintf( '%1$s .input, %1$s .input[type="checkbox"] + label i, %1$s .input[type="radio"] + label i', $this->main_css_element ), 'border_styles' => sprintf( '%1$s .input, %1$s .input[type="checkbox"] + label i, %1$s .input[type="radio"] + label i', $this->main_css_element ), ), 'important' => 'plugin_only', ), 'label_prefix' => esc_html__( 'Inputs', 'et_builder' ), ), ), 'fonts' => array( 'title' => array( 'label' => et_builder_i18n( 'Title' ), 'css' => array( 'main' => "{$this->main_css_element} h1, {$this->main_css_element} h2.et_pb_contact_main_title, {$this->main_css_element} h3.et_pb_contact_main_title, {$this->main_css_element} h4.et_pb_contact_main_title, {$this->main_css_element} h5.et_pb_contact_main_title, {$this->main_css_element} h6.et_pb_contact_main_title", ), 'header_level' => array( 'default' => 'h1', ), ), 'captcha' => array( 'label' => esc_html__( 'Captcha', 'et_builder' ), 'css' => array( 'main' => "{$this->main_css_element} .et_pb_contact_right p", ), 'hide_text_align' => true, 'line_height' => array( 'default' => '1.7em', ), ), ), 'box_shadow' => array( 'default' => array( 'css' => array( 'main' => implode( ', ', array( '%%order_class%% .et_pb_contact_field input', '%%order_class%% .et_pb_contact_field select', '%%order_class%% .et_pb_contact_field textarea', '%%order_class%% .et_pb_contact_field .et_pb_contact_field_options_list label > i', '%%order_class%% input.et_pb_contact_captcha', ) ), ), ), ), 'button' => array( 'button' => array( 'label' => et_builder_i18n( 'Button' ), 'css' => array( 'main' => "{$this->main_css_element}.et_pb_module .et_pb_button", 'limited_main' => "{$this->main_css_element}.et_pb_module .et_pb_button", 'important' => 'plugin_only', ), 'no_rel_attr' => true, 'box_shadow' => array( 'css' => array( 'main' => '%%order_class%% .et_pb_contact_submit', ), ), 'margin_padding' => array( 'css' => array( 'important' => 'all', ), ), ), ), 'margin_padding' => array( 'css' => array( 'important' => array( 'custom_margin' ), // needed to overwrite last module margin-bottom styling ), ), 'max_width' => array( 'css' => array( 'module_alignment' => '%%order_class%%.et_pb_contact_form_container.et_pb_module', ), ), 'text' => array( 'css' => array( 'text_orientation' => '%%order_class%% input, %%order_class%% textarea, %%order_class%% label', 'text_shadow' => '%%order_class%%, %%order_class%% input, %%order_class%% textarea, %%order_class%% label, %%order_class%% select', ), ), 'form_field' => array( 'form_field' => array( 'label' => esc_html__( 'Fields', 'et_builder' ), 'css' => array( 'main' => '%%order_class%% .input', 'background_color' => '%%order_class%% .input, %%order_class%% .input[type="checkbox"] + label i, %%order_class%% .input[type="radio"] + label i', 'background_color_hover' => '%%order_class%% .input:hover, %%order_class%% .input[type="checkbox"]:hover + label i, %%order_class%% .input[type="radio"]:hover + label i', 'focus_background_color' => '%%order_class%% .input:focus, %%order_class%% .input[type="checkbox"]:active + label i, %%order_class%% .input[type="radio"]:active + label i', 'focus_background_color_hover' => '%%order_class%% .input:focus:hover, %%order_class%% .input[type="checkbox"]:active:hover + label i, %%order_class%% .input[type="radio"]:active:hover + label i', 'placeholder_focus' => '%%order_class%% p .input:focus::-webkit-input-placeholder, %%order_class%% p .input:focus::-moz-placeholder, %%order_class%% p .input:focus:-ms-input-placeholder, %%order_class%% p textarea:focus::-webkit-input-placeholder, %%order_class%% p textarea:focus::-moz-placeholder, %%order_class%% p textarea:focus:-ms-input-placeholder', 'padding' => '%%order_class%% .et_pb_contact_field .input', 'margin' => '%%order_class%% .et_pb_contact_field', 'form_text_color' => '%%order_class%% .input, %%order_class%% .input[type="checkbox"] + label, %%order_class%% .input[type="radio"] + label, %%order_class%% .input[type="checkbox"]:checked + label i:before', 'form_text_color_hover' => '%%order_class%% .input:hover, %%order_class%% .input[type="checkbox"]:hover + label, %%order_class%% .input[type="radio"]:hover + label, %%order_class%% .input[type="checkbox"]:checked:hover + label i:before', 'focus_text_color' => '%%order_class%% .input:focus, %%order_class%% .input[type="checkbox"]:active + label, %%order_class%% .input[type="radio"]:active + label, %%order_class%% .input[type="checkbox"]:checked:active + label i:before', 'focus_text_color_hover' => '%%order_class%% .input:focus:hover, %%order_class%% .input[type="checkbox"]:active:hover + label, %%order_class%% .input[type="radio"]:active:hover + label, %%order_class%% .input[type="checkbox"]:checked:active:hover + label i:before', ), 'box_shadow' => false, 'border_styles' => false, 'font_field' => array( 'css' => array( 'main' => implode( ', ', array( "{$this->main_css_element} .input", "{$this->main_css_element} .input::placeholder", "{$this->main_css_element} .input::-webkit-input-placeholder", "{$this->main_css_element} .input::-moz-placeholder", "{$this->main_css_element} .input:-ms-input-placeholder", "{$this->main_css_element} .input[type=checkbox] + label", "{$this->main_css_element} .input[type=radio] + label", ) ), 'hover' => array( "{$this->main_css_element} .input:hover", "{$this->main_css_element} .input:hover::placeholder", "{$this->main_css_element} .input:hover::-webkit-input-placeholder", "{$this->main_css_element} .input:hover::-moz-placeholder", "{$this->main_css_element} .input:hover:-ms-input-placeholder", "{$this->main_css_element} .input[type=checkbox]:hover + label", "{$this->main_css_element} .input[type=radio]:hover + label", ), ), ), 'margin_padding' => array( 'css' => array( 'main' => '%%order_class%% .input', 'padding' => '%%order_class%% .et_pb_contact_field .input', 'margin' => '%%order_class%% .et_pb_contact_field', ), ), ), ), ); $this->custom_css_fields = array( 'contact_title' => array( 'label' => esc_html__( 'Contact Title', 'et_builder' ), 'selector' => '.et_pb_contact_main_title', ), 'contact_button' => array( 'label' => esc_html__( 'Contact Button', 'et_builder' ), 'selector' => '.et_pb_contact_form_container .et_contact_bottom_container .et_pb_contact_submit.et_pb_button', 'no_space_before_selector' => true, ), 'contact_fields' => array( 'label' => esc_html__( 'Form Fields', 'et_builder' ), 'selector' => 'input', ), 'text_field' => array( 'label' => esc_html__( 'Message Field', 'et_builder' ), 'selector' => 'textarea.et_pb_contact_message', ), 'captcha_field' => array( 'label' => esc_html__( 'Captcha Field', 'et_builder' ), 'selector' => 'input.et_pb_contact_captcha', ), 'captcha_label' => array( 'label' => esc_html__( 'Captcha Text', 'et_builder' ), 'selector' => '.et_pb_contact_right p', ), ); $this->help_videos = array( array( 'id' => 'y3NSTE6BSfo', 'name' => esc_html__( 'An introduction to the Contact Form module', 'et_builder' ), ), ); } /** * Get form map containing essential info (form number, field id/type/required) based on * et_pb_contact_field's shortcode layout * * @since 3.26.5 * * @param string $content_shortcode * @param int $contact_form_number * @param array $hidden_form_fields * * @return mixed[] { * Form Map * * @type int $form_number Contact form number. * @type string[] $fields { * Form Field * * @type string $field_type Field type * @type string $field_id Field id * @type string $required_mark Required field status. Accepts 'on', 'off'. * } * } */ function get_form_map( $content_shortcode = '', $contact_form_number = 0, $hidden_form_fields = array() ) { $pattern = get_shortcode_regex( array( 'et_pb_contact_field' ) ); $map = array( 'form_number' => (int) $contact_form_number, 'fields' => array(), ); preg_match_all( "/$pattern/", $content_shortcode, $contact_fields, PREG_SET_ORDER ); foreach ( $contact_fields as $contact_field ) { $contact_field_attrs = shortcode_parse_atts( $contact_field[3] ); $field_id = strtolower( self::$_->array_get( $contact_field_attrs, 'field_id' ) ); $conditional_logic = self::$_->array_get( $contact_field_attrs, 'conditional_logic', 'off' ); // Only allow to disable fields for which conditional logic has been enabled if ( 'on' === $conditional_logic && in_array( $field_id, $hidden_form_fields ) ) { continue; } $map['fields'][] = array( 'field_type' => self::$_->array_get( $contact_field_attrs, 'field_type', 'input' ), 'field_id' => $field_id, 'required_mark' => self::$_->array_get( $contact_field_attrs, 'required_mark', 'on' ), ); } return $map; } function get_fields() { return array_merge( self::_get_spam_provider_fields(), array( 'captcha' => array( 'label' => esc_html__( 'Use Basic Captcha', 'et_builder' ), 'type' => 'yes_no_button', 'option_category' => 'configuration', 'options' => array( 'on' => et_builder_i18n( 'Yes' ), 'off' => et_builder_i18n( 'No' ), ), 'toggle_slug' => 'spam', 'description' => esc_html__( 'Turn the captcha on or off using this option.', 'et_builder' ), 'default_on_front' => 'on', 'show_if' => array( 'use_spam_service' => 'off', ), ), 'email' => array( 'label' => esc_html__( 'Email Address', 'et_builder' ), 'type' => 'text', 'option_category' => 'basic_option', 'description' => et_get_safe_localization( sprintf( __( 'Input the email address where messages should be sent.

Note: email delivery and spam prevention are complex processes. We recommend using a delivery service such as Mandrill, SendGrid, or other similar service to ensure the deliverability of messages that are submitted through this form', 'et_builder' ), 'http://mandrill.com/', 'https://sendgrid.com/' ) ), 'toggle_slug' => 'email', ), 'title' => array( 'label' => et_builder_i18n( 'Title' ), 'type' => 'text', 'option_category' => 'basic_option', 'description' => esc_html__( 'Define a title for your contact form.', 'et_builder' ), 'toggle_slug' => 'main_content', 'dynamic_content' => 'text', 'mobile_options' => true, 'hover' => 'tabs', ), 'custom_message' => array( 'label' => esc_html__( 'Message Pattern', 'et_builder' ), 'type' => 'textarea', 'option_category' => 'configuration', 'description' => et_get_safe_localization( __( 'Here you can define the custom pattern for the email Message. Fields should be included in following format - %%field_id%%. For example if you want to include the field with id = phone and field with id = message, then you can use the following pattern: My message is %%message%% and phone number is %%phone%%. Leave blank for default.', 'et_builder' ) ), 'toggle_slug' => 'email', ), 'use_redirect' => array( 'label' => esc_html__( 'Enable Redirect URL', 'et_builder' ), 'type' => 'yes_no_button', 'option_category' => 'configuration', 'options' => array( 'off' => et_builder_i18n( 'No' ), 'on' => et_builder_i18n( 'Yes' ), ), 'affects' => array( 'redirect_url', ), 'toggle_slug' => 'redirect', 'description' => esc_html__( 'Redirect users after successful form submission.', 'et_builder' ), 'default_on_front' => 'off', ), 'redirect_url' => array( 'label' => esc_html__( 'Redirect URL', 'et_builder' ), 'type' => 'text', 'option_category' => 'configuration', 'depends_show_if' => 'on', 'toggle_slug' => 'redirect', 'description' => esc_html__( 'Type the Redirect URL', 'et_builder' ), ), 'success_message' => array( 'label' => esc_html__( 'Success Message', 'et_builder' ), 'type' => 'text', 'option_category' => 'configuration', 'description' => esc_html__( 'Type the message you want to display after successful form submission. Leave blank for default', 'et_builder' ), 'toggle_slug' => 'main_content', 'dynamic_content' => 'text', ), 'submit_button_text' => array( 'label' => esc_html__( 'Submit Button', 'et_builder' ), 'type' => 'text', 'option_category' => 'basic_option', 'description' => esc_html__( 'Define the text of the form submit button.', 'et_builder' ), 'toggle_slug' => 'main_content', 'dynamic_content' => 'text', 'mobile_options' => true, 'hover' => 'tabs', ), ) ); } public function get_transition_fields_css_props() { $fields = parent::get_transition_fields_css_props(); $fields['form_field_background_color'] = array( 'background-color' => implode( ', ', array( '%%order_class%% .input', '%%order_class%% .input[type="checkbox"]+label i', '%%order_class%% .input[type="radio"]+label i', ) ), ); return $fields; } function predefined_child_modules() { $output = sprintf( '[et_pb_contact_field field_title="%1$s" field_type="input" field_id="Name" required_mark="on" fullwidth_field="off" /][et_pb_contact_field field_title="%2$s" field_type="email" field_id="Email" required_mark="on" fullwidth_field="off" /][et_pb_contact_field field_title="%3$s" field_type="text" field_id="Message" required_mark="on" fullwidth_field="on" /]', esc_attr__( 'Name', 'et_builder' ), esc_attr__( 'Email Address', 'et_builder' ), esc_attr__( 'Message', 'et_builder' ) ); return $output; } /** * Renders the module output. * * @param array $attrs List of attributes. * @param string $content Content being processed. * @param string $render_slug Slug of module that is used for rendering output. * * @return string */ public function render( $attrs, $content, $render_slug ) { parent::render( $attrs, $content, $render_slug ); global $et_pb_half_width_counter, $et_pb_contact_form_num; $et_pb_half_width_counter = 0; $multi_view = et_pb_multi_view_options( $this ); $multi_view->set_default_value( 'submit_button_text', __( 'Submit', 'et_builder' ) ); $captcha = $this->props['captcha']; $email = $this->props['email']; $title = $multi_view->render_element( array( 'tag' => et_pb_process_header_level( $this->props['title_level'], 'h1' ), 'content' => '{{title}}', 'attrs' => array( 'class' => 'et_pb_contact_main_title', ), ) ); $form_field_text_color = $this->props['form_field_text_color']; $button_custom = $this->props['custom_button']; $custom_message = $this->props['custom_message']; $use_redirect = $this->props['use_redirect']; $redirect_url = $this->props['redirect_url']; $success_message = $this->_esc_attr( 'success_message' ); $header_level = $this->props['title_level']; $use_spam_service = $this->prop( 'use_spam_service', 'off' ); $field_text_color_hover = $this->get_hover_value( 'form_field_text_color' ); $field_text_color_values = et_pb_responsive_options()->get_property_values( $this->props, 'form_field_text_color' ); $field_focus_text_color_hover = $this->get_hover_value( 'form_field_focus_text_color' ); $field_focus_text_color_values = et_pb_responsive_options()->get_property_values( $this->props, 'form_field_focus_text_color' ); $custom_icon_values = et_pb_responsive_options()->get_property_values( $this->props, 'button_icon' ); $custom_icon = isset( $custom_icon_values['desktop'] ) ? $custom_icon_values['desktop'] : ''; $custom_icon_tablet = isset( $custom_icon_values['tablet'] ) ? $custom_icon_values['tablet'] : ''; $custom_icon_phone = isset( $custom_icon_values['phone'] ) ? $custom_icon_values['phone'] : ''; $video_background = $this->video_background(); $parallax_image_background = $this->get_parallax_image_background(); // Form Field Text Color - Radio Checked. $field_text_color_important = et_builder_has_limitation( 'force_use_global_important' ) ? ' !important' : ''; et_pb_responsive_options()->generate_responsive_css( $field_text_color_values, '%%order_class%% .input[type="radio"]:checked + label i:before', 'background-color', $render_slug, $field_text_color_important, 'color' ); if ( et_builder_is_hover_enabled( 'form_field_text_color', $this->props ) ) { ET_Builder_Element::set_style( $render_slug, array( 'selector' => '%%order_class%% .input[type="radio"]:checked:hover + label i:before', 'declaration' => sprintf( 'background-color: %1$s%2$s;', esc_html( $field_text_color_hover ), $field_text_color_important ), ) ); } // Form Field Text Color on Focus - Radio Checked. et_pb_responsive_options()->generate_responsive_css( $field_focus_text_color_values, '%%order_class%% .input[type="radio"]:checked:active + label i:before', 'background-color', $render_slug, $field_text_color_important, 'color' ); if ( et_builder_is_hover_enabled( 'form_field_focus_text_color', $this->props ) ) { ET_Builder_Element::set_style( $render_slug, array( 'selector' => '%%order_class%% .input[type="radio"]:checked:active:hover + label i:before', 'declaration' => sprintf( 'background-color: %1$s%2$s;', esc_html( $field_focus_text_color_hover ), $field_text_color_important ), ) ); } $success_message = '' !== $success_message ? $success_message : esc_html__( 'Thanks for contacting us', 'et_builder' ); $et_pb_contact_form_num = $this->render_count(); $hidden_form_fields_key = "et_pb_contact_email_hidden_fields_{$et_pb_contact_form_num}"; $hidden_form_fields = self::$_->array_get( $_POST, $hidden_form_fields_key, array() ); $shortcode_content = $content; if ( ! empty( $hidden_form_fields ) ) { $hidden_form_fields = str_replace( '\\', '', $hidden_form_fields ); $hidden_form_fields = json_decode( $hidden_form_fields ); } $content = $this->content; $et_error_message = ''; $et_contact_error = false; $current_form_fields = isset( $_POST[ 'et_pb_contact_email_fields_' . $et_pb_contact_form_num ] ) ? $_POST[ 'et_pb_contact_email_fields_' . $et_pb_contact_form_num ] : ''; $contact_email = ''; $processed_fields_values = array(); $nonce_result = isset( $_POST[ '_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num ] ) && wp_verify_nonce( $_POST[ '_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num ], 'et-pb-contact-form-submit' ) ? true : false; // check that the form was submitted and et_pb_contact_et_number field is empty to protect from spam if ( $nonce_result && isset( $_POST[ 'et_pb_contactform_submit_' . $et_pb_contact_form_num ] ) && empty( $_POST[ 'et_pb_contact_et_number_' . $et_pb_contact_form_num ] ) ) { if ( '' !== $current_form_fields ) { $fields_data_json = str_replace( '\\', '', $current_form_fields ); $fields_data_array = json_decode( $fields_data_json, true ); $fields_data_array = null === $fields_data_array ? [] : $fields_data_array; // check whether captcha field is not empty. if ( 'on' === $captcha && 'off' === $use_spam_service && ( ! isset( $_POST[ 'et_pb_contact_captcha_' . $et_pb_contact_form_num ] ) || empty( $_POST[ 'et_pb_contact_captcha_' . $et_pb_contact_form_num ] ) ) ) { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'Make sure you entered the captcha.', 'et_builder' ) ); $et_contact_error = true; } elseif ( 'on' === $use_spam_service && $this->is_spam_submission() ) { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'You must be a human to submit this form.', 'et_builder' ) ); $et_contact_error = true; } // check all fields on current form and generate error message if needed // Generate form map of submitted form. $submitted_form_map = array( 'form_number' => $et_pb_contact_form_num, 'fields' => array(), ); foreach ( $fields_data_array as $index => $value ) { if ( ! isset( $value['field_id'], $value['field_label'], $value['field_type'], $value['original_id'], $value['required_mark'] ) ) { continue; } if ( 'et_pb_contact_et_number_' . $et_pb_contact_form_num === $value['field_id'] ) { continue; } // Populate form map's fields. $submitted_form_map['fields'][] = array( 'field_type' => self::$_->array_get( $value, 'field_type', 'input' ), 'field_id' => self::$_->array_get( $value, 'original_id' ), 'required_mark' => 'required' === self::$_->array_get( $value, 'required_mark', 'required' ) ? 'on' : 'off', ); // Check all the required fields, generate error message if required field is empty. // Use `sanitize_textarea_field` for message field content to preserve newlines. $sanitize_callback = isset( $value['original_id'] ) && 'text' === $value['field_type'] ? 'sanitize_textarea_field' : 'sanitize_text_field'; // phpcs:ignore ET.Sniffs.ValidatedSanitizedInput.InputNotSanitized -- The $sanitize_callback will sanitize the field value. $field_value = isset( $_POST[ $value['field_id'] ] ) ? trim( call_user_func( $sanitize_callback, $_POST[ $value['field_id'] ] ) ) : ''; if ( 'required' === $value['required_mark'] && empty( $field_value ) && ! is_numeric( $field_value ) ) { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'Make sure you fill in all required fields.', 'et_builder' ) ); $et_contact_error = true; continue; } // additional check for email field. if ( 'email' === $value['field_type'] && ! empty( $field_value ) ) { $contact_email = isset( $_POST[ $value['field_id'] ] ) ? sanitize_email( $_POST[ $value['field_id'] ] ) : ''; if ( 'required' === $value['required_mark'] && ( empty( $contact_email ) || ! is_email( $contact_email ) ) ) { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'Invalid Email.', 'et_builder' ) ); $et_contact_error = true; } } // prepare the array of processed field values in convenient format. if ( false === $et_contact_error ) { $processed_fields_values[ $value['original_id'] ]['value'] = $field_value; $processed_fields_values[ $value['original_id'] ]['label'] = $value['field_label']; } } // Check form's integrity by comparing fields structure (used for required fields check, etc) // stored in the shortcode against submitted value generated using JS on the front end // to prevent data being altered by modifying form markup. $form_map = $this->get_form_map( $shortcode_content, $et_pb_contact_form_num, $hidden_form_fields ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize -- doing equality check between two serialized arrays if ( serialize( $submitted_form_map ) !== serialize( $form_map ) ) { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'Invalid submission. Please refresh the page and try again.', 'et_builder' ) ); $et_contact_error = true; } } else { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'Make sure you fill in all required fields.', 'et_builder' ) ); $et_contact_error = true; } } else { if ( false === $nonce_result && isset( $_POST[ 'et_pb_contactform_submit_' . $et_pb_contact_form_num ] ) && empty( $_POST[ 'et_pb_contact_et_number_' . $et_pb_contact_form_num ] ) ) { $et_error_message .= sprintf( '

%1$s

', esc_html__( 'Please refresh the page and try again.', 'et_builder' ) ); } $et_contact_error = true; } // generate digits for captcha $et_pb_first_digit = rand( 1, 15 ); $et_pb_second_digit = rand( 1, 15 ); if ( ! $et_contact_error && $nonce_result ) { $et_email_to = '' !== $email ? $email : get_site_option( 'admin_email' ); $et_site_name = strval( get_option( 'blogname' ) ); $contact_name = isset( $processed_fields_values['name'] ) ? stripslashes( sanitize_text_field( $processed_fields_values['name']['value'] ) ) : ''; if ( '' !== $custom_message ) { // decode html entites to make sure HTML from the message pattern is rendered properly $message_pattern = et_builder_convert_line_breaks( html_entity_decode( $custom_message ), "\r\n" ); // insert the data from contact form into the message pattern foreach ( $processed_fields_values as $key => $value ) { // strip all tags from each field. Don't strip tags from the entire message to allow using HTML in the pattern. $message_pattern = str_ireplace( "%%{$key}%%", wp_strip_all_tags( $value['value'] ), $message_pattern ); } if ( is_array( $hidden_form_fields ) ) { foreach ( $hidden_form_fields as $hidden_field_label ) { $message_pattern = str_ireplace( "%%{$hidden_field_label}%%", '', $message_pattern ); } } } else { // use default message pattern if custom pattern is not defined $message_pattern = isset( $processed_fields_values['message']['value'] ) ? $processed_fields_values['message']['value'] : ''; // Add all custom fields into the message body by default foreach ( $processed_fields_values as $key => $value ) { if ( ! in_array( $key, array( 'message', 'name', 'email' ) ) ) { $message_pattern .= "\r\n"; $message_pattern .= sprintf( '%1$s: %2$s', '' !== $value['label'] ? $value['label'] : $key, $value['value'] ); } } // strip all tags from the message content $message_pattern = wp_strip_all_tags( $message_pattern ); } $http_host = str_replace( 'www.', '', $_SERVER['HTTP_HOST'] ); $headers[] = "From: \"{$contact_name}\" "; // Set `Reply-To` email header based on contact_name and contact_email values if ( ! empty( $contact_email ) ) { $contact_name = ! empty( $contact_name ) ? $contact_name : $contact_email; $headers[] = "Reply-To: \"{$contact_name}\" <{$contact_email}>"; } add_filter( 'et_get_safe_localization', 'et_allow_ampersand' ); // don't strip tags at this point to properly send the HTML from pattern. All the unwanted HTML stripped at this point. $email_message = trim( stripslashes( $message_pattern ) ); wp_mail( apply_filters( 'et_contact_page_email_to', $et_email_to ), et_get_safe_localization( sprintf( __( 'New Message From %1$s%2$s', 'et_builder' ), sanitize_text_field( html_entity_decode( $et_site_name, ENT_QUOTES, 'UTF-8' ) ), ( '' !== $title ? sprintf( _x( ' - %s', 'contact form title separator', 'et_builder' ), $title ) : '' ) ) ), ! empty( $email_message ) ? $email_message : ' ', apply_filters( 'et_contact_page_headers', $headers, $contact_name, $contact_email ) ); remove_filter( 'et_get_safe_localization', 'et_allow_ampersand' ); $et_error_message = sprintf( '

%1$s

', et_core_esc_previously( $success_message ) ); } // Contact form should always have the ID. Use saved ID or generate automatically. $module_id = '' !== $this->module_id( false ) ? $this->module_id( false ) : 'et_pb_contact_form_' . $et_pb_contact_form_num; $unique_id = self::$_->array_get( $this->props, '_unique_id' ); if ( $nonce_result ) { // Additional info to be passed on the `et_pb_contact_form_submit` hook. $contact_form_info = array( 'contact_form_id' => $module_id, 'contact_form_number' => $et_pb_contact_form_num, 'contact_form_unique_id' => $unique_id, 'module_slug' => $render_slug, 'post_id' => $this->get_the_ID(), ); /** * Fires after contact form is submitted. * * Use $et_contact_error variable to check whether there is an error on the form * entry submit process or not. * * @since 4.13.1 * * @param array $processed_fields_values Processed fields values. * @param array $et_contact_error Whether there is an error on the form * entry submit process or not. * @param array $contact_form_info Additional contact form info. */ do_action( 'et_pb_contact_form_submit', $processed_fields_values, $et_contact_error, $contact_form_info ); } $form = ''; $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $et_pb_captcha = sprintf( '

%1$s =

', sprintf( '%1$s + %2$s', esc_html( $et_pb_first_digit ), esc_html( $et_pb_second_digit ) ), esc_attr( $et_pb_contact_form_num ), esc_attr( $et_pb_first_digit ), esc_attr( $et_pb_second_digit ) ); if ( '' === trim( $content ) ) { $content = do_shortcode( $this->predefined_child_modules() ); } if ( $et_contact_error ) { $multi_view_data_attr = $multi_view->render_attrs( array( 'content' => '{{submit_button_text}}', ) ); $form = sprintf( '
%7$s
%2$s
%4$s
', esc_url( $current_url ), ( 'on' === $captcha && 'off' === $use_spam_service ? $et_pb_captcha : '' ), esc_html( $multi_view->get_value( 'submit_button_text' ) ), wp_nonce_field( 'et-pb-contact-form-submit', '_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num, true, false ), '' !== $custom_icon && 'on' === $button_custom ? sprintf( ' data-icon="%1$s"', esc_attr( et_pb_process_font_icon( $custom_icon ) ) ) : '', // #5 esc_attr( $et_pb_contact_form_num ), $content, '' !== $custom_icon_tablet && 'on' === $button_custom ? sprintf( ' data-icon-tablet="%1$s"', esc_attr( et_pb_process_font_icon( $custom_icon_tablet ) ) ) : '', '' !== $custom_icon_phone && 'on' === $button_custom ? sprintf( ' data-icon-phone="%1$s"', esc_attr( et_pb_process_font_icon( $custom_icon_phone ) ) ) : '', $multi_view_data_attr // #10 ); } // Module classnames $this->add_classname( array( 'et_pb_contact_form_container', 'clearfix', $this->get_text_orientation_classname(), ) ); // Remove automatically added classname $this->remove_classname( $render_slug ); $output = sprintf( '
%9$s %8$s %11$s %12$s %1$s
%2$s
%3$s
', $title, $et_error_message, $form, esc_attr( $module_id ), $this->module_classname( $render_slug ), // #5 esc_attr( $et_pb_contact_form_num ), 'on' === $use_redirect && '' !== $redirect_url ? sprintf( ' data-redirect_url="%1$s"', esc_attr( $redirect_url ) ) : '', $video_background, $parallax_image_background, esc_attr( $unique_id ), // #10 et_core_esc_previously( $this->background_pattern() ), // #11 et_core_esc_previously( $this->background_mask() ) // #12 ); return $output; } /** * Filter multi view value. * * @since 3.27.1 * * @see ET_Builder_Module_Helper_MultiViewOptions::filter_value * * @param mixed $raw_value Props raw value. * @param array $args { * Context data. * * @type string $context Context param: content, attrs, visibility, classes. * @type string $name Module options props name. * @type string $mode Current data mode: desktop, hover, tablet, phone. * @type string $attr_key Attribute key for attrs context data. Example: src, class, etc. * @type string $attr_sub_key Attribute sub key that availabe when passing attrs value as array such as styes. Example: padding-top, margin-botton, etc. * } * @param ET_Builder_Module_Helper_MultiViewOptions $multi_view Multiview object instance. * * @return mixed */ public function multi_view_filter_value( $raw_value, $args, $multi_view ) { $name = isset( $args['name'] ) ? $args['name'] : ''; $mode = isset( $args['mode'] ) ? $args['mode'] : ''; $fields_need_escape = array( 'title', ); if ( $raw_value && in_array( $name, $fields_need_escape, true ) ) { return $this->_esc_attr( $multi_view->get_name_by_mode( $name, $mode ), 'none', $raw_value ); } elseif ( 'submit_button_text' === $name ) { if ( '' === trim( $raw_value ) ) { $raw_value = __( 'Submit', 'et_builder' ); } return esc_html( $raw_value ); } return $raw_value; } } if ( et_builder_should_load_all_module_data() ) { new ET_Builder_Module_Contact_Form(); }