Poniżej przedstawiony jest przykładowy kod zajmujący się obsługą formularza za pomocą OPF:
<?php define('OPF_DIR', '../lib/'); define('OPT_DIR', '../../../opt-dev/www/lib/'); require(OPT_DIR.'opt.class.php'); require(OPF_DIR.'opf.class.php'); $userTable = array( 'user1' => 'pass1', 'user2' => 'pass2', 'user3' => 'pass3' ); class myForm extends opfVirtualForm { public function create() { $this -> map('username', new opfStandardContainer( new opfConstraint(MAP_TYPE, TYPE_STRING), new opfConstraint(MAP_LEN_GT, 3) ), false); $this -> map('password', new opfStandardContainer( new opfConstraint(MAP_TYPE, TYPE_STRING), new opfConstraint(MAP_LEN_GT, 3), new opfConstraint(MAP_PERMITTEDCHARS, 'abcdefghijklmnopqrstuvwxyz0123456789') ), false); $this -> map('email', new opfStandardContainer( new opfConstraint(MAP_TYPE, TYPE_STRING), new opfConstraint(MAP_MATCHTO, OPF_MAIL_PATTERN) ), false); $this -> map('age', new opfStandardContainer( new opfConstraint(MAP_TYPE, TYPE_INTEGER), new opfConstraint(MAP_SCOPE, 12, 99) ), false); $this -> map('content', new opfStandardContainer( new opfConstraint(MAP_TYPE, TYPE_TEXT), new opfConstraint(MAP_LEN_GT, 10) ), false); } // end create(); public function process() { global $userTable; if(isset($userTable[$this -> validator -> username]) && $userTable[$this -> validator -> username] == $this -> validator -> password) { return true; } $this -> setError('username', 'opf', 'invaliduser'); return false; } // end process(); } try { require('./include.php'); $tpl = new optClass; $tpl -> loadConfig('./config.php'); $tpl -> setMasterPage('master.tpl'); $validator = new opfValidator(); $opf = new opfClass($tpl, $validator->defaultParams()); $opf -> createI18n('./'); $form = new myForm($opf, 'form1'); if($form -> execute()) { $tpl -> assign('username', $validator -> username); $tpl -> assign('email', $validator -> email); $tpl -> assign('age', $validator -> age); $tpl -> assign('content', $validator -> content); $tpl -> parse('report.tpl'); } else { if($form -> invalid()) { $tpl -> assign('error_msg', 1); } $tpl -> parse('test_forms_1.tpl'); } } catch(opfException $exception) { opfErrorHandler($exception); } catch(optException $exception) { optErrorHandler($exception); } ?>
Formularz jest tutaj reprezentowany przez klasę dziedziczącą po opfVirtualForm zawierającej całą mechanikę. My musimy jedynie ustawić definicje kontroli wszystkich pól oraz ewentualnie dopisać własne procedury sprawdzające w metodzie process(). Wyświetlanie formularza możemy także wprowadzić bezpośrednio do klasy w metodę view() lub umieścić poza nią, jak na przykładzie. Całą mechaniką, tj. odświeżaniem formularza w przypadku błędnego wypełnienia, wyglądem, wstawianiem domyślnych wartości, wyświetlaniem komunikatów o błędach itd. zarządza OPF.
Szablon z formularzem zbudowany jest z komponentów dostarczanych przez OPF.
{* Definition of CSS classes for the components *} {$opfDesign->setDesign('row', '', 'revert')} {$opfDesign->setDesign('input', 'insert', 'incorrect')} {$opfDesign->setDesign('textarea', 'insert', 'incorrect')} <html> <head> <title>Forms</title> <link rel="stylesheet" href="style.css" type="text/css" /> </head> <body> <opt:if test="$error_msg"> <p>The form has been incorrectly filled in.</p> </opt:if> <opf:form method="post" action="`test_forms_4.php`" name="form1"> <table class="form" width="100%"> <tr opf:classfor="username"> <td>Username</td> <td><opt:opfInput name="username"><opt:load event="aMessage"/></opt:opfInput></td> </tr> <tr opf:classfor="password"> <td>Password</td> <td><opt:opfPassword name="password"><opt:load event="aMessage"/></opt:opfPassword></td> </tr> <tr opf:classfor="email"> <td>E-mail</td> <td><opt:opfInput name="email"><opt:load event="aMessage"/></opt:opfInput></td> </tr> <tr opf:classfor="age"> <td>Age</td> <td><opt:opfInput name="age"><opt:load event="aMessage"/></opt:opfInput></td> </tr> <tr opf:classfor="content"> <td>Content</td> <td><opt:opfTextarea name="content" rows="3" cols="50"><opt:load event="aMessage"/></opt:opfTextarea></td> </tr> <tr> <td></td> <td><input type="submit" value="OK"/></td> </tr> </table> </opf:form> </body> </html>
OPF umożliwia zdefiniowanie wyglądu poszczególnych elementów formularza za pomocą obiektu $opfDesign. Wprowadzamy tam nazwę interesującego nas typu pola, a następnie określamy domyślną klasę CSS oraz klasę w przypadku, gdy pole jest błędne. Dzięki atrybutowi opf:classfor można także wpływać na wygląd całych wierszy.
Jest jeszcze jedna ważna informacja. Na początku lutego zgłosił się do mnie jeden z użytkowników forum projektu, destroyer i zaczął wypytywać o dalsze plany rozwoju. Szybko wyszło na jaw, że przestudiował dość dokładnie kody źródłowe OPT oraz OPF i jest zainteresowany aktywną pomocą. Ustaliliśmy, że na razie zajmie się doszlifowaniem OPF, a w szczególności stworzeniem javascriptowej części tej biblioteki. Zobaczymy, co z tego wyniknie, ale jestem dobrej myśli :).







Napisał Bob w poniedziałek, 26 lutego 2007 o 10:33
Nie myślałeś kiedyś żeby błędy nie wciskać przez php a wczytywać np. z xmla? Moim zdaniem czytelniejsze a jeżeli potrzeba można zawsze dodatkowo ustawiać przez php.
Przykładowo:
<restrictions>
<field name="login">
<string minlength="1" maxlength="10" />
<compulsory />
</field>
<field name="pass">
<noinsertvalue />
<compulsory />
</field>
<field name="pass2">
<compare name="pass" />
</field>
<errors>
<errmessage name="login" test="string">Długość pomiędzy 1 a 10 znaków.</errmessage>
<errmessage name="login" test="compulsory">Pole jest wymagane.</errmessage>
<errmessage name="pass" test="compulsory">Pole jest wymagane.</errmessage>
<errmessage name="pass2" test="compare">Pola różnią się.</errmessage>
</errors>
</restrictions>