Dziś jest poniedziałek, 13 października 2008 roku (z kalendarza...)

Przebudowa OPF

Icon

26.02.2007, 08:53

Projekty

Komentarze (3)

Powrót

Open Power Forms, pierwszy (acz jeszcze niewydany) oficjalny dodatek do systemu szablonów OPT, przeszedł ostatnio dość sporą rewolucję, a właściwie odchudzenie. Przyglądając się Zend Frameworkowi oraz rozmawiając trochę z eXtremem, zdecydowałem się usunąć z projektu przeciętne moduły requesta, routery oraz response, których obecność nie tylko spowalniała prace, ale także utrudniała integrację z wyżej wymienionym frameworkiem. Pozostał system kontroli danych (teraz bardziej skalowalny, bo można do niego podpinać dowolny rodzaj danych), pełna obsługa formularzy, wsparcie dla AJAX i klasa gromadzenia danych o internaucie ze świetnym wykrywaczem przeglądarek i systemów operacyjnych. Rozluźniona także została integracja z samym OPT, aczkolwiek nie oznacza to, że biblioteka nagle jakimś magicznym sposobem zdoła zadziałać bez niego :).

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 :).

Powrót

Komentarze

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>

Napisał Zyx w poniedziałek, 26 lutego 2007 o 21:15

Parsowanie XML-a nie jest najszczęśliwszą alternatywą, jeśli chodzi o wydajność. Nie mówię jednak "nie" temu pomysłowi. Po prostu teraz są ważniejsze rzeczy do zrobienia. Jeśli już się tym zajmiemy, będzie to mieć postać dodatkowej nakładki, ładowanej osobno i osobno inicjowanej, aby nie obciążać skryptu u tych, którzy nie chcą z XML-a korzystać.

Osobna sprawa to odwzorowanie dostępnych testów w XML-u. OPF nie ogranicza się do domyślnej klasy opfConstraint - programista może równie dobrze napisać własne sprawdzaczki.

Napisał Zyx w niedzielę, 4 marca 2007 o 21:04

Jeśli ktoś jest zainteresowany, dostępny jest aktualny snapshot kodu źródłowego, a nowa wersja jest na SVN:

http://www.openpb.net/snaps/opf-20060304.tar.gz

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia