logo

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

GLightbox is a pure javascript lightbox (Colorbox alternative without jQuery)❗

It can display images, iframes, inline content and videos with optional autoplay for YouTube, Vimeo and even self-hosted videos.

Demo GLightbox Download GLightbox

Scroll

9.8. Trabajar con formularios en Drupal. Añadir un formulario de configuración mediante programación.

04/05/2025, by Ivan

En este tutorial, trabajaremos con la API de Formularios de Drupal y crearemos un formulario de configuración para el módulo. Ya hemos creado módulos para mostrar una página y un bloque, ahora crearemos un formulario de configuración en el que almacenaremos datos para conectarnos a un servicio externo. Supongamos que necesitamos almacenar la API Key y el API Client ID en el sitio, por ejemplo, para usar la API de Google Maps.

Ejemplos de código disponibles en GitHub:
https://github.com/levmyshkin/drupalbook8

Podemos guardar esta información en el archivo settings.php y agregarla a git, pero no sería seguro. Es mejor guardar los accesos a servicios en la base de datos.

Formulario de configuración

Agreguemos una nueva ruta para nuestro formulario:

modules/custom/drupalbook/drupalbook.routing.yml

drupalbook.settings:
  path: '/admin/structure/drupalbook/settings'
  defaults:
    _form: '\Drupal\drupalbook\Form\DrupalbookSettingsForm'
    _title: 'Formulario de configuración de DrupalBook'
  requirements:
    _permission: 'administer site configuration'

A diferencia de las rutas anteriores, aquí especificamos _form en lugar de _controller. Vamos a crear una clase de formulario. Creamos el archivo:

modules/custom/drupalbook/src/Form/DrupalbookSettingsForm.php

Debes crear la carpeta Form dentro de src. Esto permite organizar mejor el código.

Contenido del archivo:

<?php

namespace Drupal\drupalbook\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Configura los ajustes del módulo DrupalBook.
 */
class DrupalbookSettingsForm extends ConfigFormBase {

  public function getFormId() {
    return 'drupalbook_admin_settings';
  }

  protected function getEditableConfigNames() {
    return [
      'drupalbook.settings',
    ];
  }

  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('drupalbook.settings');

    $form['drupalbook_api_key'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API Key'),
      '#default_value' => $config->get('drupalbook_api_key'),
    ];

    $form['drupalbook_api_client_id'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API Client ID'),
      '#default_value' => $config->get('drupalbook_api_client_id'),
    ];

    return parent::buildForm($form, $form_state);
  }

  public function submitForm(array &$form, FormStateInterface $form_state) {
    $this->configFactory->getEditable('drupalbook.settings')
      ->set('drupalbook_api_key', $form_state->getValue('drupalbook_api_key'))
      ->set('drupalbook_api_client_id', $form_state->getValue('drupalbook_api_client_id'))
      ->save();

    parent::submitForm($form, $form_state);
  }
}

El formulario hereda de ConfigFormBase, lo que permite guardar datos en el sistema de configuración. El ID del formulario debe ser único, y se recomienda iniciarlo con el nombre del módulo.

El método buildForm() construye el formulario. Usamos la API de Formularios de Drupal para definir campos. Documentación:
https://api.drupal.org/api/drupal/elements/8.5.x

También puedes utilizar campos de tipo select, checkboxes, radios, etc. Intenta agregarlos al formulario como práctica.

El método submitForm() guarda los datos en la configuración usando configFactory->getEditable() y set(), luego save(). También puedes personalizar el mensaje de éxito:

// parent::submitForm($form, $form_state);
drupal_set_message($this->t('¡La configuración fue guardada correctamente!'));

Después de crear el formulario, limpia la caché y visita la ruta configurada para ver tu formulario en acción.

Para acceder a los valores guardados desde cualquier parte del código:

$config = \Drupal::config('drupalbook.settings');
$api_key = $config->get('drupalbook_api_key');
$api_client_id = $config->get('drupalbook_api_client_id');

Este código funcionará en cualquier módulo o función preprocess.

En la próxima lección sobre formularios veremos cómo crear formularios de múltiples pasos.

Ejemplos de código disponibles en GitHub:
https://github.com/levmyshkin/drupalbook8