From 2a7450700135d232c41409aaffcb1b5460eb6070 Mon Sep 17 00:00:00 2001 From: Owen Bush <owen.bush@lullabot.com> Date: Fri, 26 May 2023 17:26:03 -0600 Subject: [PATCH] Sync with patch recurring_events-fix-event-instance-language-3318666-1.patch --- recurring_events.module | 28 +++++++++++++++++ src/Entity/EventInstance.php | 9 ++++-- src/EventCreationService.php | 35 ++++++++++++++++++--- src/Plugin/ComputedField/EventInstances.php | 1 + 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/recurring_events.module b/recurring_events.module index cfe4749f..056d83bc 100644 --- a/recurring_events.module +++ b/recurring_events.module @@ -176,6 +176,33 @@ function recurring_events_eventseries_insert(EntityInterface $entity) { } } +/** + * Implements hook_ENTITY_TYPE_translation_insert(). + */ +function recurring_events_eventseries_translation_insert(EntityInterface $translation) { + if (\Drupal::isConfigSyncing()) { + return; + } + $creation_service = \Drupal::service('recurring_events.event_creation_service'); + $creation_service->createInstances($translation); + + $instances = $translation->event_instances->referencedEntities(); + if (!empty($instances)) { + foreach ($instances as $instance) { + if ($instance->hasTranslation($translation->language()->getId())) { + $instance = $instance->getTranslation($translation->language()->getId()); + } + $instance->set('eventseries_id', $translation->id()); + $instance->setNewRevision(FALSE); + + $creation_service->configureDefaultInheritances($instance, $translation->id()); + $creation_service->updateInstanceStatus($instance, $translation); + + $instance->save(); + } + } +} + /** * Implements hook_ENTITY_TYPE_insert(). */ @@ -727,6 +754,7 @@ function recurring_events_entity_base_field_info_alter(&$fields, EntityTypeInter 'weight' => 0, ]) ->setDisplayConfigurable('form', FALSE) + ->setTranslatable(TRUE) ->setClass(EventInstances::class); } } diff --git a/src/Entity/EventInstance.php b/src/Entity/EventInstance.php index 095cb3f4..530ceb16 100644 --- a/src/Entity/EventInstance.php +++ b/src/Entity/EventInstance.php @@ -368,7 +368,8 @@ class EventInstance extends EditorialContentEntityBase implements EventInterface $fields['eventseries_id'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Event Series ID')) ->setDescription(t('The ID of the event series entity.')) - ->setSetting('target_type', 'eventseries'); + ->setSetting('target_type', 'eventseries') + ->setTranslatable(TRUE); $fields['langcode'] = BaseFieldDefinition::create('language') ->setLabel(t('Language code')) @@ -410,7 +411,11 @@ class EventInstance extends EditorialContentEntityBase implements EventInterface * The event series. */ public function getEventSeries() { - return $this->get('eventseries_id')->entity; + $entity = $this->get('eventseries_id')->entity; + if ($entity->hasTranslation($this->language()->getId())) { + return $entity->getTranslation($this->language()->getId()); + } + return $entity; } } diff --git a/src/EventCreationService.php b/src/EventCreationService.php index cb295ed4..b504f048 100644 --- a/src/EventCreationService.php +++ b/src/EventCreationService.php @@ -44,9 +44,9 @@ class EventCreationService { /** * Logger Factory. * - * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface + * @var \Drupal\Core\Logger\LoggerChannel */ - protected $loggerFactory; + protected $loggerChannel; /** * The messenger service. @@ -115,7 +115,7 @@ class EventCreationService { public function __construct(TranslationInterface $translation, Connection $database, LoggerChannelFactoryInterface $logger, Messenger $messenger, FieldTypePluginManager $field_type_plugin_manager, EntityFieldManager $entity_field_manager, ModuleHandler $module_handler, EntityTypeManagerInterface $entity_type_manager, KeyValueFactoryInterface $key_value) { $this->translation = $translation; $this->database = $database; - $this->loggerFactory = $logger->get('recurring_events'); + $this->loggerChannel = $logger->get('recurring_events'); $this->messenger = $messenger; $this->fieldTypePluginManager = $field_type_plugin_manager; $this->entityFieldManager = $entity_field_manager; @@ -528,8 +528,33 @@ class EventCreationService { $this->moduleHandler->alter('recurring_events_event_instance', $data); - $entity = $this->entityTypeManager->getStorage('eventinstance')->create($data); - $entity->save(); + $storage = $this->entityTypeManager->getStorage('eventinstance'); + if ($event->isDefaultTranslation()) { + $entity = $storage->create($data); + } + else { + $original = $event->getUntranslated(); + $entity_ids = $storage->getQuery() + ->condition('date__value', $data['date']['value']) + ->condition('date__end_value', $data['date']['end_value']) + ->condition('eventseries_id', $data['eventseries_id']) + ->condition('type', $data['type']) + ->condition('langcode', $original->language()->getId()) + ->accessCheck(FALSE) + ->execute(); + + if (!empty($entity_ids)) { + $entity = $storage->load(reset($entity_ids)); + $entity->addTranslation($event->language()->getId(), $data); + } + } + + if ($entity) { + $entity->save(); + } + else { + $this->loggerChannel->warning('Missing event instance in default language. Translation could not be created'); + } return $entity; } diff --git a/src/Plugin/ComputedField/EventInstances.php b/src/Plugin/ComputedField/EventInstances.php index e5efd463..294679ac 100644 --- a/src/Plugin/ComputedField/EventInstances.php +++ b/src/Plugin/ComputedField/EventInstances.php @@ -20,6 +20,7 @@ class EventInstances extends EntityReferenceFieldItemList { if (!empty($entity->id())) { $instances = \Drupal::entityTypeManager()->getStorage('eventinstance')->loadByProperties([ 'eventseries_id' => $entity->id(), + 'langcode' => $this->getLangcode(), ]); // Sort by instance start date and reindex by field item delta, as -- GitLab