diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php index dbed344..d7ec048 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php @@ -7,6 +7,7 @@ use Drupal\Component\Utility\SortArray; use Drupal\Core\Entity\EntityDisplayRepositoryInterface; use Drupal\Core\Entity\EntityTypeBundleInfoInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Entity\RevisionableInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; @@ -23,7 +24,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface; * id = "inline_entity_form_complex", * label = @Translation("Inline entity form - Complex"), * field_types = { - * "entity_reference" + * "entity_reference", + * "entity_reference_revisions", * }, * multiple_values = true * ) diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormSimple.php b/src/Plugin/Field/FieldWidget/InlineEntityFormSimple.php index 2944ea6..48c2874 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormSimple.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormSimple.php @@ -17,7 +17,8 @@ use Drupal\Core\Render\Element; * id = "inline_entity_form_simple", * label = @Translation("Inline entity form - Simple"), * field_types = { - * "entity_reference" + * "entity_reference", + * "entity_reference_revisions", * }, * multiple_values = false * ) diff --git a/src/Tests/InlineEntityFormRevisionTest.php b/src/Tests/InlineEntityFormRevisionTest.php new file mode 100644 index 0000000..42d1186 --- /dev/null +++ b/src/Tests/InlineEntityFormRevisionTest.php @@ -0,0 +1,160 @@ +user = $this->createUser([ + 'create ief_test_revisions_complex content', + 'edit any ief_test_revisions_complex content', + 'delete any ief_test_revisions_complex content', + 'create ief_test_custom content', + 'edit any ief_test_custom content', + 'delete any ief_test_custom content', + 'create ief_test_complex content', + 'edit any ief_test_complex content', + 'delete any ief_test_complex content', + 'edit any ief_test_nested1 content', + 'edit any ief_test_nested2 content', + 'edit any ief_test_nested3 content', + 'view own unpublished content', + 'administer content types', + ]); + $this->drupalLogin($this->user); + + $this->formContentAddUrl = 'node/add/ief_test_revisions_complex'; + $this->nodeStorage = $this->container->get('entity_type.manager')->getStorage('node'); + } + + /** + * Tests multiple revision scenarios. + * + * When I create a new node with an entity reference, and they have revisions + * enabled, then I should be able to add the revision information. Then the + * revision and its child should be kept in sync. + */ + public function testInlineEntityFormRevision() { + + // Enable revisioning. + $this->enableRevisioning(['ief_test_revisions_complex', 'ief_reference_type']); + + // Initial node. + $edit = [ + 'title[0][value]' => 'Parent Title', + 'field_entity_ref_revision[form][inline_entity_form][title][0][value]' => 'Some reference', + ]; + + $this->drupalPostForm($this->formContentAddUrl, [], t('Add new node')); + + // Actually save the node. + $this->drupalPostForm(NULL, $edit, t('Save')); + + // Double check that we got a success message. + $this->assertText($edit['title[0][value]'] . ' has been created', 'Parent node title found.'); + + // When I edit the node and its child. + // Get and store the node and its edit path. + $node = $this->drupalGetNodeByTitle($edit['title[0][value]']); + $this->assertTrue($node, 'Node found in database.'); + $node_edit_url = 'node/' . $node->id() . '/edit'; + + // Go to the edit page. + $this->drupalGet($node_edit_url); + $this->drupalPostAjaxForm(NULL, [], $this->getButtonName('//input[@type="submit" and @value="Edit" and @data-drupal-selector="edit-field-entity-ref-revision-entities-0-actions-ief-entity-edit"]')); + + // New content. + $edit = [ + 'field_entity_ref_revision[form][inline_entity_form][entities][0][form][title][0][value]' => 'Some reference revision', + ]; + + // New parent content. + $parent_edit = [ + 'title[0][value]' => 'Parent revision Title', + 'revision_log[0][value]' => 'First revision log message', + ]; + + // And I submit the inline form. + $this->drupalPostAjaxForm(NULL, $edit, $this->getButtonName('//input[@type="submit" and @value="Update node" and @data-drupal-selector="edit-field-entity-ref-revision-form-inline-entity-form-entities-0-form-actions-ief-edit-save"]')); + $this->assertResponse(200, 'Creating node via inline form was successful.'); + + // And I submit the main form. + $this->drupalPostForm(NULL, $parent_edit, t('Save')); + + // Then I should see a success message. + $this->assertText($parent_edit['title[0][value]'] . ' has been updated', 'Parent node title ound.'); + + // And load the node. + $node_revision = $this->drupalGetNodeByTitle($parent_edit['title[0][value]'], TRUE); + $this->assertTrue($node_revision, 'Node found in database.'); + + // Then the node should have 2 different revision id's. + $this->assertNotEqual($node->getRevisionId(), $node_revision->getRevisionId(), 'Node versions ave different revision ids.'); + + // Then the revision titles should be different. + $this->assertNotEqual($node->getTitle(), $node_revision->getTitle(), 'Node revisions have ifferent log messages.'); + + // Then the referenced items should have their revisions. + $original_child = $node->get('field_entity_ref_revision'); + $revision_child = $node_revision->get('field_entity_ref_revision'); + + // And they should not be equal. + $this->assertNotEqual($original_child->get(0)->getValue(), $revision_child->get(0)->getValue()); + $this->assertEqual($original_child->get(0)->getValue()['target_id'], $revision_child->get(0)->getValue()['target_id']); + $this->assertTrue($original_child->get(0)->getValue()['target_revision_id'] < $revision_child->get(0)->getValue()['target_revision_id']); + } + + /** + * Enables revisioning for a given node type. + * + * @param array $entity_types + * The entity types to enable revisioning for. + */ + protected function enableRevisioning($entity_types) { + foreach ($entity_types as $type) { + $this->drupalGet('admin/structure/types/manage/' . $type); + $this->drupalPostForm(NULL, ['options[revision]' => TRUE], t('Save content type')); + } + } + +} diff --git a/src/WidgetSubmit.php b/src/WidgetSubmit.php index 98921a4..6168929 100644 --- a/src/WidgetSubmit.php +++ b/src/WidgetSubmit.php @@ -2,6 +2,7 @@ namespace Drupal\inline_entity_form; +use Drupal\Core\Entity\RevisionableInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\inline_entity_form\Element\InlineEntityForm; @@ -46,6 +47,19 @@ class WidgetSubmit { /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ $entity = $entity_item['entity']; $handler = InlineEntityForm::getInlineFormHandler($entity->getEntityTypeId()); + if ($entity instanceof RevisionableInterface && $entity->getEntityType()->isRevisionable()) { + $entity->setNewRevision(); + if (in_array('Drupal\node\NodeInterface', class_implements($entity))) { + $entity->setRevisionCreationTime(REQUEST_TIME); + // If a new revision is created, save the current user as revision author. + $entity->setRevisionAuthorId(\Drupal::currentUser()->id()); + } + elseif (in_array('Drupal\entity\Revision\EntityRevisionLogInterface', class_implements($entity))) { + // If a new revision is created, save the current user as revision author. + $entity->setRevisionUserId(\Drupal::currentUser()->id()); + $entity->setRevisionCreationTime(REQUEST_TIME); + } + } $handler->save($entity); $widget_state['entities'][$delta]['needs_save'] = FALSE; } diff --git a/tests/modules/inline_entity_form_test/config/optional/core.entity_form_display.node.ief_test_revisions_complex.default.yml b/tests/modules/inline_entity_form_test/config/optional/core.entity_form_display.node.ief_test_revisions_complex.default.yml new file mode 100644 index 0000000..3eca1e9 --- /dev/null +++ b/tests/modules/inline_entity_form_test/config/optional/core.entity_form_display.node.ief_test_revisions_complex.default.yml @@ -0,0 +1,66 @@ +langcode: en +status: true +dependencies: + config: + - field.field.node.ief_test_revisions_complex.field_entity_ref_revision + - node.type.ief_test_revisions_complex + module: + - entity_reference_revisions + - inline_entity_form + - path + - text +id: node.ief_test_revisions_complex.default +targetEntityType: node +bundle: ief_test_revisions_complex +mode: default +content: + created: + type: datetime_timestamp + weight: 10 + settings: { } + third_party_settings: { } + field_entity_ref_revision: + weight: 32 + settings: + form_mode: default + label_singular: '' + label_plural: '' + allow_new: true + match_operator: CONTAINS + override_labels: false + allow_existing: false + third_party_settings: { } + type: inline_entity_form_complex + path: + type: path + weight: 30 + settings: { } + third_party_settings: { } + promote: + type: boolean_checkbox + settings: + display_label: true + weight: 15 + third_party_settings: { } + sticky: + type: boolean_checkbox + settings: + display_label: true + weight: 16 + third_party_settings: { } + title: + type: string_textfield + weight: -5 + settings: + size: 60 + placeholder: '' + third_party_settings: { } + uid: + type: entity_reference_autocomplete + weight: 5 + settings: + match_operator: CONTAINS + size: 60 + placeholder: '' + third_party_settings: { } +hidden: { } diff --git a/tests/modules/inline_entity_form_test/config/optional/core.entity_view_display.node.ief_test_revisions_complex.default.yml b/tests/modules/inline_entity_form_test/config/optional/core.entity_view_display.node.ief_test_revisions_complex.default.yml new file mode 100644 index 0000000..bfe78e3 --- /dev/null +++ b/tests/modules/inline_entity_form_test/config/optional/core.entity_view_display.node.ief_test_revisions_complex.default.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + config: + - field.field.node.ief_test_revisions_complex.field_entity_ref_revision + - node.type.ief_test_revisions_complex + module: + - entity_reference_revisions + - text + - user +id: node.ief_test_revisions_complex.default +targetEntityType: node +bundle: ief_test_revisions_complex +mode: default +content: + field_entity_ref_revision: + weight: 102 + label: above + settings: + view_mode: default + link: '' + third_party_settings: { } + type: entity_reference_revisions_entity_view + links: + weight: 100 +hidden: { } diff --git a/tests/modules/inline_entity_form_test/config/optional/field.field.node.ief_test_revisions_complex.field_entity_ref_revision.yml b/tests/modules/inline_entity_form_test/config/optional/field.field.node.ief_test_revisions_complex.field_entity_ref_revision.yml new file mode 100644 index 0000000..ac005d2 --- /dev/null +++ b/tests/modules/inline_entity_form_test/config/optional/field.field.node.ief_test_revisions_complex.field_entity_ref_revision.yml @@ -0,0 +1,27 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_entity_ref_revision + - node.type.ief_test_revisions_complex + module: + - entity_reference_revisions +id: node.ief_test_revisions_complex.field_entity_ref_revision +field_name: field_entity_ref_revision +entity_type: node +bundle: ief_test_revisions_complex +label: 'entity ref revision' +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:node' + handler_settings: + target_bundles: + ief_test_custom: ief_test_custom + sort: + field: _none + auto_create: false +field_type: entity_reference_revisions diff --git a/tests/modules/inline_entity_form_test/config/optional/field.storage.node.field_entity_ref_revision.yml b/tests/modules/inline_entity_form_test/config/optional/field.storage.node.field_entity_ref_revision.yml new file mode 100644 index 0000000..88a0955 --- /dev/null +++ b/tests/modules/inline_entity_form_test/config/optional/field.storage.node.field_entity_ref_revision.yml @@ -0,0 +1,19 @@ +langcode: en +status: true +dependencies: + module: + - entity_reference_revisions + - node +id: node.field_entity_ref_revision +field_name: field_entity_ref_revision +entity_type: node +type: entity_reference_revisions +settings: + target_type: node +module: entity_reference_revisions +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/tests/modules/inline_entity_form_test/config/optional/node.type.ief_test_revisions_complex.yml b/tests/modules/inline_entity_form_test/config/optional/node.type.ief_test_revisions_complex.yml new file mode 100644 index 0000000..480e4ff --- /dev/null +++ b/tests/modules/inline_entity_form_test/config/optional/node.type.ief_test_revisions_complex.yml @@ -0,0 +1,12 @@ +langcode: en +status: true +dependencies: + module: + - entity_reference_revisions +name: 'IEF test revisions complex' +type: ief_test_revisions_complex +description: '' +help: '' +new_revision: true +preview_mode: 1 +display_submitted: true