acquia_cms_search-1.3.0/src/Plugin/views/area/FallbackView.php
src/Plugin/views/area/FallbackView.php
<?php
namespace Drupal\acquia_cms_search\Plugin\views\area;
use Drupal\search_api\Plugin\views\query\SearchApiQuery;
use Drupal\search_api\SearchApiException;
use Drupal\views\Plugin\views\area\View;
/**
* Defines a view area handler that short-circuits if the search server is up.
*
* This handler is only useful on Search API-based views. If the search server
* that powers the view is available, this will not display anything. If the
* server is down, it will display a view. If the view is not powered by Search
* API, this handler will not display anything.
*
* @ViewsArea("view_fallback")
*/
final class FallbackView extends View {
/**
* {@inheritdoc}
*/
public function preQuery() {
$query = $this->view->getQuery();
$simulate_unavailable = $this->options['simulate_unavailable'] ?? FALSE;
if ($query instanceof SearchApiQuery && $simulate_unavailable) {
$query->abort();
}
parent::preQuery();
}
/**
* {@inheritdoc}
*/
public function render($empty = FALSE) {
if ($this->isServerAvailable()) {
$this->isEmpty = TRUE;
return [];
}
return parent::render($empty);
}
/**
* Checks if the Search API server for this view is available.
*
* @return bool
* TRUE if the server is available, FALSE otherwise. If the view's query
* handler is not Search API's query handler, returns TRUE.
*/
private function isServerAvailable() : bool {
$query = $this->view->getQuery();
if ($query instanceof SearchApiQuery) {
if ($query->shouldAbort()) {
return FALSE;
}
try {
return $query->getIndex()
->getServerInstance()
->getBackend()
->isAvailable();
}
catch (SearchApiException $e) {
return FALSE;
}
}
return TRUE;
}
}
