diff --git a/src/Normalizer/EntityReferenceRevisionItemNormalizer.php b/src/Normalizer/EntityReferenceRevisionItemNormalizer.php index 2b3ff7e..e278f84 100644 --- a/src/Normalizer/EntityReferenceRevisionItemNormalizer.php +++ b/src/Normalizer/EntityReferenceRevisionItemNormalizer.php @@ -7,6 +7,7 @@ namespace Drupal\entity_reference_revisions\Normalizer; +use Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem; use Drupal\hal\Normalizer\EntityReferenceItemNormalizer; /** @@ -19,17 +20,29 @@ class EntityReferenceRevisionItemNormalizer extends EntityReferenceItemNormalize * * @var string */ - protected $supportedInterfaceOrClass = 'Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem'; + protected $supportedInterfaceOrClass = EntityReferenceRevisionsItem::class; /** - * Overrides \Drupal\hal\Normalizer\FieldItemNormalizer::constructValue(). + * {@inheritdoc} */ protected function constructValue($data, $context) { $value = parent::constructValue($data, $context); if ($value) { - $value['target_revision_id'] = $value['target_id']; + $value['target_revision_id'] = $data['target_revision_id']; } return $value; } + /** + * {@inheritdoc} + */ + public function normalize($field_item, $format = NULL, array $context = array()) { + $data = parent::normalize($field_item, $format, $context); + $field_name = $field_item->getParent()->getName(); + $entity = $field_item->getEntity(); + $field_uri = $this->linkManager->getRelationUri($entity->getEntityTypeId(), $entity->bundle(), $field_name, $context); + $data['_embedded'][$field_uri][0]['target_revision_id'] = $field_item->target_revision_id; + return $data; + } + } diff --git a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php index 147715f..fede7ca 100644 --- a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php +++ b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php @@ -243,7 +243,7 @@ class EntityReferenceRevisionsItem extends EntityReferenceItem implements Option */ public function preSave() { parent::preSave(); - $this->target_revision_id = $this->values['target_revision_id']; + $this->target_revision_id = $this->entity->getRevisionId(); } /** @@ -319,13 +319,17 @@ class EntityReferenceRevisionsItem extends EntityReferenceItem implements Option */ public function delete() { parent::delete(); - if ($this->entity && $this->entity->getEntityType()->get('entity_revision_parent_type_field') && $this->entity->getEntityType()->get('entity_revision_parent_id_field')) { + if ($this->entity && $this->entity->getEntityType() + ->get('entity_revision_parent_type_field') && $this->entity->getEntityType() + ->get('entity_revision_parent_id_field') + ) { $this->entity->delete(); } -} - /** - * {@inheritdoc} - */ + } + + /** + * {@inheritdoc} + */ public static function onDependencyRemoval(FieldDefinitionInterface $field_definition, array $dependencies) { return FALSE; } diff --git a/src/Tests/EntityReferenceRevisionsCompositeTest.php b/src/Tests/EntityReferenceRevisionsCompositeTest.php index f4df2c5..ef65a33 100644 --- a/src/Tests/EntityReferenceRevisionsCompositeTest.php +++ b/src/Tests/EntityReferenceRevisionsCompositeTest.php @@ -1,7 +1,7 @@ drupalCreateContentType(array('type' => 'entity_revisions', 'name' => 'Entity revisions')); + $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article')); + // Place the breadcrumb, tested in fieldUIAddNewField(). + $this->drupalPlaceBlock('system_breadcrumb_block'); + } + + /** + * Tests the entity reference revisions configuration. + */ + public function testEntityReferenceRevisions() { + $admin_user = $this->drupalCreateUser(array( + 'administer site configuration', + 'administer nodes', + 'create article content', + 'administer content types', + 'administer node fields', + 'administer node display', + 'administer node form display', + 'edit any article content', + )); + $this->drupalLogin($admin_user); + // Create entity reference revisions field. + static::fieldUIAddNewField('admin/structure/types/manage/entity_revisions', 'entity_reference_revisions', 'Entity reference revisions', 'entity_reference_revisions', array('settings[target_type]' => 'node', 'cardinality' => '-1'), array('settings[handler_settings][target_bundles][article]' => TRUE)); + $this->assertText('Saved Entity reference revisions configuration.'); + + // Create an article. + $title = $this->randomMachineName(); + $edit = array( + 'title[0][value]' => $title, + 'body[0][value]' => 'Revision 1', + 'revision' => TRUE, + ); + $this->drupalPostForm('node/add/article', $edit, t('Save and publish')); + $this->assertText($title); + $this->assertText('Revision 1'); + $node = $this->drupalGetNodeByTitle($title); + + // Create entity revisions content that includes the above article. + $err_title = 'Entity reference revision content'; + $edit = array( + 'title[0][value]' => $err_title, + 'field_entity_reference_revisions[0][target_id]' => $node->label() . ' (' . $node->id() . ')', + ); + $this->drupalPostForm('node/add/entity_revisions', $edit, t('Save and publish')); + $this->assertText('Entity revisions Entity reference revision content has been created.'); + $err_node = $this->drupalGetNodeByTitle($err_title); + + $this->assertText($err_title); + $this->assertText($title); + $this->assertText('Revision 1'); + + // Create 2nd revision of the article. + $edit = array( + 'body[0][value]' => 'Revision 2', + 'revision' => TRUE, + ); + $this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save and keep published')); + $serializer = $this->container->get('serializer'); + $normalized = $serializer->normalize($err_node, 'hal_json'); + $this->assertEqual($err_node->field_entity_reference_revisions->target_revision_id, $normalized['_embedded']['http://d8.dev/rest/relation/node/entity_revisions/field_entity_reference_revisions'][0]['target_revision_id']); + $new_err_node = $serializer->denormalize($normalized, Node::class, 'hal_json'); + $this->assertEqual($err_node->field_entity_reference_revisions->target_revision_id, $new_err_node->field_entity_reference_revisions->target_revision_id); + } + +}