contacts_events-8.x-1.x-dev/modules/villages/src/EventSubscriber/VillagesCloneEventSubscriber.php
modules/villages/src/EventSubscriber/VillagesCloneEventSubscriber.php
<?php namespace Drupal\contacts_events_villages\EventSubscriber; use Drupal\contacts_events\Entity\EventInterface; use Drupal\contacts_events\Event\CloneEvent; use Drupal\contacts_events\EventSubscriber\CloneEventDependentEntitySubscriberBase; use Drupal\contacts_events_teams\EventSubscriber\TeamsCloneReferenceTrait; use Drupal\Core\Entity\Query\QueryInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; /** * Villages clone event subscriber. */ class VillagesCloneEventSubscriber extends CloneEventDependentEntitySubscriberBase { use TeamsCloneReferenceTrait; /** * {@inheritdoc} */ public static function getSubscribedEvents() { return [ // Use a low priority so we run after team cloning. CloneEvent::class => ['onClone', -50], ]; } /** * {@inheritdoc} */ public function onClone(CloneEvent $event): void { $event->addOperation( 'contacts_events_villages.clone_event_subscriber', 'cloneVillagesOperation', new TranslatableMarkup('Cloning villages'), ); $event->addOperation( 'contacts_events_villages.clone_event_subscriber', 'cloneVillageGroupsOperation', new TranslatableMarkup('Cloning village groups'), ); $event->addOperation( 'contacts_events_villages.clone_event_subscriber', 'updateVillageHostTeam', new TranslatableMarkup('Update village host team'), ); } /** * Clone operation to clone villages. * * @param \Drupal\contacts_events\Entity\EventInterface $event * The new event. * @param \Drupal\contacts_events\Entity\EventInterface $source * The source event. * @param array $sandbox * A sandbox for storing data that will be preserved between calls to this * operation. * * @return int * The progress percentage between 0 (not started) and 100 (complete). */ public function cloneVillagesOperation(EventInterface $event, EventInterface $source, array &$sandbox): int { return $this->cloneDependantEntityOperation('c_events_village', $event, $source, $sandbox, 'event'); } /** * Clone operation to clone village groups. * * @param \Drupal\contacts_events\Entity\EventInterface $event * The new event. * @param \Drupal\contacts_events\Entity\EventInterface $source * The source event. * @param array $sandbox * A sandbox for storing data that will be preserved between calls to this * operation. * * @return int * The progress percentage between 0 (not started) and 100 (complete). */ public function cloneVillageGroupsOperation(EventInterface $event, EventInterface $source, array &$sandbox): int { return $this->cloneDependantEntityOperation('c_events_village_group', $event, $source, $sandbox, 'event'); } /** * Clone operation to update the village host team on the clone. * * @param \Drupal\contacts_events\Entity\EventInterface $event * The new event. * @param \Drupal\contacts_events\Entity\EventInterface $source * The source event. */ public function updateVillageHostTeam(EventInterface $event, EventInterface $source): void { if (!$source->hasField('village_host_teams')) { return; } $team_ids = $this->findClonedTeams($source->get('village_host_teams')->referencedEntities(), $event->id()); // Set the teams on the event. We don't need to save, as storing progress // will update the event. $event->set('village_host_teams', $team_ids); } /** * {@inheritdoc} */ protected function getBaseQuery(string $entity_type_id, int $event_id, string $event_field): QueryInterface { $query = parent::getBaseQuery($entity_type_id, $event_id, $event_field); // For village groups, only clone the 'other' type. if ($entity_type_id === 'c_events_village_group') { // @todo Perhaps move this into the annotation of the type? $query->condition('type', 'other'); } return $query; } }