You are here

public function Search::preSave in Search API Autocomplete 8

Acts on an entity before the presave hook is invoked.

Used before the entity is saved and before invoking the presave hook. Note that in case of translatable content entities this callback is only fired on their current translation. It is up to the developer to iterate over all translations if needed. This is different from its counterpart in the Field API, FieldItemListInterface::preSave(), which is fired on all field translations automatically. @todo Adjust existing implementations and the documentation according to https://www.drupal.org/node/2577609 to have a consistent API.

Parameters

\Drupal\Core\Entity\EntityStorageInterface $storage: The entity storage object.

Throws

\Exception When there is a problem that should prevent saving the entity.

Overrides ConfigEntityBase::preSave

See also

\Drupal\Core\Field\FieldItemListInterface::preSave()

File

src/Entity/Search.php, line 404

Class

Search
Describes the autocomplete settings for a certain search.

Namespace

Drupal\search_api_autocomplete\Entity

Code

public function preSave(EntityStorageInterface $storage) {
  parent::preSave($storage);

  // Make sure the search plugin's index matches this entity's index.
  $plugin_index_id = $this
    ->getSearchPlugin()
    ->getIndexId();
  if ($this
    ->getIndexId() !== $plugin_index_id) {
    throw new SearchApiAutocompleteException("Attempt to save autocomplete search '{$this->id()}' with search plugin '{$this->getSearchPluginId()}' of index '{$plugin_index_id}' while the autocomplete search points to index '{$this->getIndexId()}'");
  }

  // Make sure only one search entity is ever saved for a certain search
  // plugin.

  /** @var \Drupal\search_api_autocomplete\Entity\SearchStorage $storage */
  $search = $storage
    ->loadBySearchPlugin($this
    ->getSearchPluginId());
  if ($search && $search
    ->id() !== $this
    ->id()) {
    throw new SearchApiAutocompleteException("Attempt to save autocomplete search '{$this->id()}' with search plugin '{$this->getSearchPluginId()}' when this plugin is already used for '{$search->id()}'");
  }

  // If we are in the process of syncing, we shouldn't change any entity
  // properties (or other configuration).
  if ($this
    ->isSyncing()) {
    return;
  }

  // Write the plugin settings to the persistent *_settings properties.
  $this
    ->writeChangesToSettings();

  // If there are no suggesters set for the search, it can't be enabled.
  if (!$this
    ->getSuggesters()) {
    $this
      ->disable();
  }
}