Pular para o conteúdo principal

Arquitetura do tema

Core do Omeka S theming

O Omeka S utiliza um sistema de templates com hierarquia de sobreposição. Templates padrão do sistema residem em omeka-s/application. Quando um tema define um arquivo no mesmo caminho relativo, o Omeka S prioriza a versão do tema. Essa sobreposição permite que temas customizem a experiência visual sem modificar o core do sistema.

O tema SGM é uma customização baseada no tema The Daily, que forneceu a estrutura inicial. Herda o sistema de layout, helpers, e estrutura de pastas padrão. Apesar do uso do Tailwind CSS, o tema mantém arquivos CSS separados pois estão associados a elementos em templates padrão do Omeka que não foram alterados. Esses estilos garantem que os componentes herdados continuem estilizados corretamente.

Template path stack e resolução

A resolução de templates no Omeka S segue uma ordem determinada pelo template_path_stack. Quando um template é solicitado via $this->partial('common/header'), o sistema procura na seguinte ordem:

  1. Tema ativo: themes/sgm/view/common/header.phtml
  2. Módulos ativados: cada módulo pode registrar seu próprio path de templates
  3. Core do Omeka S: application/view/common/header.phtml

Para blocos customizados do SGMBlocks, a resolução funciona da mesma forma. O módulo registra templates em modules/SGMBlocks/view/common/block-layout/. Se o tema definir o mesmo caminho em themes/sgm/view/common/block-layout/, a versão do tema prevalece. Veja Blocos customizados para detalhes.

Eventos de view

O tema utiliza triggers do Omeka S para extensibilidade:

  • $this->trigger('view.layout'): antes do layout principal
  • $this->trigger('view.show.before'): antes de exibir recurso
  • $this->trigger('view.show.after'): depois de exibir recurso
  • $this->trigger('view.browse.before'): antes de listagem
  • $this->trigger('view.browse.after'): depois de listagem

Esses triggers permitem que módulos executem código em pontos específicos do ciclo de renderização.

view/layout/layout.phtml

O layout principal é o shell HTML base de todas as páginas do site. Ele organiza a estrutura geral da página incluindo o head, carregamento de assets, e a renderização dos componentes principais.

Metadados básicos

No head, são definidos os metadados essenciais para o funcionamento responsivo do site:

$this->headMeta()->setCharset('utf-8');
$this->headMeta()->appendName('viewport', 'width=device-width, initial-scale=1');
$this->headTitle($siteTitle)->setSeparator(' · ');

Carregamento de assets

O layout inclui referências para os principais arquivos CSS e JavaScript:

CSS:

  • output.css: CSS compilado do Tailwind
  • iconfonts.css: fontes de ícones do Omeka
  • Google Fonts: Inter e Material Symbols

JavaScript:

  • jQuery do Omeka
  • global.js: funcionalidades gerais do Omeka
  • thedaily.js: scripts legados do tema The Daily

Renderização de conteúdo

O layout utiliza partials para incluir os componentes básicos:

<?php echo $this->htmlElement('body'); ?>
<?php echo $userBar; ?>
<?php echo $this->partial('common/header', ['fixedHeader' => $fixedHeader]); ?>
<?php echo $this->content; ?>
<?php echo $this->partial('common/footer'); ?>

O conteúdo dinâmico da página é inserido através de $this->content, que é populado pelo Omeka S conforme a rota atual.

Variável fixedHeader

O layout gerencia a variável global $GLOBALS['fixedHeader'] que controla se o header deve ser fixo e transparente. Primeiro verifica se a variável já foi definida por um template filho, depois tenta obter da página atual via layoutDataValue('fixed_header') ou via data(). A variável é então passada para o header partial e definida globalmente para uso em outros componentes.

view/layout/page-render/fixed-header.phtml

Este partial centraliza a detecção do header fixo para evitar repetição de código em múltiplos templates. Ele recebe a variável $page como entrada e define $GLOBALS['fixedHeader'] como efeito colateral.

Como foi construído

O partial encapsula a lógica de verificação do campo fixed_header em um arquivo reutilizável. Templates de página incluem este partial no topo em vez de duplicar a lógica de detecção. O partial tenta obter o valor via layoutDataValue primeiro, com fallback para data(), normalizando valores como true, 1, '1', 'true', 'on', 'yes'.

Como usar como desenvolvedor

Inclua no topo de qualquer template de página que precise detectar header fixo:

echo $this->partial('layout/page-render/fixed-header', ['page' => $page]);

A variável $GLOBALS['fixedHeader'] estará disponível para o restante do template e para o layout principal. Outros arquivos existem na pasta view/layout/page-render/: banner-blocks.phtml e main-blocks.phtml. Estes não estão em uso ativo no momento.

view/omeka/site/page/show.phtml

Template padrão para exibição de páginas. Ele implementa uma cadeia de renderização sofisticada com suporte a templates por slug.

