Formulários XOOPS
📝 Sistema de Formulários XOOPS
Seção intitulada “📝 Sistema de Formulários XOOPS”Geração completa de formulários, validação e renderização para módulos XOOPS.
Visão Geral
Seção intitulada “Visão Geral”O sistema de formulários XOOPS fornece uma abordagem poderosa e orientada a objetos para criar formulários HTML. Ele lida com geração de formulário, validação, proteção CSRF e renderização flexível com suporte para vários frameworks CSS.
🚀 Início Rápido
Seção intitulada “🚀 Início Rápido”Criação Básica de Formulário
Seção intitulada “Criação Básica de Formulário”<?phpuse XoopsFormButton;use XoopsFormHidden;use XoopsFormHiddenToken;use XoopsFormText;use XoopsThemeForm;
// Criar um formulário$form = new XoopsThemeForm( 'Formulário de Contato', // Título 'contact_form', // Nome 'submit.php', // Ação 'post', // Método true // Usar token);
// Adicionar elementos$form->addElement(new XoopsFormText('Nome', 'name', 50, 255, ''), true);$form->addElement(new XoopsFormText('Email', 'email', 50, 255, ''), true);$form->addElement(new XoopsFormTextArea('Mensagem', 'message', '', 5, 60), true);$form->addElement(new XoopsFormHiddenToken());$form->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
// Renderizarecho $form->render();📦 Classes de Formulário
Seção intitulada “📦 Classes de Formulário”XoopsForm (Classe Base)
Seção intitulada “XoopsForm (Classe Base)”A classe base abstrata para todos os formulários.
// Tipos de formulário disponíveis$simpleForm = new XoopsSimpleForm($title, $name, $action, $method);$themeForm = new XoopsThemeForm($title, $name, $action, $method, $addToken);$tableForm = new XoopsTableForm($title, $name, $action, $method, $addToken);XoopsThemeForm
Seção intitulada “XoopsThemeForm”A classe de formulário mais comumente usada, renderiza com estilo de tema.
$form = new XoopsThemeForm('Meu Formulário', 'myform', 'process.php', 'post', true);
// Métodos do formulário$form->addElement($element, $required = false);$form->insertElement($position, $element, $required = false);$form->getElement($name);$form->getElements();$form->setExtra($extra); // Atributos HTML extras$form->render();$form->display(); // Ecoar diretamente🧩 Elementos do Formulário
Seção intitulada “🧩 Elementos do Formulário”Entrada de Texto
Seção intitulada “Entrada de Texto”// Texto em uma linha$text = new XoopsFormText( 'Nome de Usuário', // Legenda 'username', // Nome 50, // Tamanho 255, // Comprimento máximo $defaultValue // Valor padrão);
// Com placeholder$text->setExtra('placeholder="Digite nome de usuário"');Entrada de Senha
Seção intitulada “Entrada de Senha”$password = new XoopsFormPassword( 'Senha', 'password', 50, // Tamanho 255 // Comprimento máximo);Textarea
Seção intitulada “Textarea”$textarea = new XoopsFormTextArea( 'Descrição', 'description', $defaultValue, 5, // Linhas 60 // Colunas);Dropdown de Seleção
Seção intitulada “Dropdown de Seleção”$select = new XoopsFormSelect( 'Categoria', 'category_id', $defaultValue, 1, // Tamanho (1 = dropdown) false // Múltiplo);
// Adicionar opções$select->addOption(1, 'Opção 1');$select->addOption(2, 'Opção 2');
// Ou adicionar array$options = [ 1 => 'Categoria A', 2 => 'Categoria B', 3 => 'Categoria C'];$select->addOptionArray($options);Multi-Seleção
Seção intitulada “Multi-Seleção”$multiSelect = new XoopsFormSelect( 'Tags', 'tags[]', $selectedValues, 5, // Linhas visíveis true // Seleção múltipla);$multiSelect->addOptionArray($tagOptions);Checkbox
Seção intitulada “Checkbox”// Checkbox único$checkbox = new XoopsFormCheckBox( 'Ativo', 'active', 1 // Marcado se valor corresponder);$checkbox->addOption(1, 'Ativar este recurso');
// Múltiplos checkboxes$checkboxGroup = new XoopsFormCheckBox( 'Recursos', 'features[]', $selectedFeatures);$checkboxGroup->addOptionArray([ 'comments' => 'Ativar Comentários', 'ratings' => 'Ativar Classificações', 'sharing' => 'Ativar Compartilhamento']);Botões de Rádio
Seção intitulada “Botões de Rádio”$radio = new XoopsFormRadio( 'Status', 'status', $defaultStatus);$radio->addOptionArray([ 'draft' => 'Rascunho', 'published' => 'Publicado', 'archived' => 'Arquivado']);Upload de Arquivo
Seção intitulada “Upload de Arquivo”$file = new XoopsFormFile( 'Carregar Imagem', 'image', 1048576 // Tamanho máximo em bytes (1MB));
// Múltiplos arquivos$file->setExtra('multiple accept="image/*"');Campo Oculto
Seção intitulada “Campo Oculto”$hidden = new XoopsFormHidden('item_id', $itemId);
// Token CSRF (sempre incluir!)$token = new XoopsFormHiddenToken();// Botão enviar$submit = new XoopsFormButton('', 'submit', _SUBMIT, 'submit');
// Botão redefinir$reset = new XoopsFormButton('', 'reset', _CANCEL, 'reset');
// Botão personalizado$custom = new XoopsFormButton('', 'preview', 'Prévia', 'button');$custom->setExtra('onclick="previewContent()"');Etiqueta (Somente Exibição)
Seção intitulada “Etiqueta (Somente Exibição)”$label = new XoopsFormLabel( 'Criado', date('Y-m-d H:i:s', $item->getVar('created')));Seletor de Data/Hora
Seção intitulada “Seletor de Data/Hora”$date = new XoopsFormDateTime( 'Data de Publicação', 'publish_date', 15, // Tamanho $timestamp // Timestamp padrão);
// Apenas data (entrada de texto)$dateText = new XoopsFormTextDateSelect( 'Data do Evento', 'event_date', 15, $timestamp);Editor WYSIWYG
Seção intitulada “Editor WYSIWYG”$editor = new XoopsFormEditor( 'Conteúdo', 'content', [ 'name' => 'content', 'value' => $defaultContent, 'rows' => 15, 'cols' => 60, 'width' => '100%', 'height' => '400px' ], false, // Sem HTML permitido 'textarea' // Editor de fallback);Bandeja de Elemento (Agrupar Elementos)
Seção intitulada “Bandeja de Elemento (Agrupar Elementos)”$tray = new XoopsFormElementTray('Intervalo de Datas', ' - ');$tray->addElement(new XoopsFormTextDateSelect('', 'start_date', 10, $startDate));$tray->addElement(new XoopsFormTextDateSelect('', 'end_date', 10, $endDate));$form->addElement($tray);✅ Validação de Formulário
Seção intitulada “✅ Validação de Formulário”Campos Obrigatórios
Seção intitulada “Campos Obrigatórios”// Marcar como obrigatório (segundo parâmetro)$form->addElement(new XoopsFormText('Nome', 'name', 50, 255, ''), true);
// Ou definir no elemento$element = new XoopsFormText('Email', 'email', 50, 255, '');$form->addElement($element, true);Validação Personalizada
Seção intitulada “Validação Personalizada”// Validação do lado do servidorif ($_SERVER['REQUEST_METHOD'] === 'POST') { // Verificar token CSRF if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('form.php', 3, 'Token de segurança inválido'); exit; }
// Obter entrada sanitizada $name = \Xmf\Request::getString('name', '', 'POST'); $email = \Xmf\Request::getString('email', '', 'POST');
$errors = [];
// Validar if (empty($name)) { $errors[] = 'Nome é obrigatório'; }
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Endereço de email inválido'; }
if (!empty($errors)) { // Mostrar erros foreach ($errors as $error) { echo "<div class='errorMsg'>$error</div>"; } } else { // Processar formulário }}Validação do Lado do Cliente
Seção intitulada “Validação do Lado do Cliente”$form->setExtra('onsubmit="return validateForm()"');function validateForm() { const name = document.forms['myform']['name'].value; if (name.trim() === '') { alert('Nome é obrigatório'); return false; } return true;}🎨 Renderizadores Personalizados
Seção intitulada “🎨 Renderizadores Personalizados”Renderizador Bootstrap 5
Seção intitulada “Renderizador Bootstrap 5”// Registrar renderizador personalizadoXoopsFormRenderer::getInstance()->set( new XoopsFormRendererBootstrap5());
// Agora todos os formulários usam estilo Bootstrap 5$form = new XoopsThemeForm('Meu Formulário', 'myform', 'process.php');Criar Renderizador Personalizado
Seção intitulada “Criar Renderizador Personalizado”<?php
class XoopsFormRendererBulma implements XoopsFormRendererInterface{ public function renderFormText(XoopsFormText $element): string { return sprintf( '<div class="field"> <label class="label">%s</label> <div class="control"> <input class="input" type="text" name="%s" value="%s" size="%d" maxlength="%d" %s> </div> </div>', $element->getCaption(), $element->getName(), htmlspecialchars($element->getValue(), ENT_QUOTES), $element->getSize(), $element->getMaxlength(), $element->getExtra() ); }
public function renderFormSelect(XoopsFormSelect $element): string { $html = sprintf( '<div class="field"> <label class="label">%s</label> <div class="control"> <div class="select"> <select name="%s" %s>', $element->getCaption(), $element->getName(), $element->getExtra() );
foreach ($element->getOptions() as $value => $label) { $selected = ($value == $element->getValue()) ? ' selected' : ''; $html .= sprintf( '<option value="%s"%s>%s</option>', htmlspecialchars($value, ENT_QUOTES), $selected, htmlspecialchars($label, ENT_QUOTES) ); }
$html .= '</select></div></div></div>';
return $html; }
// ... implementar outros métodos de renderização}🔐 Segurança
Seção intitulada “🔐 Segurança”Proteção CSRF
Seção intitulada “Proteção CSRF”Sempre incluir o token oculto:
$form->addElement(new XoopsFormHiddenToken());
// Ou automático com parâmetro useToken$form = new XoopsThemeForm('Formulário', 'form', 'action.php', 'post', true);Verificar Token ao Enviar
Seção intitulada “Verificar Token ao Enviar”if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('index.php', 3, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors())); exit;}Sanitização de Entrada
Seção intitulada “Sanitização de Entrada”use Xmf\Request;
// Sempre sanitizar entrada$string = Request::getString('field', 'default', 'POST');$int = Request::getInt('id', 0, 'POST');$array = Request::getArray('items', [], 'POST');$email = Request::getEmail('email', '', 'POST');$url = Request::getUrl('website', '', 'POST');📋 Exemplo Completo
Seção intitulada “📋 Exemplo Completo”<?phprequire_once dirname(__DIR__) . '/mainfile.php';
use Xmf\Request;use XoopsFormButton;use XoopsFormHiddenToken;use XoopsFormRadio;use XoopsFormSelect;use XoopsFormText;use XoopsFormTextArea;use XoopsThemeForm;
// Processar formulárioif ($_SERVER['REQUEST_METHOD'] === 'POST') { // Verificar CSRF if (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('form.php', 3, 'Token de segurança inválido'); exit; }
// Obter e validar entrada $title = Request::getString('title', '', 'POST'); $content = Request::getText('content', '', 'POST'); $categoryId = Request::getInt('category_id', 0, 'POST'); $status = Request::getString('status', 'draft', 'POST');
if (empty($title)) { $error = 'Título é obrigatório'; } else { // Salvar no banco de dados $itemHandler = xoops_getModuleHandler('item', 'mymodule'); $item = $itemHandler->create(); $item->setVar('title', $title); $item->setVar('content', $content); $item->setVar('category_id', $categoryId); $item->setVar('status', $status); $item->setVar('created', time());
if ($itemHandler->insert($item)) { redirect_header('index.php', 2, 'Item salvo com sucesso'); exit; } else { $error = 'Erro ao salvar item'; } }}
// Obter categorias para dropdown$categoryHandler = xoops_getModuleHandler('category', 'mymodule');$categories = $categoryHandler->getList();
// Construir formulário$form = new XoopsThemeForm('Adicionar Novo Item', 'item_form', 'form.php', 'post', true);
$form->addElement(new XoopsFormText('Título', 'title', 50, 255, $title ?? ''), true);
$categorySelect = new XoopsFormSelect('Categoria', 'category_id', $categoryId ?? 0);$categorySelect->addOptionArray($categories);$form->addElement($categorySelect, true);
$form->addElement(new XoopsFormTextArea('Conteúdo', 'content', $content ?? '', 10, 60));
$statusRadio = new XoopsFormRadio('Status', 'status', $status ?? 'draft');$statusRadio->addOptionArray([ 'draft' => 'Rascunho', 'published' => 'Publicado']);$form->addElement($statusRadio);
$form->addElement(new XoopsFormHiddenToken());$form->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
// Exibirrequire_once XOOPS_ROOT_PATH . '/header.php';
if (!empty($error)) { echo "<div class='errorMsg'>$error</div>";}
$form->display();
require_once XOOPS_ROOT_PATH . '/footer.php';🔗 Documentação Relacionada
Seção intitulada “🔗 Documentação Relacionada”- Referência de Elementos de Formulário
- Validação de Formulário
- Renderizadores de Formulário Personalizados
- Proteção CSRF
- Sanitização de Entrada
#xoops #formulários #validação #segurança #ui #elementos