Druplicon

Entidades en Drupal: 1) Entender y crear una entidad

Hasta ahora no había tenido que hacer entidades desde cero, por A o por B siempre voy por otros caminos, pero hoy si que me tocó hacer una y vi bastante difusas las cosas.
Sabia la teoría de lo que era una entidad, un bundle y esas cosas, pero cuando me tuve que poner a hacer la entidad me las vi crudas un buen rato.

El problema se me dio básicamente en que los tutoriales y documentación que hay por ahí se centran en mostrar todo lo que se puede hacer de una sola vez, y bueno… no soy tan listo, me perdía en el código.

Pero ahora lo veo un poco mas claro y quiero explicarlo de la forma que me hubiera gustado que me lo transmitieran.

Voy a explicar en dos o tres artículos lo que hace falta saber sobre la implementacion de una entidad usando Entity API y tratando de aclarar bien bien donde acaba una funcionalidad y comienza otra.

Vamos allá.

Lo primero es lo primero. Estas leyendo esto posiblemente porque querés hacer entidades y entiendo que ya hiciste los deberes y conoces los conceptos básicos así que no los voy a explicar. En su lugar vamos a aprender haciendo mini módulos que implementen las distintas funcionalidades.

Creemos una entidad

Para crear una entidad solo necesitas dos cosas:

  1. Es schema (futura tabla en la DB) para guardar los datos mínimos y necesarios y cualquier otro dato que quieras que esté relacionado a las entidades que estas creando.
  2. Informar a Drupal que ese schema lo tiene que entender como una entidad.

TIP: Programaticamente hablando una entidad es un objeto. Eso es, nada mas que un objeto. No te preocupes de que tipo es, solo tenes que saber eso, que es un objeto.
Este objeto tiene una capa de persistencia que es el schema. De ahí que solo haga falta definir un schema e informar al sistema sobre la nueva entidad.

TIP2: Otra cosa que me descolocó hasta que me di cuenta de lo que acabo de comentar el el tip anterior es que: una entidad es un concepto abstracto y que las instancias (los objetos creados a partir de esa entidad) son los objetos reales y “tangibles”. Estas instancias son las que van a parar a la DB. Luego existen también los bundles pero ya nos vamos a complicar la vida con ese concepto en el próximos artículos.

Volviendo al tema:

Schema:

El schema no tiene nada de especial, lo único que necesita para funcionar es el identificador único para esta entidad (Compara esto al uid de un usuario, el nid de un nodo, etc.) y un field cualquiera *1.
Entonces, si necesitáramos una entidad mega simple, nuestro schema se vería así:

<?php
function entidad_simple_schema() {
  $schema['nombre_de_la_tabla'] = array(
    'description' => 'Almacena instancias de la entidad',
    'fields' => array(
      'entityID' => array(
        'type' => 'serial',
        'not null' => TRUE,
        'description' => 'Identidicador unico de esta entidad.',
      ),
      'nombre' => array(
        'description' => 'Nombre de la instancia',
        'type' => 'varchar',
        'length' => 100,
        'not null' => TRUE,
        'default' => '',
      ),
    ),
    'primary key' => array('entityID'),
  );
  return $schema;
}

Informar a Drupal:

Para terminar de crear la entidad vamos a informar a Drupal usando el hook_entity_info()

<?php
function entidad_simple_entity_info() {
  $return = array(
    'laEntidad' => array(
      'label' => t('La entidad'),
      'controller class' => 'EntityAPIController',
      'base table' => 'nombre_de_la_tabla',
      'entity keys' => array('id' => 'entityID'),
    ),
  );
  return $return;
}

Ese codigo que acabo de poner es la unidad mínima de información que necesita este hook para crear correctamente tu entidad.
Este array es bastante claro:

laEntidad Es el nombre de tu entidad, no tiene nada que ver con el nombre de la tabla que declaraste en el schema y puede ser el nombre que mas te guste.
label Es la versión legible del nombre de tu entidad.
controller class Es el nombre de la clase que se va a hacer cargo de gestionar todo lo relacionado con tu entidad. puntualmente “EntityAPIController” es la clase que nos proporciona Entity API, y es una versión bastante mas completa que la que nos proporciona Drupal en su core (DrupalDefaultEntityController).
Es interesante este punto así que profundizo un poco mas:
Sin entrar mucho en detalle, “controller class” designa al que se va a encargar de hacer CRUD sobre tu entidad, esto es, el que se va a encargar la lógica para insertar registros en la DB, obtenerlos, actualizarlos y borrarlos.
En nuestro caso usamos la clase proporcionada por Entity API porque esta incorpora un montón de funcionalidades que SON BÁSICAS y que la clase que trae Drupal no incluye. Esto es harina de otro costal y no vamos a darle mas vueltas. solo quería que te quede claro el rol que ocupa esta clase.
base table Bueno, es el schema que definimos antes, nada mas.
entity keys En el schema teníamos que definir un identificador para las instancias de las entidades que se creen, pues es ese valor.

Acá te dejo el código anterior metido en un modulo para que lo pruebes.

Descargar ejemplo

Aquí concluimos este articulo, el próximo vamos a hacer un modulo que haga algo con la entidad que acabamos de crear, que este modulo por si solo no hace nada.

Chau!

*1: El field cualquiera es porque internamente cuando se hace un drupal_write_record() si no tiene aunque sea un field, descarta la operación ¬¬. En este ejemplo hice un field llamado “nombre” que nos va a venir bien.

Comentarios

  1. Pingback: Entidades en Drupal: 2) Trabajar con la entidad | Capy

  2. Giovanni

    Marco era para dejarte un saludo y felicitarte por la facilidad con la que explicas como crear nuestras propias entidades.. Llevo un rato tratando de entender como funciona. Tengo una duda si me puedes ayudar Marco.. Como hago para hacer la parte para editar o agregar contenido a esas entidades..

    De ante manó muchas gracias.

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>