381 lines
11 KiB
PHP
381 lines
11 KiB
PHP
<?php
|
|
|
|
// If Gravity Forms isn't loaded, bail.
|
|
if ( ! class_exists( 'GFForms' ) ) {
|
|
die();
|
|
}
|
|
|
|
/**
|
|
* Class GF_Field_Phone
|
|
*
|
|
* Handles the behavior of Phone fields.
|
|
*
|
|
* @since Unknown
|
|
*/
|
|
class GF_Field_Phone extends GF_Field {
|
|
|
|
/**
|
|
* Defines the field type.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @var string The field type.
|
|
*/
|
|
public $type = 'phone';
|
|
|
|
/**
|
|
* Defines the field title to be used in the form editor.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFCommon::get_field_type_title()
|
|
*
|
|
* @return string The field title. Translatable and escaped.
|
|
*/
|
|
public function get_form_editor_field_title() {
|
|
return esc_attr__( 'Phone', 'gravityforms' );
|
|
}
|
|
|
|
/**
|
|
* Returns the field's form editor description.
|
|
*
|
|
* @since 2.5
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_form_editor_field_description() {
|
|
return esc_attr__( 'Allows users to enter a phone number.', 'gravityforms' );
|
|
}
|
|
|
|
/**
|
|
* Returns the field's form editor icon.
|
|
*
|
|
* This could be an icon url or a gform-icon class.
|
|
*
|
|
* @since 2.5
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_form_editor_field_icon() {
|
|
return 'gform-icon--phone';
|
|
}
|
|
|
|
/**
|
|
* Defines the field settings available within the field editor.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @return array The field settings available for the field.
|
|
*/
|
|
function get_form_editor_field_settings() {
|
|
return array(
|
|
'conditional_logic_field_setting',
|
|
'prepopulate_field_setting',
|
|
'error_message_setting',
|
|
'label_setting',
|
|
'label_placement_setting',
|
|
'admin_label_setting',
|
|
'size_setting',
|
|
'rules_setting',
|
|
'visibility_setting',
|
|
'duplicate_setting',
|
|
'default_value_setting',
|
|
'placeholder_setting',
|
|
'description_setting',
|
|
'phone_format_setting',
|
|
'css_class_setting',
|
|
'autocomplete_setting',
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Defines if conditional logic is supported in this field type.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFFormDetail::inline_scripts()
|
|
* @used-by GFFormSettings::output_field_scripts()
|
|
*
|
|
* @return bool true
|
|
*/
|
|
public function is_conditional_logic_supported() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Validates inputs for the Phone field.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFFormDisplay::validate()
|
|
* @uses GF_Field_Phone::get_phone_format()
|
|
* @uses GF_Field_Phone::$validation_message
|
|
* @uses GF_Field_Phone::$errorMessage
|
|
*
|
|
* @param array|string $value The field value to be validated.
|
|
* @param array $form The Form Object.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function validate( $value, $form ) {
|
|
$phone_format = $this->get_phone_format();
|
|
|
|
if ( rgar( $phone_format, 'regex' ) && $value !== '' && $value !== 0 && ! preg_match( $phone_format['regex'], $value ) ) {
|
|
$this->failed_validation = true;
|
|
if ( ! empty( $this->errorMessage ) ) {
|
|
$this->validation_message = $this->errorMessage;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the field input.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFCommon::get_field_input()
|
|
* @uses GF_Field::is_entry_detail()
|
|
* @uses GF_Field::is_form_editor()
|
|
* @uses GF_Field_Phone::$failed_validation
|
|
* @uses GF_Field_Phone::get_phone_format()
|
|
* @uses GF_Field::get_field_placeholder_attribute()
|
|
* @uses GF_Field_Phone::$isRequired
|
|
* @uses GF_Field::get_tabindex()
|
|
*
|
|
* @param array $form The Form Object.
|
|
* @param string $value The value of the input. Defaults to empty string.
|
|
* @param null|array $entry The Entry Object. Defaults to null.
|
|
*
|
|
* @return string The HTML markup for the field.
|
|
*/
|
|
public function get_field_input( $form, $value = '', $entry = null ) {
|
|
|
|
if ( is_array( $value ) ) {
|
|
$value = '';
|
|
}
|
|
|
|
$is_entry_detail = $this->is_entry_detail();
|
|
$is_form_editor = $this->is_form_editor();
|
|
|
|
$form_id = $form['id'];
|
|
$id = intval( $this->id );
|
|
$field_id = $is_entry_detail || $is_form_editor || $form_id == 0 ? "input_$id" : 'input_' . $form_id . "_$id";
|
|
|
|
$size = $this->size;
|
|
$disabled_text = $is_form_editor ? "disabled='disabled'" : '';
|
|
$class_suffix = $is_entry_detail ? '_admin' : '';
|
|
$class = $size . $class_suffix;
|
|
$class = esc_attr( $class );
|
|
|
|
$instruction_div = '';
|
|
if ( $this->failed_validation ) {
|
|
$phone_format = $this->get_phone_format();
|
|
if ( rgar( $phone_format, 'instruction' ) ) {
|
|
$instruction_div = sprintf( "<div class='gfield_description instruction validation_message'>%s %s</div>", esc_html__( 'Phone format:', 'gravityforms' ), $phone_format['instruction'] );
|
|
}
|
|
}
|
|
|
|
$html_input_type = 'tel';
|
|
$placeholder_attribute = $this->get_field_placeholder_attribute();
|
|
$required_attribute = $this->isRequired ? 'aria-required="true"' : '';
|
|
$invalid_attribute = $this->failed_validation ? 'aria-invalid="true"' : 'aria-invalid="false"';
|
|
$aria_describedby = $this->get_aria_describedby();
|
|
$autocomplete_attribute = $this->enableAutocomplete ? $this->get_field_autocomplete_attribute() : '';
|
|
|
|
$tabindex = $this->get_tabindex();
|
|
|
|
return sprintf( "<div class='ginput_container ginput_container_phone'><input name='input_%d' id='%s' type='{$html_input_type}' value='%s' class='%s' {$tabindex} {$placeholder_attribute} {$required_attribute} {$invalid_attribute} {$aria_describedby} {$autocomplete_attribute} %s/>{$instruction_div}</div>", $id, $field_id, esc_attr( $value ), esc_attr( $class ), $disabled_text );
|
|
|
|
}
|
|
|
|
/**
|
|
* Gets the value of the submitted field.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFFormsModel::get_field_value()
|
|
* @uses GF_Field::get_value_submission()
|
|
* @uses GF_Field_Phone::sanitize_entry_value()
|
|
*
|
|
* @param array $field_values The dynamic population parameter names with their corresponding values to be populated.
|
|
* @param bool $get_from_post_global_var Whether to get the value from the $_POST array as opposed to $field_values. Defaults to true.
|
|
*
|
|
* @return array|string
|
|
*/
|
|
public function get_value_submission( $field_values, $get_from_post_global_var = true ) {
|
|
|
|
$value = parent::get_value_submission( $field_values, $get_from_post_global_var );
|
|
$value = $this->sanitize_entry_value( $value, $this->formId );
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Sanitizes the entry value.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GF_Field_Phone::get_value_save_entry()
|
|
* @used-by GF_Field_Phone::get_value_submission()
|
|
*
|
|
* @param string $value The value to be sanitized.
|
|
* @param int $form_id The form ID of the submitted item.
|
|
*
|
|
* @return string The sanitized value.
|
|
*/
|
|
public function sanitize_entry_value( $value, $form_id ) {
|
|
$value = is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value );
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Gets the field value when an entry is being saved.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFFormsModel::prepare_value()
|
|
* @uses GF_Field_Phone::sanitize_entry_value()
|
|
* @uses GF_Field_Phone::$phoneFormat
|
|
*
|
|
* @param string $value The input value.
|
|
* @param array $form The Form Object.
|
|
* @param string $input_name The input name.
|
|
* @param int $lead_id The Entry ID.
|
|
* @param array $lead The Entry Object.
|
|
*
|
|
* @return string The field value.
|
|
*/
|
|
public function get_value_save_entry( $value, $form, $input_name, $lead_id, $lead ) {
|
|
$value = $this->sanitize_entry_value( $value, $form['id'] );
|
|
|
|
if ( $this->phoneFormat == 'standard' && preg_match( '/^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$/', $value, $matches ) ) {
|
|
$value = sprintf( '(%s) %s-%s', $matches[1], $matches[2], $matches[3] );
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Outputs any inline scripts to be used when the page is rendered.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GF_Field::register_form_init_scripts()
|
|
* @uses GF_Field_Phone::get_phone_format()
|
|
*
|
|
* @param array $form The Form Object.
|
|
*
|
|
* @return string The inline scripts.
|
|
*/
|
|
public function get_form_inline_script_on_page_render( $form ) {
|
|
$script = '';
|
|
$phone_format = $this->get_phone_format();
|
|
|
|
if ( rgar( $phone_format, 'mask' ) ) {
|
|
$script = "jQuery('#input_{$form['id']}_{$this->id}').mask('{$phone_format['mask']}').bind('keypress', function(e){if(e.which == 13){jQuery(this).blur();} } );";
|
|
}
|
|
return $script;
|
|
}
|
|
|
|
/**
|
|
* Sanitizes the field settings.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GFFormDetail::add_field()
|
|
* @used-by GFFormsModel::sanitize_settings()
|
|
* @uses GF_Field::sanitize_settings()
|
|
* @uses GF_Field_Phone::get_phone_format()
|
|
* @uses GF_Field_Phone::$phoneFormat
|
|
*
|
|
* @return void
|
|
*/
|
|
public function sanitize_settings() {
|
|
parent::sanitize_settings();
|
|
|
|
if ( ! $this->get_phone_format() ) {
|
|
$this->phoneFormat = 'standard';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get an array of phone formats.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GF_Field_Phone::get_phone_format()
|
|
*
|
|
* @param null|int $form_id The ID of the current form or null to use the value from the current fields form_id property. Defaults to null.
|
|
*
|
|
* @return array The phone formats available.
|
|
*/
|
|
public function get_phone_formats( $form_id = null ) {
|
|
|
|
if ( empty( $form_id ) ) {
|
|
$form_id = $this->formId;
|
|
}
|
|
$form_id = absint( $form_id );
|
|
|
|
$phone_formats = array(
|
|
'standard' => array(
|
|
'label' => '(###) ###-####',
|
|
'mask' => '(999) 999-9999',
|
|
'regex' => '/^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$/',
|
|
'instruction' => '(###) ###-####',
|
|
),
|
|
'international' => array(
|
|
'label' => __( 'International', 'gravityforms' ),
|
|
'mask' => false,
|
|
'regex' => false,
|
|
'instruction' => false,
|
|
),
|
|
);
|
|
|
|
/**
|
|
* Allow custom phone formats to be defined.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @param array $phone_formats The phone formats.
|
|
* @param int $form_id The ID of the current form.
|
|
*/
|
|
return gf_apply_filters( array( 'gform_phone_formats', $form_id ), $phone_formats, $form_id );
|
|
}
|
|
|
|
/**
|
|
* Get the properties for the fields selected phone format.
|
|
*
|
|
* @since Unknown
|
|
* @access public
|
|
*
|
|
* @used-by GF_Field_Phone::get_field_input()
|
|
* @used-by GF_Field_Phone::get_form_inline_script_on_page_render()
|
|
* @used-by GF_Field_Phone::sanitize_settings()
|
|
* @used-by GF_Field_Phone::validate()
|
|
* @uses GF_Field_Phone::get_phone_formats()
|
|
* @uses GF_Field_Phone::$phoneFormat
|
|
*
|
|
* @return array The phone format.
|
|
*/
|
|
public function get_phone_format() {
|
|
$phone_formats = $this->get_phone_formats();
|
|
|
|
return rgar( $phone_formats, $this->phoneFormat );
|
|
}
|
|
}
|
|
|
|
// Register the phone field with the field framework.
|
|
GF_Fields::register( new GF_Field_Phone() );
|