-
Intake: req-088.md
-
Alvo de validação: VALIDATION-CHECKLIST.md#batch-088
-
Decisão: DEC-089
-
Base: clone de
gestor/modulos/forms/(→forms-search) egestor/modulos/publisher-index/(→pages-index). -
Fora de escopo: req-089 (outro agente). Este batch trata apenas o req-088.
Decisões de arquitetura (confirmadas com o Engenheiro Chefe)
-
Analytics de busca: o registro em
forms_search_submissionsacontece no widgetpages-index, sempre que ele processa uma busca — tanto no page load (?search=termo) quanto no AJAX de busca da própria página de resultados. A função registradora (forms_search_registrar_busca()) vive noforms-search(dono da tabela) e é invocada pelopages-indexcom guardfunction_exists(desacoplamento leve; se o forms-search não existir, o pages-index segue funcionando). -
Forma do widget
forms-search: mantém a dinamicidade de campos doforms(renderizador defields_schema.fields[]), porém o<form>público usamethod="get"eaction= página alvo. Opages-indexsó interpreta o parâmetrosearch; campos adicionais futuros entram apenas editando os modelos, sem refazer a metodologia. O widget de busca NÃO usa o controlador AJAX/reCAPTCHA doforms(submit é navegação nativa GET).
Escopo
1 — Módulo pages-index (clone de publisher-index)
-
Renomear: id
publisher-index→pages-index, tabelapublisher_index→pages_index, id_numéricoid_publisher_index→id_pages_index, funções/arquivos/JS correspondentes. -
Remover o conceito de
publisher_id; a consulta passa a ser direta à tabelapaginas:WHERE status='A' AND language='$language' AND tipo='pagina' AND sem_permissao=1. -
Busca: intercepta GET
search; filtranome LIKE '%termo%' OR html LIKE '%termo%'. Ordenação portitle_asc|title_desc|date_asc|date_desc(data =data_modificacao). -
Variáveis de item fixas (em
pages_index_widget_render_itens):[[item#title]]=nome;[[item#summary]]=strip_tags(html)truncado ~200 chars;[[item#url]]=url-raiz+caminho. -
Remover curadoria manual / tipos-de-campo-imagem / JOIN em
publisher_pages(não se aplicam). -
Registrar busca em
forms_search_submissions(page load + AJAX) via helper do forms-search. -
Página semente pública
pages-index/declarada no manifest (type: pagina,without_permission: 1), com o widgetpages-indexembutido, para servir de destino padrão de buscas globais.
2 — Módulo forms-search (clone de forms)
-
Renomear: id
forms→forms-search, tabelaforms→forms_search,forms_submissions→forms_search_submissions, id_numéricoid_forms→id_forms_search, funções/arquivos/JS correspondentes. -
Widget público (
forms-search.widget.php): renderiza<form method="get" action="{url-raiz}{alvo}">, mantém o renderizador de campos, garante o camponame="search". Sem controlador AJAX/reCAPTCHA. -
Config do alvo no admin: o
fields_schema.form_actionguarda a página/URL alvo doaction(campo já existente no schema do forms; reaproveitado como destino da busca). -
Helper de analytics:
forms_search_registrar_busca($termo, $form_id=null)grava emforms_search_submissions(consumido pelopages-index).
3 — Banco de dados
-
Migração
20260715120000_create_forms_search_and_pages_index_tables.phpcriando:-
forms_search(espelhaformsjá com html/css/css_compiled/html_extra_head). -
forms_search_submissions(espelhaforms_submissions). -
pages_index(espelhapublisher_indexsempublisher_id, PKid_pages_index).
-
4 — Registro dos módulos
-
gestor/db/data/ModulosData.json+UsuariosPerfisModulosData.json(pt-br + en) para os 2 módulos. -
Manifests
pages-index.json/forms-search.jsondeclaram tabela (config/natural_key), widgets, templates, pages, ai_modes, variables (o pipeline popula os *Data.json derivados).
Validação
-
Estática:
php -lem todos os PHP novos;node --checknos JS novos; JSON válido nos manifests/data. -
composer testsem regressão (76/76 baseline). -
Runtime (deploy
Update => Core+ migração): pendente com o operador — widgets listados, páginapages-index/gerada, form GET envia?search=para o alvo, resultados exibidos, log gravado.
Notas de checksums/versão
-
Recursos novos nascem com
version: "1.0"e checksums vazios; o compilador recalcula no deploy (ver MEMORIA-ENGENHARIA-EXECUCAO — não editar checksums manualmente).