Borang XOOPS
📝 Sistem Borang XOOPS> Penjanaan borang yang komprehensif, pengesahan dan pemaparan untuk modul XOOPS.---
Section titled “📝 Sistem Borang XOOPS> Penjanaan borang yang komprehensif, pengesahan dan pemaparan untuk modul XOOPS.---”Gambaran KeseluruhanSistem borang XOOPS menyediakan pendekatan berorientasikan objek yang berkuasa untuk mencipta borang HTML. Ia mengendalikan penjanaan borang, pengesahan, perlindungan CSRF dan pemaparan fleksibel dengan sokongan untuk pelbagai rangka kerja CSS.---
Section titled “Gambaran KeseluruhanSistem borang XOOPS menyediakan pendekatan berorientasikan objek yang berkuasa untuk mencipta borang HTML. Ia mengendalikan penjanaan borang, pengesahan, perlindungan CSRF dan pemaparan fleksibel dengan sokongan untuk pelbagai rangka kerja CSS.---”🚀 Mula Pantas### Penciptaan Borang Asas
Section titled “🚀 Mula Pantas### Penciptaan Borang Asas”php<?phpuse 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'));
// Renderecho $form->render();📦 Kelas Tingkatan### XoopsForm (Kelas Asas)Kelas asas abstrak untuk semua bentuk.
Section titled “📦 Kelas Tingkatan### XoopsForm (Kelas Asas)Kelas asas abstrak untuk semua bentuk.”php// 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);XoopsThemeFormKelas borang yang paling biasa digunakan, dipaparkan dengan penggayaan tema.
Section titled “XoopsThemeFormKelas borang yang paling biasa digunakan, dipaparkan dengan penggayaan tema.”php$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🧩 Elemen Bentuk### Input Teks
Section titled “🧩 Elemen Bentuk### Input Teks”php// 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"');Input Kata Laluan
Section titled “Input Kata Laluan”php$password = new XoopsFormPassword( 'Password', 'password', 50, // Size 255 // Max length);Textarea
Section titled “Textarea”php$textarea = new XoopsFormTextArea( 'Description', 'description', $defaultValue, 5, // Rows 60 // Cols);Pilih Dropdown
Section titled “Pilih Dropdown”php$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);Berbilang Pilih
Section titled “Berbilang Pilih”php$multiSelect = new XoopsFormSelect( 'Tags', 'tags[]', $selectedValues, 5, // Visible rows true // Multiple selection);$multiSelect->addOptionArray($tagOptions);Kotak semak
Section titled “Kotak semak”php// 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']);Butang Radio
Section titled “Butang Radio”php$radio = new XoopsFormRadio( 'Status', 'status', $defaultStatus);$radio->addOptionArray([ 'draft' => 'Draft', 'published' => 'Published', 'archived' => 'Archived']);Muat Naik Fail
Section titled “Muat Naik Fail”php$file = new XoopsFormFile( 'Upload Image', 'image', 1048576 // Max size in bytes (1MB));
// Multiple files$file->setExtra('multiple accept="image/*"');Medan Tersembunyi
Section titled “Medan Tersembunyi”php$hidden = new XoopsFormHidden('item_id', $itemId);
// CSRF Token (always include!)$token = new XoopsFormHiddenToken();Butang
Section titled “Butang”php// 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()"');Label (Paparan Sahaja)
Section titled “Label (Paparan Sahaja)”php$label = new XoopsFormLabel( 'Created', date('Y-m-d H:i:s', $item->getVar('created')));Pemilih Date/Time
Section titled “Pemilih Date/Time”php$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);WYSIWYG Editor
Section titled “WYSIWYG Editor”php$editor = new XoopsFormEditor( 'Content', 'content', [ 'name' => 'content', 'value' => $defaultContent, 'rows' => 15, 'cols' => 60, 'width' => '100%', 'height' => '400px' ], false, // No HTML allowed 'textarea' // Fallback editor);Dulang Elemen (Elemen Kumpulan)
Section titled “Dulang Elemen (Elemen Kumpulan)”php$tray = new XoopsFormElementTray('Date Range', ' - ');$tray->addElement(new XoopsFormTextDateSelect('', 'start_date', 10, $startDate));$tray->addElement(new XoopsFormTextDateSelect('', 'end_date', 10, $endDate));$form->addElement($tray);✅ Pengesahan Borang### Medan Diperlukan
Section titled “✅ Pengesahan Borang### Medan Diperlukan”php// 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);Pengesahan Tersuai
Section titled “Pengesahan Tersuai”php// Server-side validationif ($_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 }}Pengesahan Bahagian Pelanggan
Section titled “Pengesahan Bahagian Pelanggan”php$form->setExtra('onsubmit="return validateForm()"');javascriptfunction validateForm() { const name = document.forms['myform']['name'].value; if (name.trim() === '') { alert('Name is required'); return false; } return true;}🎨 Penyampai Tersuai### Bootstrap 5 Renderer
Section titled “🎨 Penyampai Tersuai### Bootstrap 5 Renderer”php// Register custom rendererXoopsFormRenderer::getInstance()->set( new XoopsFormRendererBootstrap5());
// Now all forms use Bootstrap 5 styling$form = new XoopsThemeForm('My Form', 'myform', 'process.php');Membuat Penyampai Tersuai
Section titled “Membuat Penyampai Tersuai”php<?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}🔐 Keselamatan### Perlindungan CSRFSentiasa sertakan token tersembunyi:
Section titled “🔐 Keselamatan### Perlindungan CSRFSentiasa sertakan token tersembunyi:”php$form->addElement(new XoopsFormHiddenToken());
// Or automatic with useToken parameter$form = new XoopsThemeForm('Form', 'form', 'action.php', 'post', true);Sahkan Token semasa Hantar
Section titled “Sahkan Token semasa Hantar”phpif (!$GLOBALS['xoopsSecurity']->check()) { redirect_header('index.php', 3, implode('<br>', $GLOBALS['xoopsSecurity']->getErrors())); exit;}Pembersihan Input
Section titled “Pembersihan Input”phpuse 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');📋 Contoh Lengkap
Section titled “📋 Contoh Lengkap”php<?phprequire_once dirname(__DIR__) . '/mainfile.php';
use XMF\Request;use XoopsFormButton;use XoopsFormHiddenToken;use XoopsFormRadio;use XoopsFormSelect;use XoopsFormText;use XoopsFormTextArea;use XoopsThemeForm;
// Process formif ($_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'));
// Displayrequire_once XOOPS_ROOT_PATH . '/header.php';
if (!empty($error)) { echo "<div class='errorMsg'>$error</div>";}
$form->display();
require_once XOOPS_ROOT_PATH . '/footer.php';🔗 Dokumentasi Berkaitan- Rujukan Elemen Bentuk
Section titled “🔗 Dokumentasi Berkaitan- Rujukan Elemen Bentuk”- Pengesahan Borang
- Penyampai Borang Tersuai
- Perlindungan CSRF
- Pembersihan Input---
#XOOPS #borang #pengesahan #keselamatan #ui #elemen