Los formularios en Drupal nunca son sencillos, siempre tienen alguna complicación o algún secreto que nos cuesta descubrir. Y es que al tratarse de arrays es complicado saber como podemos realizar algunas tareas o funciones.
Este es el caso de añadir una validación extra a un formulario que no es nuestro y estamos alterando, y es que algo tan sencillo puede resultar complejo si no sabemos como se hace y la documentación no es muy clara.
Añadir validación extra
Para añadir una validación extra lo primero que debemos hacer es alterar el formulario, para esto necesitamos el hook_form_alter, el cual nos va a permitir añadir la validación.
Vamos a partir con la idea de que necesitamos añadir esa validación personalizada a un formulario de un nodo de tipo artículo. Podemos utilizar el siguiente código en ese caso.
/**
* Implements hook form_alter().
*/
function escueladrupal_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// Add extra validation.
if (in_array($form_id, ['node_article_edit_form', 'node_article_form'])) {
$form['#validate'][] = '_escueladrupal_validate_node_article_form';
}
}
En ese hook podemos ver que añadimos una nueva validación utilizando ‘#validate’, y el nombre que indicamos es el de una función que se llama “_escueladrupal_validate_node_article_form”. Ahora debemos crear esa función y en ella podremos realizar validaciones adicionales a la que Drupal ya provea para el formulario.
/**
* Validación adicional para los nodos de tipo articulo.
*/
function _escueladrupal_validate_node_article_form($form, FormStateInterface $form_state) {
$title = @$form_state->getValue('title')[0]['value'];
if (strlen($title) < 20 ) {
$form_state->setError($form['title'], t("The title can't have less that 20 letters"));
}
}
En este ejemplo estamos comprobando que el título del nodo tenga mas de 20 letras, si no lo cumple, se añadirá un error y Drupal no realizará el envió completo del formulario.
Y de esa manera tan sencilla podemos añadir tantas validaciones como deseemos ya que la estamos añadiendo a un array del formulario.
Me metí en la aventura de Drupal con la versión 6, y aquí estoy, 10 años después, escribiendo articulos y haciendo videos sobre Drupal, quien me lo iba a decir. Aunque he probado otros framworks y cms, me quedo con Drupal de lejos, pero Symfony y Django estan entre mis favoritos. Aficionado a la montaña, la bicicleta, y el comer, de eso que no falte.