You are here

Cómo obtener un formulario por código en Drupal 8

isholgueras's picture
Submitted by isholgueras on Sun, 05/15/2016 - 22:18

Una de las nuevas cosas que trae el API de Drupal 8 es un cambio completo a toda la generación de formularios junto con los nuevos render_array.

En Drupal 7, para obtener un formulario custom simplemente había que hacer:

$form = drupal_get_form("form_id", $args);

En Drupal 8 la cosa cambia bastante. Distingamos dos tipos de formulario, los customizados y los de entidad

Para obtener el array form de un formulario customizado se haría:

$form = \Drupal::formBuilder()->getForm(\Drupal\my_module\Form\MyCustomForm::class);

Si lo que deseas es obtener el formulario de creación/edición de una entidad ya no utilizamos el form builder, utilizamos el entityTypeManager para obtener el formulario que enviarle al formBuilder. Veamos dos ejemplos:

$values = ['type' => "article"];

// Obtengo el formulario de creación
$node_add = \Drupal::entityTypeManager()
 ->getStorage('node')
 ->create($values);
//Obtendo el formulario de edición del nodo 145
$node_145 = \Drupal::entityTypeManager()
      ->getStorage('node')
      ->load(145);

Cuando ya tengamos el nodo o entidad disponible, utilizamos el propio objeto de entityTypeManager para obtener el formulario.

$form = \Drupal::entityTypeManager()
      ->getFormObject('node', 'default')
      ->setEntity($node);

Este objeto $form, ya es el objeto formulario que necesita el formBuilder para renderizar el formulario. Para ello simplemente llamamos a lo que hemos llamado al principio con el formulario custom y ya tendremos nuestro formulario renderizado:

$rendered_form = \Drupal::formBuilder()->getForm($form);

Está claro que el cambio de pensamiento de Drupal 7 a Drupal 8 es muy grande, pero una vez que vas entrando poco a poco vas viendo mucha lógica y mucha razón a tal y como está planteado Drupal 8.

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.