drupal

Formulario personalizado y almacenamiento en base de datos en Drupal 8

En estos días tuve el requerimiento de crear un formulario y guardar la información en una tabla nueva, para conseguir eso tuve que crear un modulo personalizado.

A continuación detallaré los pasos que implementé:

 

El módulo que crearemos será llamado "asuform"

Primero creamos el archivo asuform.info.yml donde especificaremos detalles básicos para su existencia.

asuform/asuform.info.yml

 

name: AsuForm
type: module
description: Modulo para probar guardar data en base de datos.
version: 0.1
core: 8.x

 

 

Enseguida crearemos el archivo asuform.install el cual nos creara la tabla donde guardaremos los valores a través del formulario.

Esta tabla tendrá 3 columnas: id, name y points.

asuform/asuform.install

 

<?php
use Drupal\Core\Database\Database;

/**
* Implements hook_schema().
 * @ingroup asuform 
*/
function asuform_schema() {
  $schema['asuform'] = array(
  'description' => 'The table for points.',
    'fields' => array(
      'id' => array(
        'description' => '', 
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
      ),  
      'name' => array(
        'description' => 'Nombre de usuario',
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '', 
      ),  
      'points' => array(
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
        'description' => 'puntaje.',
      ),  
    ),  
    'primary key' => array('id'),
  );  
  return $schema;
}

 

 

Ahora crearemos el formulario, este será usado para ingresar información a la tabla. 

Podemos ver 3 funciones:

    getFormId() 

        Aquí determinamos el identificador del formulario.

    buildForm()

        Aquí determinamos los campos para el formulario.

    submitForm()

        Aquí se recupera y guarda la data.

 

asuform/src/Form/AsuformForm.php

 

<?php

/**
 * @file
 * Contains \Drupal\asuform\Form\AsuformForm.
 */

namespace Drupal\asuform\Form;

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

/**
 * Class AsuformForm.
 *
 * @package Drupal\asuform\Form
 */
class AsuformForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'asuform_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['name'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Nombre'),
      '#default_value' => '',
      '#size' => 60,
      '#maxlength' => 128,
      '#required' => TRUE,
    );
    
    $form['points'] = array(
      '#type' => 'number',
      '#title' => $this->t('Puntaje'),
      '#size' => 10,
      '#maxlength' => 5,
    );
    
    $form['actions'] = ['#type' => 'actions'];
    
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Guardar Puntaje'),
    ];
    
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {

    $values = array(
      'name' => $form_state->getValue('name'),
      'points' => $form_state->getValue('points'),
    );

    $table = 'asuform';

      \Drupal::database()->insert($table)
      -> fields(array(
        'name' => $values['name'],
        'points' => $values['points'],
      ))
      ->execute();
      drupal_set_message('Successful save.', 'status');

  }
  
}

 

 

Crearemos el controller donde llamaremos al formulario:

asuform/src/Controller/AsuformController.php

 

<?php
namespace Drupal\asuform\Controller;

use Drupal\Core\Controller\ControllerBase; 
/**
 * Controller Asuform.
 */
class AsuformController extends ControllerBase {

  public function formPage() {
    return \Drupal::formBuilder()->getForm('Drupal\asuform\Form\AsuformForm');

  }
}

 

 

Ahora creamos el archivo routing para definir la ruta donde mostraremos el formulario. Esto conseguimos llamando al Controller.

asuform/asuform.routing.yml

 

asuform.form: 
  path: 'formpage'
  defaults:
    _controller: '\Drupal\asuform\Controller\AsuformController::formPage'
    _title: 'Asuform'
  requirements:
    _permission: 'access content' 

 

 

Crearemos el archivo .module solo para tener un help que podría ser detallado si se requiere.

asuform/asuform.module

 

<?php

use \Drupal\Core\Routing\RouteMatchInterface;
use \Drupal\Core\Url;

/**
 * Implements hook_help().
 */
function asuform_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    case 'help.page.asuform':
      $url = Url::fromRoute('asuform.form');
      $output = 'Go to <a href="' . $url->toString() . '">Asuform</a>.';
      return $output;
    default:
  }
}

 

 

Finalmente tenemos el formulario en la ruta que creamos: /formpage

ejemplo formulario

 

Me pareció interesante el artículo

Deseo más información

O también puedes comunicarte con nosotros.

por whatsapp por whatsapp

Comentario

Que dificil es encontrar documentación en castellano de Drupal. Gracias por la información.

Añadir nuevo comentario

Me gustaría más información sobre:

CAPTCHA