search_api-8.x-1.15/src/Plugin/search_api/datasource/ContentEntityTaskManager.php

src/Plugin/search_api/datasource/ContentEntityTaskManager.php
<?php

namespace Drupal\search_api\Plugin\search_api\datasource;

use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\search_api\SearchApiException;
use Drupal\search_api\Task\TaskEvent;
use Drupal\search_api\Task\TaskManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Provides a service for managing pending tracking tasks for datasources.
 */
class ContentEntityTaskManager implements EventSubscriberInterface {

  /**
   * The Search API task type used by this service for "insert items" tasks.
   */
  const INSERT_ITEMS_TASK_TYPE = 'search_api.entity_datasource.trackItemsInserted';

  /**
   * The Search API task type used by this service for "delete items" tasks.
   */
  const DELETE_ITEMS_TASK_TYPE = 'search_api.entity_datasource.trackItemsDeleted';

  /**
   * The Search API task manager.
   *
   * @var \Drupal\search_api\Task\TaskManagerInterface
   */
  protected $taskManager;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Constructs a ContentEntityTaskManager object.
   *
   * @param \Drupal\search_api\Task\TaskManagerInterface $task_manager
   *   The Search API task manager.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   */
  public function __construct(TaskManagerInterface $task_manager, EntityTypeManagerInterface $entity_type_manager) {
    $this->taskManager = $task_manager;
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events['search_api.task.' . self::INSERT_ITEMS_TASK_TYPE][] = ['processEvent'];
    $events['search_api.task.' . self::DELETE_ITEMS_TASK_TYPE][] = ['processEvent'];

    return $events;
  }

  /**
   * Processes a datasource tracking event.
   *
   * @param \Drupal\search_api\Task\TaskEvent $event
   *   The task event.
   * @param string $event_name
   *   The name of the event.
   */
  public function processEvent(TaskEvent $event, $event_name) {
    $event->stopPropagation();

    // The complete event name prefix in front of the method name is 45
    // characters long: "search_api.task.search_api.entity_datasource.".
    $method = substr($event_name, 45);

    $task = $event->getTask();
    $index = $task->getIndex();
    $data = $task->getData();

    if (!$index->hasValidTracker()) {
      $args['%index'] = $index->label();
      $message = new FormattableMarkup('Index %index does not have a valid tracker set.', $args);
      $event->setException(new SearchApiException($message));
      return;
    }

    $datasource_id = $data['datasource'];
    $reschedule = FALSE;
    if ($index->isValidDatasource($datasource_id)) {
      $datasource = $index->getDatasource($datasource_id);
      if ($datasource instanceof EntityDatasourceInterface) {
        $raw_ids = $datasource->getPartialItemIds($data['page'], $data['bundles'], $data['languages']);
        if ($raw_ids !== NULL) {
          $reschedule = TRUE;
          if ($raw_ids) {
            $index->startBatchTracking();
            $index->$method($datasource_id, $raw_ids);
            $index->stopBatchTracking();
          }
        }
      }
    }

    if ($reschedule) {
      ++$data['page'];
      $this->taskManager->addTask($task->getType(), NULL, $index, $data);
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc