contacts_events-8.x-1.x-dev/modules/village_allocation/src/VillageGroupIndexer.php
modules/village_allocation/src/VillageGroupIndexer.php
<?php namespace Drupal\village_allocation; use Drupal\commerce_order\Entity\OrderInterface; use Drupal\contacts_events_villages\Entity\VillageGroup; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\search_api\Utility\Utility; use Drupal\search_api_solr\Utility\SolrCommitTrait; /** * Service for reindexing village groups. * * @package Drupal\village_allocation */ class VillageGroupIndexer { use SolrCommitTrait; /** * Entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * Indexer's constructor. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * Entity type manager. */ public function __construct(EntityTypeManagerInterface $entity_type_manager) { $this->entityTypeManager = $entity_type_manager; } /** * Immediately reindexes groups. * * @param \Drupal\contacts_events_villages\Entity\VillageGroup[] $groups * Groups to reindex. */ public function reindexGroupsImmediately(array $groups) { $index = $this->getIndex(); $ids = []; foreach ($groups as $group) { foreach ($this->buildItemIds($group, TRUE) as $id) { $ids[] = $id; } } $items = $index->loadItemsMultiple($ids); $index->indexSpecificItems($items); $this->ensureCommit($index); } /** * Reindexes a group. * * @param \Drupal\contacts_events_villages\Entity\VillageGroup $group * Group to index. */ protected function reindexGroup(VillageGroup $group) { $index = $this->getIndex(); $index->trackItemsUpdated('entity:c_events_village_group', $this->buildItemIds($group, FALSE)); } /** * Reindexes the group attached to a booking. * * @param \Drupal\commerce_order\Entity\OrderInterface $booking * The booking that was modified. */ public function reindexGroupForBooking(OrderInterface $booking) { if (isset($booking->skipGroupIndexing)) { return; } /** @var \Drupal\contacts_events_villages\Entity\VillageGroup $group */ /** @var \Drupal\contacts_events_villages\Entity\VillageGroup $original_group */ $group = $booking->get('village_group')->entity; $original_group = isset($booking->original) ? $booking->original->get('village_group')->entity : NULL; if ($group || $original_group) { if ($group) { $group->clearComputedFields(); $this->reindexGroup($group); } if ($original_group) { if (!$group || $group->id() != $original_group->id()) { $original_group->clearComputedFields(); $this->reindexGroup($original_group); } } } } /** * Build the item IDs for the index. * * @param \Drupal\contacts_events_villages\Entity\VillageGroup $group * Group to index. * @param bool $combined * Whether to use the combined item IDs (with the datasource). * * @return array * The user's item IDs. */ protected function buildItemIds(VillageGroup $group, bool $combined): array { $user_id = $group->id(); $item_ids = []; foreach (array_keys($group->getTranslationLanguages()) as $langcode) { $item_id = "$user_id:$langcode"; $item_ids[] = $combined ? Utility::createCombinedId('entity:c_events_village_group', $item_id) : $item_id; } return $item_ids; } /** * Gets the index. * * @return \Drupal\search_api\Entity\Index * The index. */ protected function getIndex() { return $this->entityTypeManager ->getStorage('search_api_index') ->load('camping_groups'); } }