123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- <?php
- /**
- * @file
- * Contains SearchApiServiceInterface and SearchApiAbstractService.
- */
- /**
- * Interface defining the methods search services have to implement.
- *
- * Before a service object is used, the corresponding server's data will be read
- * from the database (see SearchApiAbstractService for a list of fields).
- *
- * Most methods in this interface (where any change in data occurs) can throw a
- * SearchApiException. The server entity class SearchApiServer catches these
- * exceptions and uses the server tasks system to assure that the action is
- * later retried.
- */
- interface SearchApiServiceInterface {
- /**
- * Constructs a service object.
- *
- * This will set the server configuration used with this service.
- *
- * @param SearchApiServer $server
- * The server object for this service.
- */
- public function __construct(SearchApiServer $server);
- /**
- * Form constructor for the server configuration form.
- *
- * Might be called with an incomplete server (no ID). In this case, the form
- * is displayed for the initial creation of the server.
- *
- * @param array $form
- * The server options part of the form.
- * @param array $form_state
- * The current form state.
- *
- * @return array
- * A form array for setting service-specific options.
- */
- public function configurationForm(array $form, array &$form_state);
- /**
- * Validation callback for the form returned by configurationForm().
- *
- * $form_state['server'] will contain the server that is created or edited.
- * Use form_error() to flag errors on form elements.
- *
- * @param array $form
- * The form returned by configurationForm().
- * @param array $values
- * The part of the $form_state['values'] array corresponding to this form.
- * @param array $form_state
- * The complete form state.
- */
- public function configurationFormValidate(array $form, array &$values, array &$form_state);
- /**
- * Submit callback for the form returned by configurationForm().
- *
- * This method should set the options of this service' server according to
- * $values.
- *
- * @param array $form
- * The form returned by configurationForm().
- * @param array $values
- * The part of the $form_state['values'] array corresponding to this form.
- * @param array $form_state
- * The complete form state.
- */
- public function configurationFormSubmit(array $form, array &$values, array &$form_state);
- /**
- * Determines whether this service class supports a given feature.
- *
- * Features are optional extensions to Search API functionality and usually
- * defined and used by third-party modules.
- *
- * There are currently three features defined directly in the Search API
- * project:
- * - "search_api_facets", by the search_api_facetapi module.
- * - "search_api_facets_operator_or", also by the search_api_facetapi module.
- * - "search_api_mlt", by the search_api_views module.
- * Other contrib modules might define additional features. These should always
- * be properly documented in the module by which they are defined.
- *
- * @param string $feature
- * The name of the optional feature.
- *
- * @return bool
- * TRUE if this service knows and supports the specified feature. FALSE
- * otherwise.
- */
- public function supportsFeature($feature);
- /**
- * Displays this server's settings.
- *
- * Output can be HTML or a render array, a <dl> listing all relevant settings
- * is preferred.
- */
- public function viewSettings();
- /**
- * Reacts to the server's creation.
- *
- * Called once, when the server is first created. Allows it to set up its
- * necessary infrastructure.
- */
- public function postCreate();
- /**
- * Notifies this server that its fields are about to be updated.
- *
- * The server's $original property can be used to inspect the old property
- * values.
- *
- * @return bool
- * TRUE, if the update requires reindexing of all content on the server.
- */
- public function postUpdate();
- /**
- * Notifies this server that it is about to be deleted from the database.
- *
- * This should execute any necessary cleanup operations.
- *
- * Note that you shouldn't call the server's save() method, or any
- * methods that might do that, from inside of this method as the server isn't
- * present in the database anymore at this point.
- */
- public function preDelete();
- /**
- * Adds a new index to this server.
- *
- * If the index was already added to the server, the object should treat this
- * as if removeIndex() and then addIndex() were called.
- *
- * @param SearchApiIndex $index
- * The index to add.
- *
- * @throws SearchApiException
- * If an error occurred while adding the index.
- */
- public function addIndex(SearchApiIndex $index);
- /**
- * Notifies the server that the field settings for the index have changed.
- *
- * If any user action is necessary as a result of this, the method should
- * use drupal_set_message() to notify the user.
- *
- * @param SearchApiIndex $index
- * The updated index.
- *
- * @return bool
- * TRUE, if this change affected the server in any way that forces it to
- * re-index the content. FALSE otherwise.
- *
- * @throws SearchApiException
- * If an error occurred while reacting to the change of fields.
- */
- public function fieldsUpdated(SearchApiIndex $index);
- /**
- * Removes an index from this server.
- *
- * This might mean that the index has been deleted, or reassigned to a
- * different server. If you need to distinguish between these cases, inspect
- * $index->server.
- *
- * If the index wasn't added to the server, the method call should be ignored.
- *
- * Implementations of this method should also check whether $index->read_only
- * is set, and don't delete any indexed data if it is.
- *
- * @param $index
- * Either an object representing the index to remove, or its machine name
- * (if the index was completely deleted).
- *
- * @throws SearchApiException
- * If an error occurred while removing the index.
- */
- public function removeIndex($index);
- /**
- * Indexes the specified items.
- *
- * @param SearchApiIndex $index
- * The search index for which items should be indexed.
- * @param array $items
- * An array of items to be indexed, keyed by their id. The values are
- * associative arrays of the fields to be stored, where each field is an
- * array with the following keys:
- * - type: One of the data types recognized by the Search API, or the
- * special type "tokens" for fulltext fields.
- * - original_type: The original type of the property, as defined by the
- * datasource controller for the index's item type.
- * - value: The value to index.
- *
- * The special field "search_api_language" contains the item's language and
- * should always be indexed.
- *
- * The value of fields with the "tokens" type is an array of tokens. Each
- * token is an array containing the following keys:
- * - value: The word that the token represents.
- * - score: A score for the importance of that word.
- *
- * @return array
- * An array of the ids of all items that were successfully indexed.
- *
- * @throws SearchApiException
- * If indexing was prevented by a fundamental configuration error.
- */
- public function indexItems(SearchApiIndex $index, array $items);
- /**
- * Deletes indexed items from this server.
- *
- * Might be either used to delete some items (given by their ids) from a
- * specified index, or all items from that index, or all items from all
- * indexes on this server.
- *
- * @param $ids
- * Either an array containing the ids of the items that should be deleted,
- * or 'all' if all items should be deleted. Other formats might be
- * recognized by implementing classes, but these are not standardized.
- * @param SearchApiIndex $index
- * The index from which items should be deleted, or NULL if all indexes on
- * this server should be cleared (then, $ids has to be 'all').
- *
- * @throws SearchApiException
- * If an error occurred while trying to delete the items.
- */
- public function deleteItems($ids = 'all', SearchApiIndex $index = NULL);
- /**
- * Creates a query object for searching on an index lying on this server.
- *
- * @param SearchApiIndex $index
- * The index to search on.
- * @param $options
- * Associative array of options configuring this query. See
- * SearchApiQueryInterface::__construct().
- *
- * @return SearchApiQueryInterface
- * An object for searching the given index.
- *
- * @throws SearchApiException
- * If the server is currently disabled.
- */
- public function query(SearchApiIndex $index, $options = array());
- /**
- * Executes a search on the server represented by this object.
- *
- * @param $query
- * The SearchApiQueryInterface object to execute.
- *
- * @return array
- * An associative array containing the search results, as required by
- * SearchApiQueryInterface::execute().
- *
- * @throws SearchApiException
- * If an error prevented the search from completing.
- */
- public function search(SearchApiQueryInterface $query);
- }
- /**
- * Abstract class with generic implementation of most service methods.
- *
- * For creating your own service class extending this class, you only need to
- * implement indexItems(), deleteItems() and search() from the
- * SearchApiServiceInterface interface.
- */
- abstract class SearchApiAbstractService implements SearchApiServiceInterface {
- /**
- * @var SearchApiServer
- */
- protected $server;
- /**
- * Direct reference to the server's $options property.
- *
- * @var array
- */
- protected $options = array();
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation sets $this->server and $this->options.
- */
- public function __construct(SearchApiServer $server) {
- $this->server = $server;
- $this->options = &$server->options;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * Returns an empty form by default.
- */
- public function configurationForm(array $form, array &$form_state) {
- return array();
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * Does nothing by default.
- */
- public function configurationFormValidate(array $form, array &$values, array &$form_state) {
- return;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation just ensures that additional elements in
- * $options, not present in the form, don't get lost at the update.
- */
- public function configurationFormSubmit(array $form, array &$values, array &$form_state) {
- if (!empty($this->options)) {
- $values += $this->options;
- }
- $this->options = $values;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation always returns FALSE.
- */
- public function supportsFeature($feature) {
- return FALSE;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation does a crude output as a definition list, with
- * option names taken from the configuration form.
- */
- public function viewSettings() {
- $output = '';
- $form = $form_state = array();
- $option_form = $this->configurationForm($form, $form_state);
- $option_names = array();
- foreach ($option_form as $key => $element) {
- if (isset($element['#title']) && isset($this->options[$key])) {
- $option_names[$key] = $element['#title'];
- }
- }
- foreach ($option_names as $key => $name) {
- $value = $this->options[$key];
- $output .= '<dt>' . check_plain($name) . '</dt>' . "\n";
- $output .= '<dd>' . nl2br(check_plain(print_r($value, TRUE))) . '</dd>' . "\n";
- }
- return $output ? "<dl>\n$output</dl>" : '';
- }
- /**
- * Returns additional, service-specific information about this server.
- *
- * If a service class implements this method and supports the
- * "search_api_service_extra" option, this method will be used to add extra
- * information to the server's "View" tab.
- *
- * In the default theme implementation this data will be output in a table
- * with two columns along with other, generic information about the server.
- *
- * @return array
- * An array of additional server information, with each piece of information
- * being an associative array with the following keys:
- * - label: The human-readable label for this data.
- * - info: The information, as HTML.
- * - status: (optional) The status associated with this information. One of
- * "info", "ok", "warning" or "error". Defaults to "info".
- *
- * @see supportsFeature()
- */
- public function getExtraInformation() {
- return array();
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * Does nothing, by default.
- */
- public function postCreate() {
- return;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation always returns FALSE.
- */
- public function postUpdate() {
- return FALSE;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * By default, deletes all indexes from this server.
- */
- public function preDelete() {
- $indexes = search_api_index_load_multiple(FALSE, array('server' => $this->server->machine_name));
- foreach ($indexes as $index) {
- // removeIndex() might throw exceptions, but this method mustn't.
- try {
- $this->removeIndex($index);
- }
- catch (SearchApiException $e) {
- $variables['%index'] = $index->name;
- $variables['%server'] = $this->server->name;
- watchdog_exception('search_api', $e, '%type while trying to remove index %index from deleted server %server: !message in %function (line %line of %file).', $variables);
- }
- }
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * Does nothing, by default.
- */
- public function addIndex(SearchApiIndex $index) {
- return;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation always returns FALSE.
- */
- public function fieldsUpdated(SearchApiIndex $index) {
- return FALSE;
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * By default, removes all items from that index.
- */
- public function removeIndex($index) {
- if (is_object($index) && empty($index->read_only)) {
- $this->deleteItems('all', $index);
- }
- }
- /**
- * Implements SearchApiServiceInterface::__construct().
- *
- * The default implementation returns a SearchApiQuery object.
- */
- public function query(SearchApiIndex $index, $options = array()) {
- return new SearchApiQuery($index, $options);
- }
- }
|