Přeskočit na obsah

Formuláře XOOPS

📝 Formulářový systém XOOPS

Sekce “📝 Formulářový systém XOOPS”

Komplexní generování, ověřování a vykreslování formulářů pro moduly XOOPS.


Formulářový systém XOOPS poskytuje výkonný, objektově orientovaný přístup k vytváření formulářů HTML. Zvládá generování formulářů, ověřování, ochranu CSRF a flexibilní vykreslování s podporou různých rámců CSS.


Vytvoření základního formuláře

Sekce “Vytvoření základního formuláře”
<?php
use XOOPSFormButton;
use XOOPSFormHidden;
use XOOPSFormHiddenToken;
use XOOPSFormText;
use XOOPSThemeForm;
// Create a form
$form = new XOOPSThemeForm(
'Contact Form', // Title
'contact_form', // Name
'submit.php', // Action
'post', // Method
true // Use token
);
// Add elements
$form->addElement(new XOOPSFormText('Name', 'name', 50, 255, ''), true);
$form->addElement(new XOOPSFormText('Email', 'email', 50, 255, ''), true);
$form->addElement(new XOOPSFormTextArea('Message', 'message', '', 5, 60), true);
$form->addElement(new XOOPSFormHiddenToken());
$form->addElement(new XOOPSFormButton('', 'submit', _SUBMIT, 'submit'));
// Render
echo $form->render();

📦 Třídy formulářů

Sekce “📦 Třídy formulářů”

XOOPSForm (základní třída)

Sekce “XOOPSForm (základní třída)”

Abstraktní základní třída pro všechny formy.

// Available form types
$simpleForm = new XOOPSSimpleForm($title, $name, $action, $method);
$themeForm = new XOOPSThemeForm($title, $name, $action, $method, $addToken);
$tableForm = new XOOPSTableForm($title, $name, $action, $method, $addToken);

Nejčastěji používaná třída formulářů, rendery se styly motivu.

$form = new XOOPSThemeForm('My Form', 'myform', 'process.php', 'post', true);
// Form methods
$form->addElement($element, $required = false);
$form->insertElement($position, $element, $required = false);
$form->getElement($name);
$form->getElements();
$form->setExtra($extra); // Extra HTML attributes
$form->render();
$form->display(); // Echo directly

// Single-line text
$text = new XOOPSFormText(
'Username', // Caption
'username', // Name
50, // Size
255, // Max length
$defaultValue // Default value
);
// With placeholder
$text->setExtra('placeholder="Enter username"');
$password = new XOOPSFormPassword(
'Password',
'password',
50, // Size
255 // Max length
);
$textarea = new XOOPSFormTextArea(
'Description',
'description',
$defaultValue,
5, // Rows
60 // Cols
);

Vyberte rozbalovací nabídku

Sekce “Vyberte rozbalovací nabídku”
$select = new XOOPSFormSelect(
'Category',
'category_id',
$defaultValue,
1, // Size (1 = dropdown)
false // Multiple
);
// Add options
$select->addOption(1, 'Option 1');
$select->addOption(2, 'Option 2');
// Or add array
$options = [
1 => 'Category A',
2 => 'Category B',
3 => 'Category C'
];
$select->addOptionArray($options);
$multiSelect = new XOOPSFormSelect(
'Tags',
'tags[]',
$selectedValues,
5, // Visible rows
true // Multiple selection
);
$multiSelect->addOptionArray($tagOptions);

Zaškrtávací políčko

Sekce “Zaškrtávací políčko”
// Single checkbox
$checkbox = new XOOPSFormCheckBox(
'Active',
'active',
1 // Checked if value matches
);
$checkbox->addOption(1, 'Enable this feature');
// Multiple checkboxes
$checkboxGroup = new XOOPSFormCheckBox(
'Features',
'features[]',
$selectedFeatures
);
$checkboxGroup->addOptionArray([
'comments' => 'Enable Comments',
'ratings' => 'Enable Ratings',
'sharing' => 'Enable Sharing'
]);
$radio = new XOOPSFormRadio(
'Status',
'status',
$defaultStatus
);
$radio->addOptionArray([
'draft' => 'Draft',
'published' => 'Published',
'archived' => 'Archived'
]);
$file = new XOOPSFormFile(
'Upload Image',
'image',
1048576 // Max size in bytes (1MB)
);
// Multiple files
$file->setExtra('multiple accept="image/*"');
$hidden = new XOOPSFormHidden('item_id', $itemId);
// CSRF Token (always include!)
$token = new XOOPSFormHiddenToken();
// Submit button
$submit = new XOOPSFormButton('', 'submit', _SUBMIT, 'submit');
// Reset button
$reset = new XOOPSFormButton('', 'reset', _CANCEL, 'reset');
// Custom button
$custom = new XOOPSFormButton('', 'preview', 'Preview', 'button');
$custom->setExtra('onclick="previewContent()"');

Štítek (pouze zobrazení)

