Hero

Como agregar una función de validación a un elemento FAPI en Drupal 7

Marzo 03, 2014

enzo
Drupal
Desarrollo de Modulos

Para los desarrolladores usuales de Drupal es usual crear funciones que validen un formulario y así verificar que los valores ingresados sean los esperados, sin embargo si contamos con muchos formularios similares estaríamos repitiendo el mismo código de validación una y otra vez.

Si quisiéramos mejorar un poco nuestro código podríamos crear funciones que validen los valores a elementos del formulario del mismo tipo y lo asignamos a cada elemento usando la propiedad de FAPI #element_validate.

A continuación les presento un ejemplo que valida un elemento FAPI para que sea sea un número igual o mayor a cero y que este dentro de un rango definido.

  1. Definir la función de validación.

Esta función recibiría dos parámetros, el primero parámetro $element sera el elemento a validar y el segundo parámetros sera el***$form_state*** que nos permitirá acceder a otros elementos en caso de que sean necesarios para hacer una validación condicional.

Veamos la función.

/**
 * Form element validation handler for integer elements that must be positive.
 */
function _MIMODULO_validate_integer_positive($element, &$form_state) {
  $value = $element['#value'];
  $min = $element['#min'];
  $max = $element['#max'];
  if ($value !== '' && (!is_numeric($value) || intval($value) != $value || $value < 0)) {
    form_error($element, t('%name must be a positive integer.', array('%name' => $element['#title'])));
  }

  // Validate if value is inside the range
  if(isset($min) && isset($max)) {
    if($value < $min || $value > $max) {
      form_error($element, t('%name must be a positive integer inside the range [%min-%max].', array('%name' => $element['#title'], '%min' => $min, '%max' => $max)));
    }
  }
}

Como vemos el rango en opcional.

  1. Asociar función de validacion a elemento del formulario.

A continuación definiremos un elemento de tipo textfield para aceptar un valor como se muestra a continuación.

$form['frecuency'] = array(
    '#type' => 'textfield',
    '#element_validate' => array('_MIMODULO_validate_integer_positive'),
    '#title' => t('Frequency'),
    '#default_value' => variable_get('frecuency', 0),
    '#size' => 4,
    '#min' => 0,
    '#max' => 1000,
    '#required' => TRUE,
    '#attributes' => array(),
  );

Como podemos ver los valores #min y #max no son propiedades propias de un elemento FAPI, pero tenemos la libertad de definirnos y la función de validación sera el que le de sentido a estas propiedades.

Nuestra función se ejecutara al hacer submit al formulario y si ingresamos un valor fuera del rango obtendremos un error similar al de la siguiente imagen.

element validate 0

Espero haya sido de su agrado y los invito a crear sus propias funciones de validación.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.