En algunas situaciones, necesitamos manejar la estructura de los campos de un formulario custom; este manejo facilita el trabajo por parte de Front para dar estilos a las estructura de los formularios. Así que, si lo que queremos es renderizar o mostrar los cada campo específico de un formulario en una plantilla personalizada TWIG, estos son los pasos:
Para este ejemplo usaremos un módulo dummy: modules/custom/example_fields_form
Creación del módulo example_fields_form.info.yml:
type: module name: example_fields_form description: 'some description' core: 8.x
Teniendo nuestro módulo, necesitamos crear un archivo routing, el cual se encargará de llamar y ejecutar nuestro formulario con un requerimiento básico de acceso al contenido, para ello vamos a crear el archivo example_fields_form.routing.yml:
example_fields_form.fields_form: path: 'example-fields-form' defaults: _title: 'example_fields_form' _form: '\Drupal\example_fields_form\Form\BuildingForm requirements: _permission: 'access content'
Si nos fijamos en la ruta _form ubicados en el módulo, le hemos dado una ruta /Form/class_name, como hemos definido esta ruta, el archivo routing irá en busca de estos, por lo tanto debemos crear la estructura desde la carpeta raíz del módulo así: /example_fields_form/src/Form/BuildingForm.php. Hemos creado el directorio /src y /Form, además el archivo debe tener la siguiente estructura:
<?php /** * @file * Contains \Drupal\example_fields_form\Form\BuildingForm. */ namespace Drupal\example_fields_form\Form; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Form\FormBase; class BuildingForm extends FormBase { public function getFormId() { return ‘example_fields_form’; } public function buildForm(array $form, FormStateInterface $form_state) { } public function submitForm(array &$form, FormStateInterface $form_state) { drupal_set_message($this->t('@can_name ,Your application is being submitted!', array('@can_name' => $form_state->getValue('candidate_name')))); foreach ($form_state->getValues() as $key => $value) { drupal_set_message($key . ': ' . $value); } } public function validateForm(array &$form, FormStateInterface $form_state) { $values = $form_state->getValues(); } }
En estos momentos ya tenemos la estructura básica para construir nuestro formulario y las funciones básicas submit y validate, ahora sólo necesitamos agregar campos en nuestra función buildForm, para ellos nos vamos a basar en la documentación de drupal.org: https://api.drupal.org/api/drupal/elements/8.2.x Para este ejemplo vamos a usar un campo email y un botón:
$form['email'] = array( '#type' => 'email', '#placeholder' => t('Email'), '#required' => TRUE, ); //Botón $form['actions']['continue'] = array( '#type' => 'submit', '#value' => $this->t('continue'), '#attributes' => ['class' => ['act-continue']], );
Ahora necesitamos decirle a este formulario que va a tener una propiedad #theme para poder renderizar nuestros elementos, para eso ponemos:
$form['#theme'] = 'example-fields-form';
El nombre que pongamos, es el mismo que vamos a nombrar nuestro archivo template.
Ahora bien, si necesitamos poner nuestros archivos de estilos custom para este módulo, agregamos:
$form['#attached']['library'][] = example_fields_form/example_fields_form';
Ya con esto y teniendo la respectiva estructura para de directorios y el archivo example_fields_form.libraries.yml así:
example_fields_form': version: 1.x js: js/main.js: {} css: theme: css/main.css: {}
return $form;
Para poder enlazar nuestro Form con el Template, vamos a hacer uso de un hook_theme, para esto debemos crear desde la carpeta raíz un archivo example_fields_form.module y debe quedar así:
function example_fields_form_theme($existing, $type, $theme, $path) { return [ 'example-fields-form' => [ 'render element' => 'form', ], ]; }
<article class="example_fields_form"> <section> <div class="content"> {{ form.email }} {{ form.actions.continue }} </div> </section> </article> {{ form.form_build_id }} {{ form.form_token }} {{ form.form_id }}
Es importante llamar estos últimos campos para que el formulario pueda ser identificado y retornar todos sus datos.
Espero les ayude.