Una de las grandes características de Drupal 7, y que lo convierte en una plataforma tan flexible, son las entidades. Técnicamente los nodos, los usuarios, los comentarios y los términos de las taxonomías son entidades, permitiendo que a todos se les pueda adjuntar campos.
Estas entidades pueden existir gracias a que Drupal cuenta con un hook que las define, así permitiendo que otros desarrolladores puedan crear otras entidades, tenemos como ejemplo a Drupal Commerce (Entidades como Productos, Ordenes, etc...) y a Field Collection. Sin embargo, para muchos que no están muy familiarizados con la programación o les parece un poco complicado/lento definir entidades, existe un módulo llamado Entity Construction Kit (ECK). Con este módulo podrán crear sus propias entidades definiendo distintos bundles (equivalente a tipos de contenidos de los nodos), por ejemplo la entidad Vehículo puede tener los bundles Auto, Motocicleta, Camión, etc.
El objetivo de este post es ver de todo un poco sobre ECK, como crear una entidad, como mostrarlos con Views, usar Rules, Services, Features, etc. Esto para que tengan otra alternativa a los nodos.
En todo el artículo usaré de ejemplo el Vehículo como una entidad
Creando mi Entidad
Una vez que instalamos el módulo ECK, deberá aparecer, en el menú Estructura (Structure) del administrador la opción Entity Type (Adjunto una imagen).
Aquí iniciamos nuestra creación de la entidad, haciendo click en Add entity type. Cuando creamos la entidad nos solicitará lo básico, el nombre de ésta (acompañado de su nombre de máquina) y opcionalmente crear nuestro primer bundle, en este caso crearemos Auto. Finalmente y no menos importante las propiedades de la entidad.
Las propiedades son datos que se adjuntan directamente a la entidad y estarán en todos sus bundles. En la imagen tengo seleccionado Author que me registrará el usuario que creará el vehículo, Created para registrar la fecha de creación y Changed para registrar la fecha de modificación. Esto es similar a lo que ya cuenta un Nodo, la diferencia es que no vamos a agregar el título. Ya profundizaremos de esto.
Ya guardando la entidad, podemos volver a la lista de entidades y veremos Vehículo en la lista.
Hacemos click sobre Vehículo y veremos nuestro bundle Auto. Adicionalmente podremos ver opciones para actuar sobre nuestra entidad, podemos editarla, eliminarla y volver a configurar sus propiedades.
Propiedades
Este ítem es muy importante, algunos se podrían confundir con esto y los Fields. Como señale anteriormente, las propiedades son datos que van junto con la entidad y en todos sus bundles, algunos valores podrían ser solicitados en el formulario de edición de la entidad y otros son automáticamente completados al guardar.
Por ejemplo la entidad nodo tiene las siguientes propiedades:
- Título
- Autor
- Fecha de Creación
- Fecha de Actualización
- Estado (Si esta publicado o no)
- Comentario (Define si permite comentarios o no)
- Promote
- Sticky
- Etc...
En cambio, hasta ahora nuestra entidad Vehículo solo tiene:
- Autor
- Fecha de Creación y
- Fecha de Actualización
Sin embargo pueden agregar más propiedades y para ello lo pueden hacer ingresando a Manage Properties
Aquí veremos la lista de propiedades que ya cuenta nuestra entidad, podemos seleccionar los que ya propone por defecto o podemos crear otros nuevos. Por ejemplo podría definir otra propiedad como el Año del Vehículo, en donde el usuario deberá ingresarlo.
Para crear la nueva propiedad debemos definir el nombre, el tipo de dato a guardar y el Behavior. Este último puede ser confuso, ya que esto solo define el como se va a comportar esta propiedad en la creación y edición. Por ejemplo si seleccionamos title se solicitará el valor de la propiedad en un campo de texto siendo obligatorio, igual que el título del nodo. Si seleccionamos created o changed serán completados al hacer guardar con sus respectivos valores que correspondan.
Como vemos en la imagen, estoy creando el Año del Vehículo como un entero usando el Behavior Title, sin embargo esto generará un problema: el campo de texto no me va a validar si el valor es realmente un entero, generando un error en la base de datos si ingreso un valor que no sea numérico, tendría que modificar el campo agregándole el validador vía módulo personalizado. Así que optamos por no agregarlo como propiedad, podemos hacerlo como un Field.
¿Cuándo uso Propiedades o Fields?
Buena pregunta, ambos hacen casi lo mismo, registran en la base de datos valores asociados a la entidad. La diferencia técnica es que las propiedades se adjuntan directamente en la tabla de la entidad, en cambio los Fields cuentan con sus propias tablas. Esto hace que el primero no permita valores múltiples como si lo hace los Fields, pero gana en rendimiento. Si lo tuyo no es crear módulos, simplemente utiliza las propiedades básicas como autor, fechas, etc, y para el resto usar Fields. En cambio si tienes la experiencia de crear tus propios módulos, te preocupa el rendimiento, los valores no son múltiples y siempre deben ser solicitados en todos los bundles, entonces usar las propiedades puede ser una buena opción.
Configurando nuestro Bundle Auto
Ya terminamos con la entidad Vehículo, dejando configurado solo 3 propiedades: Autor, Fecha de Creación y Fecha de Actualización. Ahora ingresaremos a configurar nuestro bundle Auto, ingresamos desde la lista de bundles.
Aquí veremos la lista de autos que se hayan creado y también contamos con las mismas opciones que tiene un tipo de contenido de un nodo para configurar campos. Ya teniendo experiencia con los nodos, esto no sería problema.
En este ejemplo agregue el campo imágenes del vehículo. También podemos agregar el campo Año del Vehículo, ya sea como un entero o usando el módulo Date, lo que más acomode.
Y listo, con esto tienen lo básico para crear sus entidades con todos los campos que se requieran.
Ver mis entidades con Views
ECK es un módulo que está para quedarse y para ello la integración con Views debía ser obligatorio y es un hecho. Al crear entidades y sus bundles, automáticamente aparecerán como opción al crear una vista
Simplemente tendrán todas las opciones de imprimir campos, filtrar, ordenar, etc... Como si fuera un nodo
Así podremos desplegar nuestros vehículos en cualquier parte de nuestro sitio.
Rules
Rules es otro módulo extraordinario de Drupal y la comunicación con ECK también es un hecho. Al igual que en Views, creamos la entidad y automáticamente se generarán las opciones:
Usando Services
Si tu proyecto tiene que comunicarse con otros sistemas, usar Services es la mejor opción y ECK cuenta con un sub-módulo para poder integrarse con este módulo.
Al habilitarlo tendremos que editar nuestra entidad y seleccionar la opción Enable generic service for this entity
Una vez seleccionado y guardado, se generará el recurso Vehículo:
Con esto podremos hacer consultas http, si usamos Rest como servidor, para obtener la información de algún vehículo.
Features
Features nos permite exportar nuestras configuraciones a código e incluye nuestras entidades y bundles
Se tiene que tener en cuenta de que para exportar adecuadamente las entidades, se deben seleccionar las opciones en Bundles y Entity Types respectivamente, en caso contrario podría no funcionar la instalación en otro Drupal.
Personalizar los Path y otros
Esta sección es para quienes quieran crear sus propios módulos para cambiar la ruta por defecto que utiliza ECK para ver, crear, modificar y eliminar una entidad en particular. Por ejemplo para nuestro bundle Auto de la entidad Vehículo, nuestras rutas son:
- Ver un auto: /vehiculo/auto/[id]
- Crear Auto: /vehiculo/auto/add
- Editar Auto: /vehiculo/auto/[id]/edit
- Eliminar Auto: /vehiculo/auto/[id]/delete
Quizas quiera quitarles el /vehiculo/ de la ruta, para ello creamos nuestro módulo e invocamos el hook_entity_info_alter().
<?php /** * Implements hook_entity_info_alter(). */function mi_modulo_entity_info_alter(&$info) { if (isset($info['vehiculo'])) { foreach ($info['vehiculo']['bundles'] as $bundle => $config) { $crud = &$info['vehiculo']['bundles'][$bundle]['crud']; $crud = array( 'add' => array( 'path' => $bundle . '/add', ), 'edit' => array( 'path' => $bundle . '/%/edit', 'entity_id' => 1, ), 'delete' => array( 'path' => $bundle . '/%/delete', 'entity_id' => 1, ), 'view' => array( 'path' => $bundle . '/%', 'entity_id' => 1, ), ); } }}?>
Bueno aquí no solo se lo aplicará a mi bundle Auto sino que también a todos los bundles de Vehículo.
EDIT: Desde la versión 7.x-2.0-rc3 se debe usar el comodín "%eckentity" en vez de un simple "%", quedaría así:
<?php /** * Implements hook_entity_info_alter(). */function mi_modulo_entity_info_alter(&$info) { if (isset($info['vehiculo'])) { foreach ($info['vehiculo']['bundles'] as $bundle => $config) { $crud = &$info['vehiculo']['bundles'][$bundle]['crud']; $crud = array( 'add' => array( 'path' => $bundle . '/add', ), 'edit' => array( 'path' => $bundle . '/%eckentity/edit', 'entity_id' => 1, ), 'delete' => array( 'path' => $bundle . '/%eckentity/delete', 'entity_id' => 1, ), 'view' => array( 'path' => $bundle . '/%eckentity', 'entity_id' => 1, ), ); } }}?>
¿Porqué usar ECK/entidades y no simplemente Nodos?
Esto va a depender de muchas cosas, desde gustos personales hasta de aspectos técnicos. Pero tenemos que tener claro que el beneficio de usar ECK vs Nodos no es muy notorio en términos de flexibilidad y de resultado. Gran parte de los proyectos se podrían desarrollar con Nodos, eso esta claro y sería suficiente para muchos el seguir con esta modalidad. Pero pueden haber detalles que nos hagan pensar o dudar en no usar Nodos y si entidades propias. Por ejemplo yo identifico las siguientes:
- Conceptualmente hablando los nodos fueron diseñados para crear contenidos como publicaciones, noticias, etc. Por eso esta entidad cuenta con sistemas de revisiones, adjuntar comentarios, opción para publicar, entre otros. En cambio los usuarios, términos, productos, ordenes (pedidos) o vehículos cuentan con otra naturaleza. Entonces si desarrollas un sitio que contará con contenidos (y muchos) y al mismo tiempo se necesita mantener vehículos, quizás sea más cómodo usar ECK en este último, pero si tu sitio solo mantiene vehículos, entonces usar nodos podría ser suficiente ya que el concepto de contenidos no será usado en el sitio.
- Identificadores independientes. Usando solo la entidad Nodo la secuencia de los identificadores será compartido entre los distintos tipos de contenidos a medida que se vayan creando nodos. En cambio con entidades propias los identificadores serán independientes. No hay duda que si se quiere contar con identificadores consecutivos para usarlo en algún requerimiento (ej: Folio de documento, etc...), en nodos podrían solucionarse con un Field, sin embargo podría ser decisivo en términos de rendimiento.
- El campo título. Entiendo que existe el módulo Automatic Nodetitles el cual te puede solucionar el problema ocultando el campo. Sin embargo (y esto sería personal), si no necesito el campo título, el esconderlo y llenarlo con cualquier cosa no lo consideraría muy óptimo, a pesar de que esto no genera un impacto en el rendimiento (o por lo menos no lo suficiente como para preocuparse.).
Existe un artículo que se cuestiona lo mismo, me parece muy interesante lo que plantea.
Aún así es una opción, permitiéndonos mirar más a Drupal como una opción para desarrollar sistemas de información más complejos y no solo para administrar contenidos.
ECK y Panels (Nuevo)
Para usar Panels de una entidad creada con ECK deben instalar el módulo: ECK Page Manager. Una vez instalado deben ir a Page Manager y verán la lista de entidades, con el sufijo eck, para poder activarlos.
Últimos Comentarios