[Tutorial] Inline Entity Form y como modificar la tabla de relaciones

Posteado el por: moncada.nicolas
FacebookTwitter
ejemplo de ief

Si has trabajado mucho con Drupal 7+ quizás estés muy familiarizado con el campo Entity Reference. Y lo más probable que también con el Widget Inline Entity Form (en adelante IEF). El primero nos ayuda a relacionar nuestras entidades entre sí usando widgets de selección o auto completado. Y el segundo nos habilita dos widgets más complejos que nos permitiría, mientras editamos un contenido, poder crear y relacionar nuevos contenidos o editar los que ya estén relacionados, todo esto en el mismo formulario. ¿Genial no?

En éste post les hablaré un poco de IEF y luego de como modificar una de sus características que sería la tabla de relaciones. Empecemos...

¿Qué es IEF?

IEF es un módulo que habilita dos widgets para los campos del tipo relación de entidades. De fabrica tiene compatibilidad con Entity Reference como también lo tiene con Commerce Product Reference y Commerce Line Item Reference (estos dos últimos vienen con el módulo Drupal Commerce).
Una vez que instalamos el módulo se habilitarán los nuevos widgets en nuestro UI de campos.

Ejemplo widgets de IEF

¿Dos widgets?

Los nuevos widgets son:

  • Inline Entity Form Single value
  • Inline Entity Form Multiple values

El primer widget esta pensado para relacionar una entidad, lo que hace es agregar el formulario de la relación dentro del formulario del contenido "padre". En cambio, el segundo está pensado para relacionar más entidades, los cuales se adjuntan a una tabla de "relaciones" donde podrás editarlos o eliminarlos en el mismo lugar, por ejemplo:

Ejemplo de la tabla de relación.

¿Cómo funciona?

IEF, aparte de definir los widget por medio del hook hook_field_widget_info(), también agrega una variable a la definición de entidades que se realiza en el hook_entity_info (_alter). Esta variable (llamada inline entity form) define la clase controller que se encargará de construir el formulario de la entidad referenciada, como guardar la información y también como se generaría la tabla de relaciones. Por ejemplo para la entidad nodo se define la clase NodeInlineEntityFormController la cual extiende de la clase EntityInlineEntityFormController .
A continuación un extracto del código de IEF, en donde define el controlador para el nodo.

<?php
/**
 * Implements hook_entity_info_alter().
 */
function inline_entity_form_entity_info_alter(&$entity_info) {
 
$entity_info['node']['inline entity form'] = array(
   
'controller' => 'NodeInlineEntityFormController',
  );
 
// ...
}
?>

El controlador cuenta con el método entityForm() que define el formulario y que por defecto cargaría los fields del bundle de la entidad si es que existen (gracias a la clase EntityInlineEntityFormController). También está el método tableFields() el que se encarga de definir las columnas a mostrar en la tabla de relaciones.

Tabla de Relaciones

Esta tabla de relaciones se construye dependiendo de la entidad que se esté relacionando y solo se muestra en el Widget IEF Multiple Values. Por ejemplo los nodos relacionados, dado por la definición del controlador NodeInlineEntityFormController, se mostraría el título, el estado de publicación y el tipo de contenido (éste último dependiendo de si se relaciona a más de un tipo de contenido). Si, por algún requerimiento, necesitas sacar o agregar un campo, podrás hacerlo de dos formas distintas:

Implementado el hook_inline_entity_form_table_fields_alter

Éste método es el que más se ha estado implementando y comentando en los foros. Por ejemplo, si quiero mostrar un Field en la tabla y eliminar el estado de publicación, tendría que hacer lo siguiente:

<?php
/**
 * Implements hook_inline_entity_form_table_fields_alter().
 */
function mi_modulo_inline_entity_form_table_fields_alter(&$fields, $context) {
  if (
$context['entity_type'] != 'node') {
    return;
  }
 
$fields['field_mi_campo'] = array(                  
     
'type' => 'field',
     
'label' => t('My label'),
     
'weight' => 101,
   );
 
// Elimino status
 
unset($fields['status']);
}
?>

Claro que tendrás que crear tu propio módulo para hacer esto.

Instalar Inline Entity Form Table View Mode

Si no quieres crear un módulo propio entonces te podría interesar un nuevo módulo que he publicado llamado Inline Entity Form Table View Mode. Como su nombre lo indica, este módulo hace uso del View mode, que nos permite definir el orden de los Fields y el formato para la tabla de relaciones. Su truco esta en hacer uso de hook_inline_entity_form_table_fields_alter.

¿Cómo usarlo?

Como todo módulo en Drupal, necesitamos descargarlo de drupal.org y descomprimirlo en sites/all/modules/contrib. O usando drush:

$ drush en -y ief_table_view_mode

Para explicar mejor como usar el módulo, voy a explicarlo con un ejemplo en Drupal 7. Supongamos que tenemos el tipo de contenido Sala y el tipo de contenido Curso (ambos entidades nodo). Y en Sala creamos el campo Cursos con el tipo de campo entity reference usando el widget Inline Entity Form - Multiple Values.

Campos de Sala

Curso tiene los campos: Título, Imagen y temática.

Campos de Curso

Si probamos y creamos una sala, veremos lo siguiente:

Formulario Sala 1

Creamos un curso:

Formulario Sala 1 creando Curso

Guardamos el curso (temporalmente)

Formulario Sala 1 con un curso creado

Como vemos, la tabla de relaciones solo muestra el título y el estado de publicación del contenido. Para cambiar esto, tendremos que ir a la administración de la vista de los campos de Curso:

Manage Display de Curso

Debemos habilitar el view mode Inline Entity Form Table, una vez hecho esto aparecerá la sub pestaña del mismo nombre y le hacemos un click:

Lista de campos en el nuevo view mode

Aquí escondemos el campo Status y definimos que la imagen se vea con el image style Thumbnail. Ahora editamos la Sala que creamos anteriormente, lo que deberíamos ver sería lo siguiente:

Resultado View mode

Así de sencillo podrás definir la tabla de relaciones.

¿Qué hay para Drupal 8?

También existe para la versión de Drupal 8 y funciona de la misma forma, la única diferencia es que se debe crear manualmente el view mode.

Conclusión

No cabe duda que IEF nos puede mejorar la forma de relacionar las entidades, permitiéndonos la edición de éstas mientras editamos la entidad padre. Sumando que también contamos con la opción de configurar la tabla de relaciones sin tener que escribir una sola línea de código con Inline Entity Form Table View Mode, hace de esto una gran herramienta para responder con agilidad las necesidades o requerimientos que se nos solicita.

moncada.nicolas

Últimos Comentarios

Blog

En esta sección compartimos algunas experiencias concretas para la comunidad de desarrolladores de código abierto

Hace un tiempo atrás, Transbank (la empresa detrás de Webpay) había habilitado una nueva modalidad para integrar su sistema de pago con nuestros sitios. Se trata de un servicio web que utiliza el protocolo SOAP, haciendonos más fácil la integración con respecto a su antecesor. Y para soportar esto en Drupal, se ha publicado una nueva versión del módulo Webpay y aquí veremos como funciona.

Posteado el por: moncada.nicolas

Para la junta de Drupal (realizado el 20 de Diciembre del 2016) he presentado el desarrollo de un módulo pensado para la comunidad de Drupal Chile, llamado Badge. El objetivo del módulo es crear logros o insignias y asignarlo a usuarios u otras entidades de nuestro sitio.