La validación de números telefónicos es una parte crucial de cualquier formulario en línea. Garantizar que los usuarios ingresen números de teléfono válidos ayuda a mantener la precisión de los datos y mejora la experiencia del usuario. En este artículo, se explorará cómo realizar la validación de números telefónicos utilizando la biblioteca intlTelInput en Elementor y Bricks Builder.

¿Qué es intlTelInput?

intlTelInput es una biblioteca de JavaScript que proporciona una interfaz de usuario intuitiva para ingresar y validar números de teléfono internacionales. Esta biblioteca utiliza la base de datos de códigos de país de Google para ofrecer una experiencia de usuario fluida y precisa.

Pasos para validar números telefónicos con intlTelInput en Elementor y Bricks Builder

Para poder agregar los fragmentos de código del post, es necesario utilizar un plugin de WordPress como Code Snippets o agregarlos al archivo functions.php del tema activo en su sitio web. Estos métodos le permitirán integrar y ejecutar los fragmentos de código de manera segura y eficiente.

Es necesario que los campos de los formularios sean de tipo telefónico tel para poder integrar y utilizar la biblioteca intlTelInput.

1. Agregando la librería de intlTelInput con wp_enqueue_scripts

Utilice la función wp_enqueue_scripts para agregar los scripts necesarios de intlTelInput en su tema de WordPress. Esto asegurará que los scripts se carguen de manera adecuada y optimizada.

