9.11. Drupal Entity API. Create custom Entity type. Generate Entity type using Drupal Console.
Ya hemos comprendido el Form API, el Fields API y sabemos cómo se almacenan los datos en Drupal. Ahora veamos la base de todos los sitios Drupal, es decir, el Entity API.
Probablemente ya hayas notado que los campos no existen por sí mismos, sino que están “adjuntos” a entidades: nodos, bloques, términos de taxonomía, vistas, etc. Puedes crear entidades con diferentes bundles, por ejemplo, tipos de contenido, tipos de bloques o vocabularios. Pero ¿qué sucede si necesitas crear un nuevo tipo de entidad con sus propios bundles? En ese caso, necesitarás el Entity API para crear una nueva entidad personalizada.
He subido todo el código del módulo drupalbook_product
a GitHub, puedes descargarlo y añadirlo a tu sitio:
https://github.com/levmyshkin/drupalbook8
Lo más fácil es crear nuevos tipos de entidad usando la Drupal Console, ya que solo necesitas ejecutar un único comando.
No es común tener que crear nuevos tipos de entidad. En la mayoría de los proyectos pequeños y medianos se utilizan módulos contribuidos como base, por ejemplo, Commerce para tiendas en línea:
https://www.drupal.org/project/commerce
Si estás desarrollando un módulo personalizado, quizás sí necesites crear una nueva entidad. Aunque también podrías encontrar un módulo existente con la funcionalidad deseada que puedas extender.
En este artículo analizaremos el Entity API y crearemos un tipo de entidad personalizado llamado Product, que puede servir como base para un catálogo o tienda. Aun así, si estás considerando crear una tienda completa, te recomiendo usar Drupal Commerce, ya que te ahorrará mucho trabajo.
¿Por qué no simplemente usar un tipo de contenido personalizado llamado “Producto”? Puedes hacerlo si es un catálogo pequeño con vistas simples y filtros básicos. Pero si tienes miles de productos y necesitas filtros por SKU, categoría, color, nombre, etc., la página de /admin/content
se volverá muy pesada y difícil de manejar. En estos casos, se crea una entidad separada llamada “Product” con su propia interfaz de administración.
Primero, crea una copia de seguridad del sitio, al menos de la base de datos, antes de generar una entidad. El proceso genera configuraciones que se escriben en la base de datos, y un fallo podría dañar el sitio si falta algún archivo.
Ahora generamos el módulo, también usando Drupal Console:
drupal generate:module
O simplemente crea el archivo drupalbook_product.info.yml
:
name: 'drupalbook_product'
type: module
description: 'Products catalog'
core: 8.x
package: 'Drupalbook'
Luego genera el tipo de entidad Product:
drupal generate:entity:content
Durante el proceso se te preguntará:
- ¿Nombre de clase? — Usa algo como
DrupalbookProductEntity
- ¿Nombre máquina? — Ej.
drupalbook_product_entity
- ¿Ruta base? — Por defecto
/admin/structure
- ¿La entidad tendrá bundles? — Sí
- ¿Será traducible? — Sí
- ¿Tendrá revisiones? — No (o sí, según el caso)
Una vez generado, habilita el módulo y verás la nueva entidad en el backend. Puedes crear bundles como “Ropa”, “Electrónica”, etc., y asignarles campos específicos como talla, color, precio, etc.
Al crear un bundle, puedes añadir campos personalizados como lo haces con tipos de contenido. Por ejemplo, el campo Precio para los productos.
En la base de datos se crearán tablas como:
drupalbook_product_entity
: contiene UUID y clave primariadrupalbook_product_entity_field_data
: contiene propiedades principales como nombre- Tablas adicionales por cada campo si se activa revisión
Ahora comprendes cómo crear nuevos tipos de entidades. En los próximos artículos ampliaremos las funcionalidades de nuestro catálogo o tienda personalizada.