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->main_css_element = '%%order_class%%.et_pb_contact_form_container';
$this->settings_modal_toggles = array(
'general' => array(
'toggles' => array(
'main_content' => esc_html__( 'Text', 'et_builder' ),
'email' => esc_html__( 'Email', 'et_builder' ),
'elements' => esc_html__( 'Elements', 'et_builder' ),
'redirect' => esc_html__( 'Redirect', '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' => esc_html__( 'Title', 'et_builder' ),
'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',
),
),
'form_field' => array(
'label' => esc_html__( 'Form Field', 'et_builder' ),
'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",
) ),
'important' => 'plugin_only',
),
),
),
'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' => esc_html__( 'Button', 'et_builder' ),
'css' => array(
'main' => "{$this->main_css_element}.et_pb_module .et_pb_button",
'plugin_main' => "{$this->main_css_element}.et_pb_module .et_pb_button",
),
'no_rel_attr' => true,
'box_shadow' => array(
'css' => array(
'main' => '%%order_class%% .et_pb_contact_submit',
),
),
),
),
'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',
),
),
);
$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' => esc_html( 'y3NSTE6BSfo' ),
'name' => esc_html__( 'An introduction to the Contact Form module', 'et_builder' ),
),
);
}
function get_fields() {
$fields = array(
'captcha' => array(
'label' => esc_html__( 'Display Captcha', 'et_builder' ),
'type' => 'yes_no_button',
'option_category' => 'configuration',
'options' => array(
'on' => esc_html__( 'Yes', 'et_builder' ),
'off' => esc_html__( 'No', 'et_builder' ),
),
'toggle_slug' => 'elements',
'description' => esc_html__( 'Turn the captcha on or off using this option.', 'et_builder' ),
'default_on_front' => 'on',
),
'email' => array(
'label' => esc_html__( 'Email', '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' => esc_html__( 'Title', 'et_builder' ),
'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',
),
'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' => esc_html__( 'No', 'et_builder' ),
'on' => esc_html__( 'Yes', 'et_builder' ),
),
'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 Text', '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',
),
'form_background_color' => array(
'label' => esc_html__( 'Form Field Background Color', 'et_builder' ),
'type' => 'color-alpha',
'custom_color' => true,
'toggle_slug' => 'form_field',
'tab_slug' => 'advanced',
'hover' => 'tabs',
),
);
return $fields;
}
public function get_transition_fields_css_props() {
$fields = parent::get_transition_fields_css_props();
$fields['form_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;
}
function render( $attrs, $content = null, $render_slug ) {
global $et_pb_half_width_counter;
$et_pb_half_width_counter = 0;
$module_id = $this->props['module_id'];
$captcha = $this->props['captcha'];
$email = $this->props['email'];
$title = $this->_esc_attr( 'title' );
$form_field_text_color = $this->props['form_field_text_color'];
$form_background_color = $this->props['form_background_color'];
$form_background_color_hover = $this->get_hover_value( 'form_background_color' );
$button_custom = $this->props['custom_button'];
$custom_icon = $this->props['button_icon'];
$submit_button_text = $this->props['submit_button_text'];
$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'];
global $et_pb_contact_form_num;
$video_background = $this->video_background();
$parallax_image_background = $this->get_parallax_image_background();
if ( '' !== $form_field_text_color ) {
ET_Builder_Element::set_style( $render_slug, array(
'selector' => '%%order_class%% .input[type="checkbox"]:checked + label i:before',
'declaration' => sprintf(
'color: %1$s%2$s;',
esc_html( $form_field_text_color ),
et_is_builder_plugin_active() ? ' !important' : ''
),
) );
ET_Builder_Element::set_style( $render_slug, array(
'selector' => '%%order_class%% .input[type="radio"]:checked + label i:before',
'declaration' => sprintf(
'background-color: %1$s%2$s;',
esc_html( $form_field_text_color ),
et_is_builder_plugin_active() ? ' !important' : ''
),
) );
}
if ( '' !== $form_background_color ) {
ET_Builder_Element::set_style( $render_slug, array(
'selector' => '%%order_class%% .input, %%order_class%% .input[type="checkbox"] + label i, %%order_class%% .input[type="radio"] + label i',
'declaration' => sprintf(
'background-color: %1$s%2$s;',
esc_html( $form_background_color ),
et_is_builder_plugin_active() ? ' !important' : ''
),
) );
}
if ( et_builder_is_hover_enabled( 'form_background_color', $this->props ) ) {
ET_Builder_Element::set_style( $render_slug, array(
'selector' => '%%order_class%%:hover .input, %%order_class%%:hover .input[type="checkbox"] + label i, %%order_class%%:hover .input[type="radio"] + label i',
'declaration' => sprintf(
'background-color: %1$s%2$s;',
esc_html( $form_background_color_hover ),
et_is_builder_plugin_active() ? ' !important' : ''
),
) );
}
$success_message = '' !== $success_message ? $success_message : esc_html__( 'Thanks for contacting us', 'et_builder' );
$et_pb_contact_form_num = $this->render_count();
$content = $this->content;
$nonce_result = isset( $_POST['_wpnonce-et-pb-contact-form-submitted'] ) && wp_verify_nonce( $_POST['_wpnonce-et-pb-contact-form-submitted'], 'et-pb-contact-form-submit' ) ? true : false;
$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] : '';
$hidden_form_fields = isset( $_POST['et_pb_contact_email_hidden_fields_' . $et_pb_contact_form_num] ) ? $_POST['et_pb_contact_email_hidden_fields_' . $et_pb_contact_form_num] : false;
$contact_email = '';
$processed_fields_values = array();
$utils = self::$data_utils;
// check that the form was submitted and et_pb_contactform_validate 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_contactform_validate_' . $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 );
// check whether captcha field is not empty
if ( 'on' === $captcha && ( ! 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; } // check all fields on current form and generate error message if needed if ( ! empty( $fields_data_array ) ) { foreach( $fields_data_array as $index => $value ) { // sanitize all the values of this array $value = $utils->sanitize_text_fields( $value ); // check all the required fields, generate error message if required field is empty $field_value = isset( $_POST[ $value['field_id'] ] ) ? trim( $_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'] && 'required' === $value['required_mark'] && ! empty( $field_value ) ) { $contact_email = isset( $_POST[ $value['field_id'] ] ) ? sanitize_email( $_POST[ $value['field_id'] ] ) : ''; if ( ! 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'] = sanitize_text_field( $field_value ); $processed_fields_values[ $value['original_id'] ]['label'] = $value['field_label']; } } } } 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_contactform_validate_' . $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 = 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}%%", $value['value'], $message_pattern ); } if ( false !== $hidden_form_fields ) { $hidden_form_fields = str_replace( '\\', '' , $hidden_form_fields ); $hidden_form_fields = json_decode( $hidden_form_fields ); 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.', '', sanitize_text_field( $_SERVER['HTTP_HOST'] ) ); $headers[] = "From: \"{$contact_name}\"%1$s
', et_core_esc_previously( $success_message ) ); } $form = ''; $et_pb_captcha = sprintf( '%1$s =