Drupal 8: Creación de formularios

Imagen de Cabecera - Drupal 8: Creando Formularios

Drupal 8: Creación de formularios

  • Autor: fjavimartin

  • Fecha de Creación: 13/06/2017

  • Categorías:

    • Drupal,
    • Drupal 8,
    • Formularios

Hace poco publicamos un artículo donde vimos como implementar una clase controlador que devolvía un "Hola Mundo". En este artículo avanzaremos un poco más y crearemos un formulario básico.

1. Creación del módulo Equipos Form

Nuestro formulario estará implementado en un módulo por lo que crearemos la siguiente carpeta ./modules/custom/equipos_form.

Necesitaremos crear el consiguiente fichero equipos_form.info.yml:

name: E-quipos Form
description: Practicando con formularios
type: module
package: E-quipos
core: 8.x

2. Ruta de acceso a nuestro formulario

Ya tenemos creado nuestro módulo por lo que ahora necesitamos crear una ruta que nos lleve a nuestro formulario por lo que tendremos que crear el fichero equipos_form.routing.yml:

equipos_form.basicform:
  path: '/equipos/basicform'
  defaults:
    _form: '\Drupal\equipos_form\Form\BasicForm'
    _title: 'Formulario Básico'
  requirements:
    _access: 'TRUE'

En este fichero definimos una ruta en la que Drupal cargará nuestro formulario, fijaremos un título y permitiremos el acceso a nuestro formulario para todo el mundo.

3. Implementación del formulario

Nuestro formulario solamente tendrá un par de campos con nombre y apellido junto a un botón de acción que nos permitirá enviar esta información y procesarla.

Para la implementación de la clase que gestionará el formulario necesitamos crear las carpetas src/Form y dentro nuestro fichero BasicForm.php con el siguiente contenido:

<?php

namespace Drupal\equipos_form\Form;


use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

class BasicForm extends FormBase {
  
  public function getFormId() {
    return 'equipos_form_basicform';
  }
  
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['nombre'] = [
        '#type' => 'textfield',
        '#title' => $this->t('Nombre'),
        '#description' => $this->t('Introduce un nombre'),
    ];
    
    $form['apellido'] = [
        '#type' => 'textfield',
        '#title' => $this->t('Apellidos'),
        '#description' => $this->t('Introduce los apellidos'),
    ];
    
    $form['actions'] = [
        '#type' => 'actions',
        'submit' => [
            '#type' => 'submit',
            '#value' => $this->t('Enviar'),
        ],
    ];
    
    return $form;
  }
  
  public function submitForm(array &$form, FormStateInterface $form_state) {
    drupal_set_message($this->t('Valores: @nombre / @apellido', 
        [ '@nombre' => $form_state->getValue('nombre'),
          '@apellido' => $form_state->getValue('apellido'),
        ])
    );
  }
}

Para crear un formulario tendremos que crear un clase que herede de la clase abstracta FormBase e implementar como mínimo:

  • getFormId(): Devolverá una cadena con el identificador del formulario. Este identificador será el que, por ejemplo, utilizarán otros métodos para modificar su comportamiento mediante hooks.

Si por casualidad se nos olvidara implementar este método recibiremos un bonito mensaje muy parecido al siguiente:

Error: Class Drupal\equipos_form\Form\BasicForm contains 1 abstract method and must therefore be declared

abstract or implement the remaining methods (Drupal\Core\Form\FormInterface::getFormId) in

/var/www/drupal8/modules/custom/equipos_form/src/Form/BasicForm.php, line 42

Si todo ha ido bien, a estas alturas del artículo tendremos nuestro formulario funcionando correctamente y accesible desde la url asigada en el fichero routing.yml.

Imagen del formulario

Drupal 8: Imagen del formulario que acabamos de crear

4. Validando campos del formulario

Ya tenemos nuestro formulario funcionando, vamos a darle una vuelta de tuerca para poder validar su contenido. Añadimos la siguiente función:

public function validateForm(array &$form, FormStateInterface $form_state) {
    $nombre = $form_state->getValue('nombre');
    $apellido = $form_state->getValue('apellido');
    
    if (strlen($nombre) == 0) {
      $form_state->setErrorByName('Nombre', $this->t('Nombre vacío'));
    }
    
    if (strlen($apellido) == 0) {
      $form_state->setErrorByName('Apellido', $this->t('Apellido vacío'));
    }
  }
  
}

Con esta función podremos validar el contenido de los campos de nuestro formulario. En nuestro caso simplemente verificaremos si hemos introducido algún valor en los dos campos y en caso de que alguno de los dos esté vacío lanzaremos un error.

5. Carga de nuestro formulario desde un controlador

Al principio de este artículo hemos asociado una ruta a nuestro formulario, pero no siempre tendremos este comportamiento en nuestro módulo sino que habrá ocasiones en los que tendremos que cargar un formulario desde una función de una clase controladora o cualquier otro sitio.

Devolver un formulario desde cualquier sitio de drupal solamente tendremos que utilizar el siguiente código:

$form = \Drupal::formBuilder()->getForm('Drupal\equipos_form\Form\BasicForm');

Para el caso en el que necesitáramos cargar nuestro formulario y pasarle parámetros la llamada sería:

$form = \Drupal::formBuilder()->getForm('Drupal\equipos_form\Form\BasicForm', $node);

Lo que tendremos en la variable $form será el array renderizable de nuestro formulario.

6. Conclusiones

En este sencillo artículo hemos aprendido a crear un formulario básico en el que tenemos un par de campos y que validamos mediante una sencilla función de validación. Además de esto también hemos aprendido a cargar nuestro formulario en cualquier parte de drupal.

Recursos

https://www.drupal.org/docs/8/api/form-api/introduction-to-form-api

https://www.drupal.org/docs/8/creating-custom-modules/let-drupal-8-know-about-your-module-with-an-infoyml-file

https://www.drupal.org/docs/8/api/routing-system/routing-system-overview

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormBase.php/class/FormBase/8.2.x

http://www.e-quipos.es/blog/drupal-8-nuestro-primer-m%C3%B3dulo

Todos los Derechos Reservados © 2016

Funciona con Drupal