|
|
|
@ -5,6 +5,8 @@ |
|
|
|
* Runs a IIIF content search in Mirador on load from a passed search term. |
|
|
|
* Runs a IIIF content search in Mirador on load from a passed search term. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use Drupal\advanced_search\AdvancedSearchQuery; |
|
|
|
|
|
|
|
use Drupal\advanced_search\AdvancedSearchQueryTerm; |
|
|
|
use Drupal\views\ViewExecutable; |
|
|
|
use Drupal\views\ViewExecutable; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -29,13 +31,8 @@ function mirador_search_highlight_views_pre_render(ViewExecutable $view) { |
|
|
|
if (!in_array($view->id(), MIRADOR_SEARCH_HIGHLIGHT_VIEWS, TRUE)) { |
|
|
|
if (!in_array($view->id(), MIRADOR_SEARCH_HIGHLIGHT_VIEWS, TRUE)) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!method_exists($view->query, 'getOriginalKeys')) { |
|
|
|
$keys = _mirador_search_highlight_get_keys($view); |
|
|
|
return; |
|
|
|
if ($keys === '') { |
|
|
|
} |
|
|
|
|
|
|
|
// Parse modes may turn the keys into an array; only the raw string is |
|
|
|
|
|
|
|
// useful as a Mirador search query. |
|
|
|
|
|
|
|
$keys = $view->query->getOriginalKeys(); |
|
|
|
|
|
|
|
if (!is_string($keys) || trim($keys) === '') { |
|
|
|
|
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -45,9 +42,46 @@ function mirador_search_highlight_views_pre_render(ViewExecutable $view) { |
|
|
|
// links, and an explicit 'query' replaces the item URL's query. |
|
|
|
// links, and an explicit 'query' replaces the item URL's query. |
|
|
|
// UrlHelper::buildQuery() encodes the value before Views token |
|
|
|
// UrlHelper::buildQuery() encodes the value before Views token |
|
|
|
// replacement, so user input is never treated as Twig. |
|
|
|
// replacement, so user input is never treated as Twig. |
|
|
|
$handler->options['alter']['query'] = [MIRADOR_SEARCH_HIGHLIGHT_PARAM => trim($keys)]; |
|
|
|
$handler->options['alter']['query'] = [MIRADOR_SEARCH_HIGHLIGHT_PARAM => $keys]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Gets the search term the view was run with. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param \Drupal\views\ViewExecutable $view |
|
|
|
|
|
|
|
* The search view. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @return string |
|
|
|
|
|
|
|
* The search term, or an empty string if there is none. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
function _mirador_search_highlight_get_keys(ViewExecutable $view) { |
|
|
|
|
|
|
|
// Advanced Search passes terms as a[N][v] and writes them straight into the |
|
|
|
|
|
|
|
// Solr query, so the Search API query never has keys set. Read the terms |
|
|
|
|
|
|
|
// the same way it does, skipping excluded ("IS NOT") terms. |
|
|
|
|
|
|
|
if (class_exists(AdvancedSearchQuery::class) && ($request = $view->getRequest())) { |
|
|
|
|
|
|
|
$values = []; |
|
|
|
|
|
|
|
foreach ((new AdvancedSearchQuery())->getTerms($request) as $term) { |
|
|
|
|
|
|
|
if ($term->getInclude()) { |
|
|
|
|
|
|
|
$values[] = trim((string) ($term->toQueryParams()[AdvancedSearchQueryTerm::VALUE_QUERY_PARAMETER] ?? '')); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$keys = implode(' ', array_filter($values, 'strlen')); |
|
|
|
|
|
|
|
if ($keys !== '') { |
|
|
|
|
|
|
|
return $keys; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Fall back to a plain Search API fulltext filter. Parse modes may turn the |
|
|
|
|
|
|
|
// keys into an array; only the raw string is useful to Mirador. |
|
|
|
|
|
|
|
if (method_exists($view->query, 'getOriginalKeys')) { |
|
|
|
|
|
|
|
$keys = $view->query->getOriginalKeys(); |
|
|
|
|
|
|
|
if (is_string($keys)) { |
|
|
|
|
|
|
|
return trim($keys); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return ''; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
|