I'm looking for help in gentle/simple terms for how to add revision information to my custom entities. This is maybe my fifth or sixth attempt to do this and every time I get lost and overwhelmed by all the info in the various online knowledgebases about the various ways of doing things for various iterations of Drupal.
I've used the EntityAPIController
(sites/all/modules/entity/includes/entity.controller.inc) from the Entity API module and seen that this has the following method:
/**
* Saves an entity revision.
*
* @param Entity $entity
* Entity revision to save.
*/
protected function saveRevision($entity) {
// Convert the entity into an array as it might not have the same properties
// as the entity, it is just a raw structure.
$record = (array) $entity;
// File fields assumes we are using $entity->revision instead of
// $entity->is_new_revision, so we also support it and make sure it's set to
// the same value.
$entity->is_new_revision = !empty($entity->is_new_revision) || !empty($entity->revision) || $entity->is_new;
$entity->revision = &$entity->is_new_revision;
$entity->{$this->defaultRevisionKey} = !empty($entity->{$this->defaultRevisionKey}) || $entity->is_new;
// When saving a new revision, set any existing revision ID to NULL so as to
// ensure that a new revision will actually be created.
if ($entity->is_new_revision && isset($record[$this->revisionKey])) {
$record[$this->revisionKey] = NULL;
}
if ($entity->is_new_revision) {
drupal_write_record($this->revisionTable, $record);
$update_default_revision = $entity->{$this->defaultRevisionKey};
}
else {
drupal_write_record($this->revisionTable, $record, $this->revisionKey);
// @todo: Fix original entity to be of the same revision and check whether
// the default revision key has been set.
$update_default_revision = $entity->{$this->defaultRevisionKey} && $entity->{$this->revisionKey} != $entity->original->{$this->revisionKey};
}
// Make sure to update the new revision key for the entity.
$entity->{$this->revisionKey} = $record[$this->revisionKey];
// Mark this revision as the default one.
if ($update_default_revision) {
db_update($this->entityInfo['base table'])
->fields(array($this->revisionKey => $record[$this->revisionKey]))
->condition($this->idKey, $entity->{$this->idKey})
->execute();
}
return $entity->is_new_revision ? SAVED_NEW : SAVED_UPDATED;
}
But with all the various sources of information out there on developing for Drupal I'm in a total tangle with my understanding. Am I just supposed to say "is revisionable" this link and others kind of gloss over it as though all one needs to do is set the "revision table"
and "entity keys" "revision"
element in the hook_entity_info
implementation
This is where I'm unstuck - just as with node
and node_revision
in the db, can't entity and entity revision tables be different? Surely we need to overwrite something in one of the entity/controller/wrapper classes because it's not as simple as just copying all fields from one db table to another and auto incrementing a version id?
This post has lots of info, but I started reading through the links under "documentation" and I'm worried that I might be looking at some module which has hijacked the term revision in some higher layer.