Como foi construído

O template implementa três camadas de renderização:

1. Detecção de header fixo:

echo $this->partial('layout/page-render/fixed-header', ['page' => $page]);

2. Template por slug: Verifica se existe omeka/site/page/show/{slug}.phtml. Se existir, renderiza e retorna, interrompendo a execução do template padrão. O único template por slug ativo é soon.phtml.

3. Renderização de blocos banner-page: Blocos do tipo banner-page são renderizados primeiro, fora do container principal, permitindo que ocupem a largura total da viewport.

4. Renderização de blocos principais: Blocos restantes são renderizados dentro de um container com sistema de grid de 12 colunas. O template implementa:

  • Suporte a grupos de blocos via blockGroup
  • Aplicação de classes CSS dinâmicas baseadas em layoutDataValue
  • Estilos inline para padding, cores de fundo, altura mínima
  • Controle de gaps via grid_column_gap e grid_row_gap

Blocos excluídos da renderização principal: thumbnail-block, page-description, banner-page.

Estrutura de dados

Páginas têm blocos acessíveis via $page->blocks(). Cada bloco tem:

  • layout(): nome do layout do bloco
  • dataValue('chave'): valor de um campo do bloco
  • layoutDataValue('chave', $default): valor de layout data

view/omeka/site/item/show.phtml

Template responsável pela exibição detalhada de um item individual.

Como foi construído

O template organiza a exibição em seções distintas:

1. Preparação de dados:

  • Obtém mídias do item via $item->media()
  • Configura meta tag Open Graph com thumbnail
  • Obtém coleções associadas via $item->itemSets()
  • Ativa header fixo via $GLOBALS['fixedHeader'] = true

2. Banner do item: Renderizado via common/resources/banner partial, que exibe imagem de destaque e informações da coleção.

3. Metadados: Renderizados via common/resources/meta partial, que exibe propriedades do item em formato tabular.

4. Recursos vinculados: Exibe valores relacionados via $item->displaySubjectValues() com paginação.

5. Galeria de mídia: Utiliza $this->lightGalleryOutput() para renderizar mídias em galeria interativa.

view/omeka/site/item/browse.phtml

Template para listagem de itens dentro de uma coleção.

Como foi construído

O template implementa uma listagem paginada com:

1. Query de itens: Obtém itens da coleção atual via parâmetros de query, com paginação manual.

2. Banner da coleção: Renderizado via common/resources/banner partial com a coleção como contexto.

3. Metadados da coleção: Renderizados via common/resources/meta partial.

4. Grid de itens: Utiliza common/block-layout/browse-preview partial para renderizar thumbnails em grid.

5. Paginação customizada: Implementa paginação manual com controles de anterior e próximo, números de página, e elipses para gaps. A paginação mantém parâmetros de busca na URL.

view/omeka/site/item-set/show.phtml

Template para exibição detalhada de uma coleção individual.

Como foi construído

1. Header section: Exibe thumbnail da coleção, título via displayTitle, e descrição via displayDescription.

2. Tabela de metadados: Itera sobre $itemSet->values() agrupados por termo de propriedade. Para cada propriedade, obtém o label via API e formata os valores. A tabela também exibe contagem de itens na coleção.

3. Grid de itens: Lista todos os itens da coleção em grid responsivo. Cada item exibe thumbnail, título, e descrição. Configurações browse_heading_property_term e browse_body_property_term controlam quais propriedades aparecem como título e descrição.

view/omeka/site/item-set/browse.phtml

Template para listagem de coleções.

Como foi construído

Exibe grid de coleções com thumbnail, título e descrição. Utiliza as mesmas configurações de heading e body property que o browse de itens. Cada coleção é um link para sua página de detalhes.

view/omeka/site/index/search.phtml

Template para página de busca avançada. Documentado em detalhes em Recurso de pesquisa.

Estrutura de pastas do tema

sgm/
├── asset/ # Assets estáticos
│ ├── css/ # CSS compilado
│ ├── js/ # JavaScript
│ ├── img/ # Imagens
│ └── styles/ # Fontes CSS do Tailwind
├── config/ # Configurações
│ └── theme.ini # Configurações do tema
├── view/ # Templates PHP
│ ├── layout/ # Layout principal
│ │ ├── layout.phtml # Shell HTML base
│ │ └── page-render/ # Helpers de renderização
│ ├── common/ # Componentes reutilizáveis
│ │ ├── block-layout/ # Templates de blocos
│ │ ├── resources/ # Partials de recursos
│ │ └── *.phtml # Partials diversos
│ └── omeka/ # Templates do Omeka
│ └── site/ # Views públicas
│ ├── page/ # Páginas
│ ├── item/ # Itens
│ ├── item-set/ # Coleções
│ └── index/ # Index e busca

Essa organização modular separa claramente a lógica do layout base, blocos reutilizáveis, templates específicos do Omeka, e helpers de renderização.