Cabeçalho transparente
Este recurso não é um bloco. É um campo extra injetado no Omeka\Form\PageLayoutDataForm que grava a chave fixed_header em o:layout_data do SitePage. O valor é um booleano, e o tema do site decide como consumi-lo. O nome fixed_header ficou por motivo histórico, já que o tema SGM combina transparência com posição fixa no topo.
Como foi construído
Handler e evento
A implementação usa o SharedEventManager do Laminas. O anexo acontece em Module::attachListeners:
$pageHandler = new PageCustomFieldsHandler();
$sharedEventManager->attach(
\Omeka\Form\PageLayoutDataForm::class,
'form.add_elements',
[$pageHandler, 'handlePageLayoutForm']
);
A classe SGMBlocks\Service\Form\PageCustomFieldsHandler é instanciada direto, sem factory, e fica anexada ao evento form.add_elements do formulário alvo. O handler adiciona o elemento:
$form->add([
'type' => \Laminas\Form\Element\Checkbox::class,
'name' => 'o:layout_data[fixed_header]',
'options' => ['label' => 'Cabeçalho de página transparente?'],
'attributes' => ['id' => 'fixed-header'],
]);
Substituição de factory
O PageLayoutDataForm nativo do Omeka não dispara form.add_elements porque o core não injeta EventManager nele. Para resolver, o módulo registra em form_elements.factories:
'Omeka\Form\PageLayoutDataForm' => Service\Form\PageLayoutDataFormFactory::class,
A factory SGMBlocks\Service\Form\PageLayoutDataFormFactory instancia o formulário e injeta um EventManager antes de retornar, permitindo que o form.add_elements seja disparado durante o ciclo normal do formulário.
Persistência
O Omeka S trata o nome o:layout_data[fixed_header] como um input aninhado. Ao submeter o formulário, o array o:layout_data entra em SitePage::setLayoutData e é salvo no banco junto ao registro da página.
| Aspecto | Valor |
|---|---|
| Chave persistida | fixed_header dentro de o:layout_data do SitePage |
| Tipo do valor | Booleano. true quando marcado, false ou ausente quando desmarcado |
Atributo HTML id | fixed-header |
| Rótulo do campo | Cabeçalho de página transparente? |
Como usar como desenvolvedor
Ler o valor no tema
O consumo típico acontece no layout ou no template de exibição da página:
$layoutData = $page->layoutData();
$fixedHeader = !empty($layoutData['fixed_header']);
Com o booleano em mãos, o tema decide:
- Adicionar uma classe ao
<body>do layout, por exemplobody-fixed-header. - Passar a flag a um partial de cabeçalho e alternar a classe do
<header>. - Escolher entre dois parciais distintos, um para o cabeçalho transparente e outro para o cabeçalho opaco.
Mudar o rótulo ou o tipo do campo
Edite src/Service/Form/PageCustomFieldsHandler.php. O método handlePageLayoutForm recebe o evento e chama $form->add(...). Troque Checkbox por Radio ou Select conforme a necessidade.
Renomear a chave
Renomear fixed_header envolve três pontos:
- Alterar o
namenoPageCustomFieldsHandler. - Alterar a leitura no tema.
- Migrar os dados antigos. Como o valor vive em
o:layout_data, a migração pode ser feita com um script que carrega cadaSitePage, lêfixed_header, grava na nova chave e salva.
Adicionar validação
O PageLayoutDataForm também dispara form.add_input_filters. Para adicionar validação, anexe um listener ao mesmo alvo nesse evento. O SGMBlocks ainda não usa esse evento para o campo, mas o SiteCustomFieldsHandler::handleSiteSettingsFilters mostra o padrão para replicar.
Depurar
- Se o checkbox não aparece, confirme que o
module.config.phpregistraPageLayoutDataFormFactoryemform_elements.factoriese que o módulo está ativo. Sem a factory o evento não dispara. - Se o valor não persiste, confirme que o
nameestá no formatoo:layout_data[fixed_header]e que o Omeka está na versão^4.0.1. - Para inspecionar o payload, registre um log em
SitePage::setLayoutDataou usexdebugnoOmeka\Api\Adapter\SitePageAdapter.
Arquivos relacionados
Module.php. Anexa o handler aoSharedEventManager.src/Service/Form/PageCustomFieldsHandler.php. Define o campo.src/Service/Form/PageLayoutDataFormFactory.php. InjetaEventManagerno formulário nativo.config/module.config.php. Registra a substituição de factory.