diff --git a/entityreference.install b/entityreference.install index 4e248ef..2f79947 100644 --- a/entityreference.install +++ b/entityreference.install @@ -18,11 +18,17 @@ function entityreference_field_schema($field) { $schema = array( 'columns' => array( 'target_id' => array( - 'description' => 'The id of the target entity.', + 'description' => 'The ID of the target entity.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), + 'revision_id' => array( + 'description' => 'The revision ID of the target entity.', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => FALSE, + ), ), 'indexes' => array( 'target_id' => array('target_id'), @@ -161,4 +167,34 @@ function entityreference_update_7002() { 'not null' => TRUE, )); } -} \ No newline at end of file +} + +/** + * Add "revision-id" to the field schema. + */ +function entityreference_update_7003() { + if (!module_exists('field_sql_storage')) { + return; + } + foreach (field_info_fields() as $field_name => $field) { + if ($field['type'] != 'entityreference' || $field['storage']['type'] !== 'field_sql_storage') { + // Not an entity reference field. + continue; + } + + // Add the new column. + $field = field_info_field($field_name); + $table_name = _field_sql_storage_tablename($field); + $revision_name = _field_sql_storage_revision_tablename($field); + + $spec = array( + 'description' => 'The revision ID of the target entity.', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => FALSE, + ); + + db_add_field($table_name, $field_name . '_revision_id', $spec); + db_add_field($revision_name, $field_name . '_revision_id', $spec); + } +} diff --git a/entityreference.module b/entityreference.module index 5f03c5b..cc30a34 100644 --- a/entityreference.module +++ b/entityreference.module @@ -1150,40 +1150,56 @@ function entityreference_field_formatter_settings_summary($field, $instance, $vi */ function entityreference_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) { $target_ids = array(); + $revision_ids = array(); // Collect every possible entity attached to any of the entities. foreach ($entities as $id => $entity) { foreach ($items[$id] as $delta => $item) { - if (isset($item['target_id'])) { + if (!empty($item['revision_id'])) { + $revision_ids[] = $item['revision_id']; + } + elseif (!empty($item['target_id'])) { $target_ids[] = $item['target_id']; } } } + $target_type = $field['settings']['target_type']; + + $target_entities = array(); + if ($target_ids) { - $target_entities = entity_load($field['settings']['target_type'], $target_ids); + $target_entities = entity_load($target_type, $target_ids); } - else { - $target_entities = array(); + + if ($revision_ids) { + // We need to load the revisions one by-one. + foreach ($revision_ids as $revision_id) { + $entity = entity_revision_load($target_type, $revision_id); + list($id) = entity_extract_ids($target_type, $entity); + // Use the revision-ID in the key. + $identifier = $id . ':' . $revision_id; + $target_entities[$identifier] = $entity; + } } - // Iterate through the fieldable entities again to attach the loaded data. + // Iterate through the fieldable entities again to attach the loaded + // data. foreach ($entities as $id => $entity) { $rekey = FALSE; - foreach ($items[$id] as $delta => $item) { - // Check whether the referenced entity could be loaded. - if (isset($target_entities[$item['target_id']])) { - // Replace the instance value with the term data. - $items[$id][$delta]['entity'] = $target_entities[$item['target_id']]; - // Check whether the user has access to the referenced entity. - $items[$id][$delta]['access'] = entity_access('view', $field['settings']['target_type'], $target_entities[$item['target_id']]); - } - // Otherwise, unset the instance value, since the entity does not exist. - else { - unset($items[$id][$delta]); + // If we have a revision-ID, the key uses it as-well. + $identifier = !empty($item['revision_id']) ? $item['target_id'] . ':' . $item['revision_id'] : $item['target_id']; + if (!isset($target_entities[$identifier])) { + // The entity no longer exists, so remove the key. $rekey = TRUE; + unset($items[$id][$delta]); + continue; } + + $entity = $target_entities[$identifier]; + $items[$id][$delta]['entity'] = $entity; + $items[$id][$delta]['access'] = entity_access('view', $target_type, $entity); } if ($rekey) { diff --git a/plugins/selection/EntityReference_SelectionHandler_Generic.class.php b/plugins/selection/EntityReference_SelectionHandler_Generic.class.php index 2d1c5d7..9a620c0 100644 --- a/plugins/selection/EntityReference_SelectionHandler_Generic.class.php +++ b/plugins/selection/EntityReference_SelectionHandler_Generic.class.php @@ -149,6 +149,17 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select ); } + // Provide an option to lock the entity reference to the latest revision if + // the entity supports it. + if (!empty($entity_info['revision table'])) { + $form['lock_revision'] = array( + '#type' => 'checkbox', + '#title' => t('Lock the field to the most current revision'), + '#default_value' => !empty($field['settings']['handler_settings']['lock_revision']) ? TRUE : FALSE, + '#description' => t('When this is enabled, the reference will track the latest revision to that entity when this field is saved. This, combined with e.g. the Workbench Moderation module, can be used to provide limited workflow functionality around the referenced content.', array('!url' => 'http://drupal.org/project/workbench_moderation')) + ); + } + return $form; } diff --git a/plugins/selection/EntityReference_SelectionHandler_Views.class.php b/plugins/selection/EntityReference_SelectionHandler_Views.class.php index 1b036a7..059c1e2 100644 --- a/plugins/selection/EntityReference_SelectionHandler_Views.class.php +++ b/plugins/selection/EntityReference_SelectionHandler_Views.class.php @@ -68,6 +68,18 @@ class EntityReference_SelectionHandler_Views implements EntityReference_Selectio )) . '

', ); } + + // Provide an option to lock the entity reference to the latest revision + // if the entity supports it. + if (!empty($entity_info['revision table'])) { + $form['lock_revision'] = array( + '#type' => 'checkbox', + '#title' => t('Lock the field to the most current revision'), + '#default_value' => !empty($field['settings']['handler_settings']['lock_revision']) ? TRUE : FALSE, + '#description' => t('When this is enabled, the reference will track the latest revision to that entity when this field is saved. This, combined with e.g. the Workbench Moderation module, can be used to provide limited workflow functionality around the referenced content.', array('!url' => 'http://drupal.org/project/workbench_moderation')) + ); + } + return $form; }