<?php
add_action( 'wp_enqueue_scripts', function(){
	wp_enqueue_style( 'intlTelInput-css', 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.13/css/intlTelInput.css', array(), false, false );
	wp_enqueue_script( 'intlTelInput-js', 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.13/js/intlTelInput.min.js', array(), false, false );
}, 10);
<?php
add_action( 'wp_enqueue_scripts', function(){
	$bricks_settings_string = json_encode( Bricks\Database::get_template_data( 'content' ) );
	
	if( ! strpos( $bricks_settings_string, '"type":"tel"' ) ) {
		return;
	}
	
	wp_enqueue_style( 'intlTelInput-css', 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.13/css/intlTelInput.css', array(), false, false );
	wp_enqueue_script( 'intlTelInput-js', 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.13/js/intlTelInput.min.js', array(), false, false );
}, 10);

2. Añadiendo los estilos necesarios con wp_head:

Asegúrese de añadir los estilos requeridos para intlTelInput utilizando la función wp_head en su tema de WordPress. Esto garantizará que los estilos se integren correctamente en el encabezado de su sitio web.

<?php
add_action( 'wp_head', function () { ?>
	<style>
		.iti {
			width: 100%;
		}
		.iti__country-list {
			border-radius: 5px;
			box-shadow: 0 3px 13px rgba(0,0,0,0.08);
		}
	</style> <?php
} );
<?php
add_action( 'wp_head', function () { 
	$bricks_settings_string = json_encode( Bricks\Database::get_template_data( 'content' ) );
	
	if( ! strpos( $bricks_settings_string, '"type":"tel"' ) ) {
		return;
	}
?> 
	<style>
		.iti-mobile .iti--container {
			z-index: 10000;
		}
	</style> 
<?php } );

3. Agregando los scripts necesarios con wp_footer para inicializar la librería en los formularios:

Agregue los scripts necesarios después del footer para inicializar la biblioteca intlTelInput en los formularios de su sitio.

<?php
add_action( 'wp_footer', function () { ?>
	<script>
		document.addEventListener('DOMContentLoaded', () => {
			const forms = document.querySelectorAll('.elementor-form');

			const setintlTelInput = (field, validator) => {
				const iti = window.intlTelInput(field, {
					nationalMode: true,
					initialCountry: "auto",
					geoIpLookup: function(callback) {
						fetch('https://ipinfo.io/json')
							.then(res => res.json())
							.then(data => {
							var countryCode = (data && data.country) ? data.country : "us";
							callback(countryCode);
						})
						.catch(error => console.error(error));
					},
					utilsScript: "https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.13/js/utils.js"
				});

				// on blur: validate
				field.addEventListener('blur', function() {
					if (field.value.trim()) {
						if (iti.isValidNumber()) {
							field.value = iti.getNumber();
							validator.value = 'valid';
						} else {
							validator.value = 'error';
						}
					}
				});
			}
				
            forms.forEach((form) => {
                const telInputs = form.querySelectorAll('input[type="tel"]');

                if (!telInputs) return;

                form.addEventListener('click', () => {

                    telInputs.forEach((input) => {
                        let fieldGroup = input.parentNode,
                            fieldId = input.getAttribute('id'),
                            validator = document.createElement('input');

                        fieldId = fieldId.replace('form-field-', '');

                        validator.setAttribute('type', 'hidden');
                        validator.setAttribute('name', 'phone-validator-'+fieldId);
                        validator.setAttribute('value', '');

                        fieldGroup.insertBefore(validator, input.nextSibling);

                        setintlTelInput (input, validator);

                        let flagContainer = fieldGroup.querySelector(".iti__flag-container");
                        flagContainer.style.maxHeight = input.offsetHeight+'px';
                    });					
                }, {once: true});
            });
		});
	</script> <?php
} );
<?php
add_action( 'wp_footer', function () { 
	$bricks_settings_string = json_encode( Bricks\Database::get_template_data( 'content' ) );
	
	if( ! strpos( $bricks_settings_string, '"type":"tel"' ) ) {
		return;
	}
?> 
	<script>
		document.addEventListener('DOMContentLoaded', () => {
			const forms = document.querySelectorAll('.brxe-form');
			
			const setintlTelInput = (field, validator) => {
				const iti = window.intlTelInput(field, {
					nationalMode: true,
					initialCountry: "auto",
					geoIpLookup: function(callback) {
						fetch('https://ipinfo.io/json')
							.then(res => res.json())
							.then(data => {
							var countryCode = (data && data.country) ? data.country : "us";
							callback(countryCode);
						})
						.catch(error => console.error(error));
					},
					utilsScript: "https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.13/js/utils.js"
				});

				// on blur: validate
				field.addEventListener('blur', function() {
					if (field.value.trim()) {
						if (iti.isValidNumber()) {
							field.value = iti.getNumber();
							validator.value = 'valid';
						} else {
							validator.value = 'error';
						}
					}
				});
			}
			
			forms.forEach((form) => {
				const telInputs = form.querySelectorAll('input[type="tel"]');
				
				if (!telInputs) return;
				
				form.addEventListener('click', () => {
					
					telInputs.forEach((input) => {
						let fieldGroup = input.parentNode,
							fieldName = input.getAttribute('name'),
							fieldId = '',
							validator = document.createElement('input');

						fieldId = fieldName.replace('form-field-', '');

						validator.setAttribute('type', 'hidden');
						validator.setAttribute('name', 'phone-validator-'+fieldId);
						validator.setAttribute('value', '');

						fieldGroup.insertBefore(validator, input.nextSibling);

						setintlTelInput (input, validator)
					});					
				}, {once: true});
			});
		});
	</script> 
<?php } );

4. Validando los formularios con PHP tanto en Elementor como en Bricks:

Implemente la validación de formularios utilizando PHP tanto en Elementor como en Bricks para asegurar que los números de teléfono ingresados por los usuarios cumplan con los requisitos establecidos.

<?php
add_action( 'elementor_pro/forms/validation', function ( $record, $ajax_handler ) {
	
	$raw_fields = $record->get( 'fields' );
	
	foreach ( $raw_fields as $id => $field ) {
		$field_id = $field['id'];
		$field_type = $field['type'];
		$field_value = $field['value'];
		$is_tel_field = $field_type == 'tel' ? true : false;
		
		if( $is_tel_field ) {
			$validator = sanitize_text_field($_POST["phone-validator-$field_id"]);
			
			if ( empty( $field_value ) ) {
				return;
			}
			
			if ( $validator == 'error' ) {
				$ajax_handler->add_error( $field_id, __('Invalid phone number', 'textdomain') );
			}
		}
	}
}, 10, 2 );
<?php
add_filter( 'bricks/form/validate', function( $errors, $form ) {
	$form_settings = $form->get_settings();
	$form_fields   = $form->get_fields();
	$form_id       = $form_fields['formId'];
	
	foreach( $form_settings['fields'] as $field ) {
		$field_id = $field['id'];
		$field_label = $field['label'];
		$field_type = $field['type'];
		$is_tel_field = $field_type == 'tel' ? true : false;
		
		if( $is_tel_field ) {
			$phone = $form->get_field_value( $field_id );
			$validator = sanitize_text_field($_POST['phone-validator-'.$field_id]);
			
			if ( empty( $phone ) ) {
				return;
			}
			
			if ( $validator == 'error' ) {
				$html = array(
					$field_label,
					'Invalid phone number.'
				);
				
				$errors[] = esc_html__( implode(': ', $html), 'bricks' );
			}
		}
	}

	return $errors;
}, 10, 2 );