Pular para o conteúdo principal

Recurso de Pesquisa

Visão geral

O sistema de busca do tema implementa busca fulltext em páginas, itens, e coleções. Resultados são combinados em lista única, ordenados por relevância ou critério selecionado, e paginados manualmente.

Templates

view/omeka/site/index/search.phtml

Template principal da página de busca. Implementa:

  • Busca fulltext via API do Omeka S
  • Combinação de resultados de três tipos de recurso
  • Ordenação alfabética ou cronológica
  • Paginação manual
  • Destaque de termo encontrado em propriedades

view/common/search-form.phtml

Partial reutilizável do formulário de busca. Implementa:

  • Roteamento baseado em configuração search_type
  • Sugestões configuráveis via sgmblocks_search_suggestions
  • Modo compacto para uso em blocos

Busca fulltext

A busca consulta três endpoints da API:

$allPages = $api->search('site_pages', [
'site_id' => $site->id(),
'fulltext_search' => $searchQuery
])->getContent();

$allItems = $api->search('items', [
'site_id' => $site->id(),
'fulltext_search' => $searchQuery
])->getContent();

$allItemSets = $api->search('item_sets', [
'site_id' => $site->id(),
'fulltext_search' => $searchQuery
])->getContent();

Se a busca com site_id falhar, tenta sem o filtro. Resultados vazios são usados como fallback em caso de exceção.

Todos os resultados são combinados em array único com tipo identificado:

$allResults = [];
foreach ($allPages as $page) {
$allResults[] = ['type' => 'page', 'resource' => $page];
}
// ... itens e coleções

Ordenação

Três opções de ordenação disponíveis via parâmetro sort:

  • alpha: Alfabética A-Z, padrão quando não especificado
  • date: Mais recentes primeiro, por created()
  • date_old: Mais antigos primeiro, por created()

Páginas usam método title(), itens e coleções usam displayTitle(). Ordenação alfabética usa strcasecmp para case-insensitive.

Paginação manual

Paginação é calculada manualmente sobre o array combinado:

$currentPage = (int) $this->params()->fromQuery('page', 1);
$perPage = (int) $this->setting('pagination_per_page', 25);
$totalPageCount = ceil($totalResults / $perPage);
$offset = ($currentPage - 1) * $perPage;
$pagedResults = array_slice($allResults, $offset, $perPage);

Controles de navegação renderizam setas anterior e próxima, números de página com elipses para gaps, e estado disabled quando apropriado.

Destaque de termo em propriedades

Função findMatchedProperty localiza onde o termo de busca foi encontrado:

$findMatchedProperty = function ($resource, $searchTerm) use ($api, $escape) {
// Carrega traduções de propriedades
require_once __DIR__ . '/../../../common/property-translations.php';
$translationMap = $GLOBALS['propertyTranslationMap'];

// Itera valores do recurso
foreach ($values as $propertyTerm => $propertyValues) {
// Busca termo em cada valor
// Retorna label traduzido e excerpt com contexto
}
};

Propriedades de título são ignoradas. O excerpt inclui 30 caracteres antes e 100 total, com prefixo e sufixo de elipse quando truncado.

Layout da página

A página de busca contém quatro seções principais:

  1. Banner: Hero com imagem de fundo asset/img/bg-search.png, título "Pesquise no acervo", margem negativa para sobrepor header

  2. Formulário: Inclui partial common/search-form com sugestões ativadas

  3. Barra de controles: Termo buscado, contagem de resultados, e controles de ordenação

  4. Resultados: Lista de recursos com thumbnail, badge de tipo, título, e descrição ou matched property

Formulário de busca

Partial view/common/search-form.phtml aceita dois parâmetros:

  • showSearchSuggestions: Boolean para exibir sugestões, padrão true
  • compact: Boolean para remover margin-top e max-width

Roteamento é determinado por search_type:

  • sitewide: busca no site atual via site/resource
  • cross-site: busca cross-site via site/cross-site-search

Sugestões são obtidas de siteSetting('sgmblocks_search_suggestions'), array de objetos com text e url. Cada sugestão é renderizada como chip clicável.

Thumbnails em resultados

Cada tipo de recurso obtém thumbnail de forma diferente:

Páginas: Busca bloco thumbnail-block na página, extrai asset ID, e obtém URL via API.

Itens: Usa $this->thumbnail($resource, 'medium') do Omeka S.

Coleções: Usa $this->thumbnail($resource, 'medium') do Omeka S.

Hero background

Banner da página usa imagem asset/img/bg-search.png como background. Estilo inline aplica a imagem via CSS:

$bannerBackground = $this->assetUrl('img/bg-search.png');
$bannerStyle = $bannerBackground ? "background-image: url('{$escape($bannerBackground)}');" : '';

Classe sgm-banner-page aplica estilos de cobertura total. Margem negativa -mt-24 compensa header fixo.