Archivo de la etiqueta: Entities

Druplicon

Drupal: Creando entidades definidas en ECK programáticamente.

Les presento ECK a quien no lo conozca todavía. ECK (Entity Construction Kit) a craso modo es una interfaz para crear entidades por medio de una UI. Además de permitirte crear tipos de entidad, te permite crear sus bundles, gestionar sus fields, propiedades, y para rematar también te da todas las herramientas para hacer CRUD. Si quieren saber mas en profundidad sobre este modulo pueden leer su documentacion y tambien les recomiendo este video que lo explica bastante mejor que yo.

Al lío. Una vez que creas tipos de entidades con ECK podés crear entidades nuevas de ese tipo usando su UI, pero también podés crearlas programáticamente:
Digamos que creaste un tipo de entidad llamada “Contact” [contact] y un bundle llamado “contact_simple”.

Para crear una nueva entidad “contact_simple” haz:

<?php
  $entity_type = "contact";
  $entity = entity_create($entity_type, array('type' => "contact_simple"));
  $wrapper = entity_metadata_wrapper($entity_type, $entity);

Ahora que tenes la entidad ya podes tocar tanto sus propiedades como los field que tenga attachados:

<?php
//Propiedades
$wrapper->uid = 9;
//Fields
$wrapper->field_full_name = "John doe";

Cuando acabes de toquetear la entidad, guardala y listo.

<?php
$wrapper->save();

Chau!

Druplicon

Entidades en Drupal: 2) Trabajar con la entidad

En el capitulo anterior definimos una entidad, pero solo eso, no hacia nada. Ahora vamos a ver como interactuar con ella.

Hoy vamos a conocer las 5 operaciones mas comunes que se le suelen hacer a una entidad:

  • crear
  • guardar
  • cargar
  • actualizar
  • borrar

Tenemos dos formas de hacer esto. una es usando funciones y otra usando el controlador directamente. En este articulo vamos a usar el controlador.
Las funciones son solo otra forma de tratar con las entidades. y queda en el gusto de cada uno usar controlador o funciones.

NOTA sobre las funciones para entidades: Drupal provee entity_load(), entity_label() y entity_uri() mientras que Entity API agrega las que faltan: entity_save(), entity_create(), entity_delete(), entity_revision_delete(), entity_view() y entity_access() entre otras.
Este es uno de los motivos por el cual se creó Entity API. Faltaban funcionalidades a la hora de tratar con entidades.

Crear

<?php
$datos = array('nombre' => "ejemplo");
$controller = entity_get_controller('laEntidad');
$entidad = $controller->create($datos);

Es simple de ver. Cargamos el controlador de la entidad y creamos una.
Si cabe aclaremos un poco “$controller = entity_get_controller(‘laEntidad’);“: Pedimos a Drupal que nos de el controlador de la entidad “laEntidad”.

NOTA: entity_get_controller() instancia el controlador de nuestra entidad y lo cachea, así que pueden pedirlo una o mil veces, que no va a impactar en la performance del request actual.

Guardar

<?php
//retorna los mismos estados que drupal_write_record()
$saved = entity_get_controller('laEntidad')->save($entidad);

La única diferencia con el caso anterior es que en lugar de asignar el controlador a una variable, la hemos usado al vuelo.
$entidad es el objeto que creamos antes.

Cargar

<?php
$entities = entity_get_controller('laEntidad')->load($ids);

->load() siempre nos devuelve un array
$ids es un array de entityID.

Actualizar

Supongamos que sabemos que el ID de nuestra entidad es el 11:

<?php
$entities = entity_get_controller('laEntidad')->load(array(11));
$entidad = $entities[11];
$entidad->nombre = "nombre cambiado";
entity_get_controller('laEntidad')->save($entidad);

Borrar

<?php
entity_get_controller('laEntidad')->delete(array(1, 2, 3, 4));

Donde el array que se le pasa es un listado de los entityID que queremos borrar.
NOTA: el método ->delete() no devuelve nada.

Eso es todo. Para acabar queda comentar que el controlador que nos proporciona Entity API tiene mas métodos bastante útiles y que les recomiendo revisar. Estos están en el archivo “entity.controller.inc” del modulo (busquen la clase “EntityAPIController”).

Chau!

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.