Sekce “Štítek (pouze zobrazení)”
$label = new XOOPSFormLabel(
'Created',
date('Y-m-d H:i:s', $item->getVar('created'))
);
$date = new XOOPSFormDateTime(
'Publish Date',
'publish_date',
15, // Size
$timestamp // Default timestamp
);
// Date only (text input)
$dateText = new XOOPSFormTextDateSelect(
'Event Date',
'event_date',
15,
$timestamp
);
$editor = new XOOPSFormEditor(
'Content',
'content',
[
'name' => 'content',
'value' => $defaultContent,
'rows' => 15,
'cols' => 60,
'width' => '100%',
'height' => '400px'
],
false, // No HTML allowed
'textarea' // Fallback editor
);

Panel prvků (prvky skupiny)

Sekce “Panel prvků (prvky skupiny)”
$tray = new XOOPSFormElementTray('Date Range', ' - ');
$tray->addElement(new XOOPSFormTextDateSelect('', 'start_date', 10, $startDate));
$tray->addElement(new XOOPSFormTextDateSelect('', 'end_date', 10, $endDate));
$form->addElement($tray);

✅ Ověření formuláře

Sekce “✅ Ověření formuláře”
// Mark as required (second parameter)
$form->addElement(new XOOPSFormText('Name', 'name', 50, 255, ''), true);
// Or set on element
$element = new XOOPSFormText('Email', 'email', 50, 255, '');
$form->addElement($element, true);
// Server-side validation
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Verify CSRF token
if (!$GLOBALS['xoopsSecurity']->check()) {
redirect_header('form.php', 3, 'Security token invalid');
exit;
}
// Get sanitized input
$name = \XMF\Request::getString('name', '', 'POST');
$email = \XMF\Request::getString('email', '', 'POST');
$errors = [];
// Validate
if (empty($name)) {
$errors[] = 'Name is required';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'Invalid email address';
}
if (!empty($errors)) {
// Show errors
foreach ($errors as $error) {
echo "<div class='errorMsg'>$error</div>";
}
} else {
// Process form
}
}

Ověření na straně klienta

Sekce “Ověření na straně klienta”
$form->setExtra('onsubmit="return validateForm()"');
function validateForm() {
const name = document.forms['myform']['name'].value;
if (name.trim() === '') {
alert('Name is required');
return false;
}
return true;
}

// Register custom renderer
XOOPSFormRenderer::getInstance()->set(
new XOOPSFormRendererBootstrap5()
);
// Now all forms use Bootstrap 5 styling
$form = new XOOPSThemeForm('My Form', 'myform', 'process.php');

Vytvoření vlastního vykreslovače

Sekce “Vytvoření vlastního vykreslovače”
<?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;
}
// ... implement other render methods
}

Vždy zahrňte skrytý token:

$form->addElement(new XOOPSFormHiddenToken());
// Or automatic with useToken parameter
$form = new XOOPSThemeForm('Form', 'form', 'action.php', 'post', true);

Při odeslání ověřte token

Sekce “Při odeslání ověřte token”
if (!$GLOBALS['xoopsSecurity']->check()) {
redirect_header('index.php', 3, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors()));
exit;
}
use XMF\Request;
// Always sanitize input
$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');

<?php
require_once dirname(__DIR__) . '/mainfile.php';
use XMF\Request;
use XOOPSFormButton;
use XOOPSFormHiddenToken;
use XOOPSFormRadio;
use XOOPSFormSelect;
use XOOPSFormText;
use XOOPSFormTextArea;
use XOOPSThemeForm;
// Process form
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Verify CSRF
if (!$GLOBALS['xoopsSecurity']->check()) {
redirect_header('form.php', 3, 'Invalid security token');
exit;
}
// Get and validate input
$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 = 'Title is required';
} else {
// Save to database
$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 saved successfully');
exit;
} else {
$error = 'Error saving item';
}
}
}
// Get categories for dropdown
$categoryHandler = xoops_getModuleHandler('category', 'mymodule');
$categories = $categoryHandler->getList();
// Build form
$form = new XOOPSThemeForm('Add New Item', 'item_form', 'form.php', 'post', true);
$form->addElement(new XOOPSFormText('Title', 'title', 50, 255, $title ?? ''), true);
$categorySelect = new XOOPSFormSelect('Category', 'category_id', $categoryId ?? 0);
$categorySelect->addOptionArray($categories);
$form->addElement($categorySelect, true);
$form->addElement(new XOOPSFormTextArea('Content', 'content', $content ?? '', 10, 60));
$statusRadio = new XOOPSFormRadio('Status', 'status', $status ?? 'draft');
$statusRadio->addOptionArray([
'draft' => 'Draft',
'published' => 'Published'
]);
$form->addElement($statusRadio);
$form->addElement(new XOOPSFormHiddenToken());
$form->addElement(new XOOPSFormButton('', 'submit', _SUBMIT, 'submit'));
// Display
require_once XOOPS_ROOT_PATH . '/header.php';
if (!empty($error)) {
echo "<div class='errorMsg'>$error</div>";
}
$form->display();
require_once XOOPS_ROOT_PATH . '/footer.php';

🔗 Související dokumentace

Sekce “🔗 Související dokumentace”
  • Odkaz na prvky formuláře
  • Ověření formuláře
  • Custom Form Renderers
  • Ochrana CSRF
  • Dezinfekce vstupu

#xoops #formuláře #ověření #zabezpečení #ui #prvky