9.8.1. hook_form_alter() agrega envío y validación para el formulario existente.
En una de las lecciones anteriores aprendimos qué son los hooks. En esta lección trabajaremos con el hook hook_form_alter()
en la práctica y añadiremos funcionalidad a un formulario existente.
Ejemplos de código disponibles en GitHub:
https://github.com/levmyshkin/drupalbook8
Vamos a comenzar con hook_form_alter()
. Para añadir este hook a nuestro módulo, creamos un archivo llamado drupalbook.module
. Este será un archivo PHP donde agregaremos hooks y funciones auxiliares.
Luego añadimos hook_form_alter()
de esta manera:
/**
* Implementa hook_form_alter().
*/
function drupalbook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
}
Identificamos el ID del formulario para modificarlo, que en este caso es drupalbook_admin_settings
:
if ($form_id == 'drupalbook_admin_settings') {
$form['drupalbook_api_key']['#attributes']['placeholder'] = 'API key';
$form['drupalbook_api_client_id']['#attributes']['placeholder'] = 'API client ID';
}
Recuerda limpiar la caché para aplicar los cambios.
Aunque #attributes
no se documenta explícitamente para textfield
, sí puede usarse para añadir atributos como class
, placeholder
, etc.
Más sobre los elementos del Form API en Drupal 7:
https://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/7.x
Validación personalizada
Ahora validaremos que el campo de API Key comience con "google":
if ($form_id == 'drupalbook_admin_settings') {
...
$form['#validate'][] = 'drupalbook_settings_validate';
}
/**
* Validación personalizada.
*/
function drupalbook_settings_validate(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
if (strpos($form_state->getValue('drupalbook_api_key'), 'google') === FALSE) {
$form_state->setErrorByName('drupalbook_api_key', t('La API Key debe comenzar con "google".'));
}
}
Callback Submit personalizado
Agregamos un mensaje al enviar el formulario correctamente:
if ($form_id == 'drupalbook_admin_settings') {
...
$form['#submit'][] = 'drupalbook_settings_submit';
}
/**
* Callback personalizado para submit.
*/
function drupalbook_settings_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
\Drupal::messenger()->addStatus(
t(htmlentities('Insert API key in your tag: .'))
);
}
Código completo de drupalbook.module:
/**
* Implementa hook_form_alter().
*/
function drupalbook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id == 'drupalbook_admin_settings') {
$form['drupalbook_api_key']['#attributes']['placeholder'] = 'API key';
$form['drupalbook_api_client_id']['#attributes']['placeholder'] = 'API client ID';
$form['#validate'][] = 'drupalbook_settings_validate';
$form['#submit'][] = 'drupalbook_settings_submit';
}
}
/**
* Validación personalizada.
*/
function drupalbook_settings_validate(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
if (strpos($form_state->getValue('drupalbook_api_key'), 'google') === FALSE) {
$form_state->setErrorByName('drupalbook_api_key', t('La API Key debe comenzar con "google".'));
}
}
/**
* Callback personalizado para submit.
*/
function drupalbook_settings_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
\Drupal::messenger()->addStatus(
t(htmlentities('Insert API key in your tag: .'))
);
}
Esto concluye la lección sobre el Form API, aunque continuaremos explorándolo más adelante con AJAX y formularios de múltiples pasos.
Ejemplos de código disponibles en GitHub:
https://github.com/levmyshkin/drupalbook8