'base table' => 'relation',
'revision table' => 'relation_revision',
'fieldable' => TRUE,
- 'controller class' => 'DrupalDefaultEntityController',
+ 'controller class' => 'RelationController',
'save callback' => 'relation_save',
'creation callback' => 'relation_rules_create',
'deletion callback' => 'relation_delete',
* @return
* The new relation id.
*/
-function relation_save($relation) {
+function relation_save($relation, $account = NULL) {
+ if (!isset($account)) {
+ $account = $GLOBALS['user'];
+ }
+ global $user;
try {
field_attach_validate('relation', $relation);
}
field_attach_presave('relation', $relation);
module_invoke_all('entity_presave', $relation, 'relation');
unset($relation->vid);
+ $temp_uid = $relation->uid;
+ $relation->uid = $account->uid;
drupal_write_record('relation_revision', $relation);
+ $relation->uid = $temp_uid;
drupal_write_record('relation', $relation, $keys);
if ($relation->is_new) {
db_update('relation_revision')
return $type->label;
}
}
+
+/**
+ * Controller class for relation.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for relation revisions, very similar to what's being done
+ * with nodes.
+ */
+class RelationController extends DrupalDefaultEntityController {
+
+ protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+ // Ensure that uid is taken from the {relation} table
+ $query = parent::buildQuery($ids, $conditions, $revision_id);
+ $fields =& $query->getFields();
+ $fields['uid']['table'] = 'base';
+ $query->addField('revision', 'uid', 'revision_uid');
+ $fields['changed']['table'] = 'base';
+ $query->addField('revision', 'changed', 'changed');
+ return $query;
+ }
+}
$this->assertTrue(array_key_exists($rid, $revision), 'Relation revision created.');
}
}
+
+ /**
+ * Tests relation revisions.
+ */
+ function testRelationRevision() {
+ $first_user = $this->drupalCreateUser(array('edit relations'));
+ $second_user = $this->drupalCreateUser(array('edit relations'));
+
+ $this->drupalLogin($first_user);
+ $relation = relation_create($this->relation_type_octopus, $this->endpoints_4, $first_user);
+ $rid = relation_save($relation, $first_user);
+ $this->assertEqual($relation->uid, $first_user->uid);
+ $vid = $relation->vid;
+
+ // Relation should still be owned by the first user
+ $this->drupalLogin($second_user);
+ $relation = relation_load($rid);
+ relation_save($relation, $second_user);
+ $this->assertEqual($relation->uid, $first_user->uid);
+
+ // Relation revision authors should not be identical though.
+ $first_revision = relation_load($rid, $vid);
+ $second_revision = relation_load($rid, $relation->vid);
+ $this->assertNotIdentical($first_revision->revision_uid, $second_revision->revision_uid, 'Each revision has a distinct user.');
+ }
}