En este tutorial veremos como crear formularios en Drupal 8 dentro de un módulo que estemos desarrollado.
Para crear formularios en Drupal 8 dentro de nuestro módulo crearemos el fichero pruebas_module/src/Form/CrearEmpresaForm.php y aquí definimos la clase del formulario y la definición de los diferentes campos.
<?php namespace Drupal\pruebas_module\Form; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Component\Utility\UrlHelper; class CrearEmpresaForm extends FormBase { /** * {@inheritdoc} */ public function getFormId() { // Nombre del formulario return 'crear_empresa_form'; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { // Definimos los campos $form['web'] = [ '#type' => 'textfield', '#title' => $this->t('Sitio web'), '#required' => TRUE, ]; $form['location'] = [ '#type' => 'text_format', '#title' => $this->t('Dirección'), '#required' => TRUE, ]; $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Crear empresa'), ]; return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { // Hacemos las validaciones necesarias if (empty($form_state->getValue('web'))) { $form_state->setErrorByName('web', $this->t('Es necesario introducir un sitio web')); } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { // Mostrar resultados al enviar el formulario en un mensaje de drupal foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } } }
Listado de elementos y tipos de campo disponibles para crear formularios en Drupal 8: https://api.drupal.org/api/drupal/elements
Ahora en nuestro controllador pruebas_module/src/Controller/PruebasController.php añadiremos una acción que cargará el formulario en una vista y posteriormente definiermos una ruta para tener una nueva página con un formulario disponible.
<?php namespace Drupal\pruebas_module\Controller; use Drupal; use Drupal\node\Entity\Node; use Drupal\Core\Controller\ControllerBase; class PruebasController extends ControllerBase { public function content() { return array( '#type' => 'markup', '#markup' => $this->t('Hola mundo !!'), ); } public function crearEmpresa() { // Utilizamos el formulario $form = $this->formBuilder()->getForm('Drupal\pruebas_module\Form\CrearEmpresaForm'); // Le pasamos el formulario y demás a la vista (tema configurado en el module) return [ '#theme' => 'crear_empresa', '#titulo' => $this->t('Formulario crear empresa'), '#descripcion' => 'Formulario para crear una nueva empresa en Drupal 8', '#formulario' => $form ]; } } ?>
Ahora vamos a crear el fichero de la vista pruebas_module/templates/crear_empresa.html.twig en el que simplemente imprimimos el contenido de la variable formulario.
<div class="row"> <div class="col-md-6"> <h2>{{ titulo }}</h2> <p>{{ descripcion }}</p> </div> <div class="col-md-6"> {{ formulario }} </div> </div>
Añadimos la vista que estamos usando al theme hook del pruebas_module.module
<?php /** * Theme hook */ function pruebas_module_theme($existing, $type, $theme, $path) { return array( 'crear_empresa' => array( 'variables' => array( 'titulo' => 'Título por defecto', 'descripcion' => 'descripción por defecto', 'formulario' => NULL ), 'template' => 'crear_empresa' ) ); }
Definimos nuestras rutas en el fichero pruebas_module/pruebas_module.routing.yml
pruebas_module.content: path: '/admin/config/modulo-de-pruebas' defaults: _controller: '\Drupal\pruebas_module\Controller\PruebasController::content' _title: 'Modulo de pruebas' requirements: _permission: 'access content' pruebas_module.crear_empresa: path: '/admin/config/crear-empresa' defaults: _controller: '\Drupal\pruebas_module\Controller\PruebasController::crearEmpresa' _title: 'Modulo de pruebas - Crear nueva empresa' requirements: _permission: 'access content'
Con esto ya hemos visto como crear formularios en Drupal 8.
Más información:
Crear un módulo básico en Drupal 8
Listado de hooks de Drupal 8
Curso de Symfony3 – Domina el framework PHP más completo