diff --git a/src/Form/EntityInlineForm.php b/src/Form/EntityInlineForm.php index 4dae436..5229906 100644 --- a/src/Form/EntityInlineForm.php +++ b/src/Form/EntityInlineForm.php @@ -8,10 +8,13 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Entity\RevisionableInterface; +use Drupal\Core\Entity\RevisionLogInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Field\WidgetBase; use Drupal\Core\Form\FormStateInterface; use Drupal\inline_entity_form\InlineFormInterface; +use Drupal\node\NodeInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -285,4 +288,47 @@ class EntityInlineForm implements InlineFormInterface { return EntityFormDisplay::collectRenderDisplay($entity, $form_mode); } + /** + * Determines wheter we should save a new revision. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state. + * + * @return bool + */ + protected function hasNewRevision(EntityInterface $entity, FormStateInterface $form_state) { + $new_revision = FALSE; + if ($entity instanceof RevisionableInterface && $entity->getEntityType()->isRevisionable()) { + if ($entity->isNewRevision()) { + $new_revision = TRUE; + } + + // Most of the time we don't know yet if the host entity is going to be + // saved as a new revision using RevisionableInterface::isNewRevision(). + // Most entity types (at least nodes) however use a boolean property named + // "revision" to indicate whether a new revision should be saved. Use that + // property. + elseif ($entity->getEntityType()->hasKey('revision') && $form_state->getValue('revision')) { + $new_revision = TRUE; + } + } + return $new_revision; + } + + /** + * {@inheritdoc} + */ + public function widgetSubmit($entity, $form, $form_state) { + if ($this->hasNewRevision($entity, $form_state) && $entity instanceof RevisionableInterface) { + $entity->setNewRevision(); + if ($entity instanceof RevisionLogInterface) { + // If a new revision is created, save the current user as revision author. + $entity->setRevisionUserId(\Drupal::currentUser()->id()); + $entity->setRevisionCreationTime(REQUEST_TIME); + } + } + } + } diff --git a/src/Form/NodeInlineForm.php b/src/Form/NodeInlineForm.php index 4f6c377..1ab5a9c 100644 --- a/src/Form/NodeInlineForm.php +++ b/src/Form/NodeInlineForm.php @@ -2,8 +2,10 @@ namespace Drupal\inline_entity_form\Form; +use Drupal\Core\Entity\RevisionableInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\node\NodeInterface; /** * Node inline form handler. @@ -57,4 +59,18 @@ class NodeInlineForm extends EntityInlineForm { return $entity_form; } + /** + * {@inheritdoc} + */ + public function widgetSubmit($entity, $form, $form_state) { + if ($this->hasNewRevision($entity, $form_state) && $entity instanceof RevisionableInterface) { + $entity->setNewRevision(); + if ($entity instanceof NodeInterface) { + $entity->setRevisionCreationTime(REQUEST_TIME); + // If a new revision is created, save the current user as revision author. + $entity->setRevisionAuthorId(\Drupal::currentUser()->id()); + } + } + } + } diff --git a/src/InlineFormInterface.php b/src/InlineFormInterface.php index c663602..2e3d395 100644 --- a/src/InlineFormInterface.php +++ b/src/InlineFormInterface.php @@ -126,4 +126,18 @@ interface InlineFormInterface extends EntityHandlerInterface { */ public function delete($ids, $context); + /** + * Submits the widget. + * + * This method is executed before ::save(). + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity. + * @param array $form + * The entity form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state of the parent form. + */ + public function widgetSubmit($entity, $form, $form_state); + } diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php index 3ab57ef..9fb591b 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php @@ -22,7 +22,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 e525a94..f8c466e 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormSimple.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormSimple.php @@ -18,7 +18,8 @@ use Drupal\inline_entity_form\TranslationHelper; * 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/WidgetSubmit.php b/src/WidgetSubmit.php index 98921a4..ddbe134 100644 --- a/src/WidgetSubmit.php +++ b/src/WidgetSubmit.php @@ -2,8 +2,11 @@ namespace Drupal\inline_entity_form; +use Drupal\Core\Entity\RevisionableInterface; +use Drupal\Core\Entity\RevisionLogInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\inline_entity_form\Element\InlineEntityForm; +use Drupal\node\NodeInterface; /** * Performs widget submission. @@ -46,6 +49,8 @@ class WidgetSubmit { /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ $entity = $entity_item['entity']; $handler = InlineEntityForm::getInlineFormHandler($entity->getEntityTypeId()); + + $handler->widgetSubmit($entity, $form, $form_state); $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