Home-Produkte-Testarea-Kontakt-Aktualisiert: 17-Jan-2014
< Voriger Tag   Nächster Tag >

Sonntag, 29. April 2012

PHP: HTML-Formulare mit Funktionen oder Klassen verarbeiten?

Im Playground verschiedene Techniken zur Ausgabe und Verarbeitung von HTML-Formularen mit PHP. Eine komfortable Variante besteht darin, die Form-Elemente in Arrays zu beschreiben und aus dieser Beschreibung die Objekte zu generieren.

Register Login

In den Beispielen wird ein HTML-Formular zum Registrieren eines Logins benutzt.

 
Register login

Login               :
Password            :
Password repeat     :
Favourite languages : [Assembler, C, Fortran, ...]
Computerfreak       : [x]
Comment             :

HTML

html ist das Formular in HTML5.

<form action='index.html' method='post'>
    Login:<br />
    <input type='text' name='login' value='' size='10' /><br />

    Password:<br />
    <input type='password' name='password' value='' size='10' /><br />
[...]

PHP - Direkt

In direct werden die Eingaben direkt mit PHP verarbeitet. Bis auf escapeHTML() als Wrapper für htmlspecialchars() werden keine zusätzlichen Funktionen oder Klassen benutzt.

// Login
if(isset($_POST['login'])) {
    $user->login = trim($_POST['login']);
    if(!preg_match('/^[a-z]+$/', $user->login)) {
        $errors[] = 'Login: Only the characters a-z are allowed for the login name.';
    }
    // TODO Check length
}

[...] 
    Login:<br />
    <input type='text' name='login' value='<?= escapeHTML($user->login) ?>' size='10' /><br />

Wenn gleich zu Beginn die Default-Werte für die Formular-Eingaben gesetzt werden, können die späteren isset()-Abfragen entfallen -- womit die Verarbeitung übersichtlicher wird.

// Login
if(!preg_match('/^[a-z]+$/', $user->login)) {
    $errors[] = 'Login: Only the characters a-z are allowed for the login name.';
}
// TODO Check length

Funktionen

In function werden Funktionen zur Verarbeitung und Ausgabe des HTML-Formulars benutzt. Bereits damit ist die Verarbeitung von HTML-Formularen komfortabel.

Nachteil ist die Nutzung von globalen Variablen wie $errors[], um den Zustand zu speichern und für aussagekräftige Fehlermeldungen müsste zusätzlich zumindest immer der displayName des Feldes wie 'Login' übergeben werden, während ein Objekt den displayName selbst kennt.

 
// Login
$user->login = getPost('login', $user->login);

validateMatch    ($user->login, '/^[a-z]+$/', $errors, 'Login: Must contain only the characters a-z.');
validateMaxLength($user->login, 8,            $errors, 'Login: Maximum length is %d characters.');

[...] 

Login:<br />
<?= formText('login', $user->login, 10) ?><br />

OOP - addField()

In oop_object werden Klassen zur Verarbeitung und Ausgabe des HTML-Formulars benutzt.

Die Programmierung der Klassen bedeutet zunächst einmal Overhead gegenüber den Funktionen und die Deklaration der Formularfelder ist durch die new FormObject(...)-Aufrufe umständlich.

Vorteil ist die Speicherung des Zustands in den Objekten.

 
$form->addField(new FormText('login', $user->login, ['displayName' => 'Login', 'size' => 10]),
               [new ValidateMaxLength(8),
                new ValidateMatch('/^[a-z]+$/')]);

[...]

Login:<br />
<?= $form->display('login'); ?><br />

OOP - Array

In oop_array werden die Formularfelder in Arrays deklariert -- mit der Short-Array-Syntax ab PHP 5.4 ist dies übersichtlich. Aus dieser Beschreibung werden die Objekte generiert.

Die Vorteile sind die übersichtliche Beschreibung der Elemente und die Speicherung der Zustände in den Objekten.

 
//   Field              Name              Value
// ------------------------------------------------------
    ['Text',            'login',          $user->login,
        ['displayName' => 'Login', 'size'  => 10],            // Options
        ['maxLength'   => 8,       'match' => '/^[a-z]+$/']], // Rules

[...]

Login:<br />
<?= $form->display('login'); ?><br />

[Direktlink]

< Voriger Tag   Nächster Tag >

  RSS V0.91

<April 2012 >
      01
02030405060708
09101112131415
16171819202122
23242526272829
30      

Home-Produkte-Testarea-Kontakt-Aktualisiert: 17-Jan-2014
(C) 2000-2014 by Sven Drieling