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 especificadodate: Mais recentes primeiro, porcreated()date_old: Mais antigos primeiro, porcreated()
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:
-
Banner: Hero com imagem de fundo
asset/img/bg-search.png, título "Pesquise no acervo", margem negativa para sobrepor header -
Formulário: Inclui partial
common/search-formcom sugestões ativadas -
Barra de controles: Termo buscado, contagem de resultados, e controles de ordenação
-
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 truecompact: Boolean para remover margin-top e max-width
Roteamento é determinado por search_type:
sitewide: busca no site atual viasite/resourcecross-site: busca cross-site viasite/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.