Crear Nodos Referenciados con Popups en Drupal 7

June 18, 2021
Muchos conocemos los populares módulos Node Reference y User Reference que eran parte de CCK en Drupal 6. En Drupal 7 tenemos varias alternativas a ellos: References que básicamente nos brinda la funcionalidad que nos daba Node Reference, Entity Reference que permite tener un campo con referencias a diferentes tipos de entidades y por último Relation, un módulo con muy prometedor que nos brinda un API para diseñar modelos de relaciones entre entidades. Este post lo estoy escribiendo porque me encontré con el siguiente problema a la hora de hacer referencias a un nodo: ¿Qué tal si la referencia no existe y es necesario que el usuario que está creando el contenido tenga la capacidad de crear este nodo? Claramente el usuario podría ir a /node/add/contenidoHijo y luego volver al formulario del nodo padre o que tiene que hacer la referencia y escoger a este "nodo hijo" que creamos primero. El problema con esto es que para el usuario final esto va a ser bastante tedioso, ¿Qué pasa si el usuario final tiene que crear unos 10 o 20 nodos los cuales no sabe si ya existen o no? Buscando una forma de resolver este problema me topé con el módulo References Dialog. Este módulo nos permite reproducir la funcionalidad que brindaba Node Relationships en Drupal 6 de crear, buscar y editar referencias en diálogos. Pueden ver la funcionalidad funcionando en el siguiente vídeo: Para desarrollar esta funcionalidad vamos a necesitar descargar y activar los siguientes módulos: Lo primero que vamos a hacer en este tutorial es crear los tipos de contenido que vamos a necesitar:
  • Children: el nodo hijo o al cual vamos a referenciar
  • Parent: el nodo padre el cual hará la referncia al nodo de tipo "Children"
En este segundo tipo de contenido "Parent" debemos crear un campo que sea de tipo "Node Reference" con widget type "Autocomplete text field". En el momento que creamos el campo veremos al final de la página la opción "VIEWS - NODES THAT CAN BE REFERENCED", una funcionalidad del módulo References para buscar de manera fácil nodos a referenciar; En este momento no mostrará nada, no hay problema con esto, ya que no hemos creado la vista que utilizaremos para buscar el contenido. field reference image example Dentro de las opciones del campo que acabamos de crear debemos seleccionar las opciones "Search Dialog, Edit dialog y Add dialog" si queremos buscar, editar o agregar referencias de los nodos tipo "Children". Una vez tenemos creado nuestro campo debemos ahora crear una vista para la búsqueda por diálogo. Para esto nos vamos a /admin/structure/views creamos una nueva vista y un display de esa vista de tipo Node Reference Dialog. Este display agregará una serie de opciones extras en la columna central del editor de las vistas bajo el título "REFERENCES DIALOG". En este momento veremos el campo "Attached to", aquí vamos a seleccionar el campo que acabamos de crear para nuestro nodo referenciado. Para que nuestra vista funcione correctamente debemos agregar como campo de la vista el NID del nodo y si quieremos, ocultarlo. Además debemos quitarle al Título que vamos a mostrar como campo la referencia al nodo original ya que no queremos que a la hora de hacer las búsqueda nos saque del formulario al nodo que acabamos de hacer click. Luego de esto creamos una variación del display tipo "References" el cual vamos a utilizar para hacer las búsquedas con una vista auxiliar. En nuestro ejemplo lo estamos haciendo de manera básica, sólo mostrando el título y filtrando por tipo de contenido pero podríamos utilizar filtros y exponerlos para que los usuarios puedan encontrar de forma amigable el nodo que quieren referenciar. Ahora podemos regresar a nuestro tipo de contenido padre y gestionar sus campos en /admin/structure/types/manage/parent/fields y editamos el campo de nodo referenciado, en mi caso field_children_reference, ya es posible selecccionar la vista que vamos a utilizar para seleccionar nodos en la opción "NODES THAT CAN BE REFERENCED" al final de la página y deberíamos poder utilizar la funcionalidad. Cualquier pregunta que tengan pueden escribirnos en los comentarios :).