diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..5f8ca4a --- /dev/null +++ b/composer.json @@ -0,0 +1,12 @@ +{ + "name": "drupal/hal-hal", + "description": "Hypermedia Application Language (HAL)", + "type": "drupal-module", + "license": "GPL-2.0-or-later", + "require": { + "drupal/core": "^9 || ^10" + }, + "require-dev": { + "drupal/entity_reference_revisions": "1.x-dev" + } +} diff --git a/hal.services.yml b/hal.services.yml index 38ffb22..9bb431e 100644 --- a/hal.services.yml +++ b/hal.services.yml @@ -22,6 +22,12 @@ services: tags: # Priority must be higher than serializer.normalizer.field_item.hal. - { name: normalizer, priority: 20 } + serializer.normalizer.entity_reference_revisions_item.hal: + class: Drupal\hal\Normalizer\EntityReferenceRevisionItemNormalizer + arguments: [ '@hal.link_manager', '@serializer.entity_resolver', '@entity_type.manager' ] + # Priority must be higher than serializer.normalizer.entity_reference_item.hal. + tags: + - { name: normalizer, priority: 20 } serializer.normalizer.entity.hal: class: Drupal\hal\Normalizer\ContentEntityNormalizer arguments: ['@hal.link_manager', '@entity_type.manager', '@module_handler', '@entity_type.repository', '@entity_field.manager'] diff --git a/src/Normalizer/EntityReferenceRevisionItemNormalizer.php b/src/Normalizer/EntityReferenceRevisionItemNormalizer.php new file mode 100644 index 0000000..cb55771 --- /dev/null +++ b/src/Normalizer/EntityReferenceRevisionItemNormalizer.php @@ -0,0 +1,40 @@ +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/tests/src/Functional/entity_reference_revisions/EntityReferenceRevisionsNormalizerTest.php b/tests/src/Functional/entity_reference_revisions/EntityReferenceRevisionsNormalizerTest.php new file mode 100644 index 0000000..38a10a8 --- /dev/null +++ b/tests/src/Functional/entity_reference_revisions/EntityReferenceRevisionsNormalizerTest.php @@ -0,0 +1,115 @@ +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', + 'create entity_revisions 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->assertSession()->pageTextContains('Saved Entity reference revisions configuration.'); + + // Create an article. + $title = $this->randomMachineName(); + $edit = array( + 'title[0][value]' => $title, + 'body[0][value]' => 'Revision 1', + ); + $this->drupalGet('node/add/article'); + $this->submitForm($edit, 'Save'); + $this->assertSession()->pageTextContains($title); + $this->assertSession()->pageTextContains('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->drupalGet('node/add/entity_revisions'); + $this->submitForm($edit, 'Save'); + $this->assertSession()->pageTextContains('Entity revisions Entity reference revision content has been created.'); + $err_node = $this->drupalGetNodeByTitle($err_title); + + $this->assertSession()->pageTextContains($err_title); + $this->assertSession()->pageTextContains($title); + $this->assertSession()->pageTextContains('Revision 1'); + + // Create 2nd revision of the article. + $edit = array( + 'body[0][value]' => 'Revision 2', + 'revision' => TRUE, + ); + $this->drupalGet('node/' . $node->id() . '/edit'); + $this->submitForm($edit, 'Save'); + $serializer = $this->container->get('serializer'); + $normalized = $serializer->normalize($err_node, 'hal_json'); + $request = \Drupal::request(); + $link_domain = $request->getSchemeAndHttpHost() . $request->getBasePath(); + $this->assertEquals($err_node->field_entity_reference_revisions->target_revision_id, $normalized['_embedded'][$link_domain . '/rest/relation/node/entity_revisions/field_entity_reference_revisions'][0]['target_revision_id']); + $new_err_node = $serializer->denormalize($normalized, Node::class, 'hal_json'); + $this->assertEquals($err_node->field_entity_reference_revisions->target_revision_id, $new_err_node->field_entity_reference_revisions->target_revision_id); + } + +}