Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll
04/05/2025, by Ivan

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.

drupalbook

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.

api key

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".'));
  }
}

formulario

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:  .'))
  );
}

formulario drupalbook

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