Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

Formulare complexe in cativa pasi QuickForm & Smarty
Vezi mesajul original
Du-te la pagina 1, 2  Următoare
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> PHP Avansat
Subiectul anterior :: Subiectul următor  
Autor Mesaj
Emil



Data înscrierii: 16/Noi/2003
Mesaje: 301
Locație: echo $REMOTE_ADDR

Trimis: Dum Mai 09, 2004 3:52 am    Titlul subiectului: Formulare complexe in cativa pasi QuickForm & Smarty  

De curand am fost pus in situatia de a face niste formulare imense pentru aplicatia la care lucrez. Mentionez ca toata aplicatia este bazata pe pachete PEAR si SMARTY ca template engine si clase "home made".
Aveam ceva experienta cu pachetul QuickForm folosindu-l cu rezultate bune in mai multe ipostaze.
Cateva date despre QuickForm :
- Este un pachet PEAR care creeaza formulare de orice tip si de asemenea validari de orice fel pentru input-uri. Validarile pot fi de orice fel server side / sau client side (cu ajutorul JavaScript) . Pachetul contine cateva reguli (rules) de validare uzuale (numeric ,email, regex,alfanumeric etc , le obtineti numele cu metoda HTML_QuickForm::getRegisteredRules()) sau validari proprii prin "callback",adica prin folosirea unei functii custom ce este apelata in momentul validarii unuia sau a mai multor input-uri . Toate acestea fara nici un pic de cod HTML , ba chiar output-ul este valid XHTML.

Sa luam ca exemplu un formular simplu de inregistrare cu 4 field-uri :
- username
- email
- password
- verificare parola
- butonul de Submit
- butonul de Reset

Exemplul este prezentat mai jos :

<?PHP //fisierele incluse  require_once 'HTML/QuickForm.php'; $form = new HTML_QuickForm('numeform','post',"$PHP_SELF",'_parent','enctype="multipart/form-data"'); //adaugam primul field - username  $form->addElement('text', 'username', 'Username', array('size' => 20, 'maxlength' => 20 ,'class'=>'formElements')); //field-ul pentru email  $form->addElement('text', 'email', 'Adresa de mail', array('size' => 20, 'maxlength' => 20 ,'class'=>'formElements')); //field-ul pentru  parola  $form->addElement('password', 'password', 'Parola', array('size' => 20, 'maxlength' => 45 ,'class'=>'formElements')); //field-ul prntru verificarea parolei  $form->addElement('password', 'password2', 'Reintroduceti parola', array('size' => 20, 'maxlength' => 45 ,'class'=>'formElements')); //butonul de Submit $form->addElement('submit', null, 'Trimite informatiile','class=formButtons'); //butonul Reset $form->addElement('reset', null, 'Reseteaza formularul' ,'class=formButtons'); //Formularul este gata , sa adaugam regulile de validare  //Field-ul username este obligatoriu - folosim tipul de validare "required" $form->addRule('username', 'Ati introdus un username invalid', 'required','', 'server'); //Field-ul username trebuie sa aiba minim 6 caractere - folosim tipul de validare "minlength" $form->addRule('username', 'Username trebuie sa aiba minim 6 caractere','minlength','6', 'server'); //Verificarea parolelor  $form->addRule('password',    'Nu ati introdus nici o parola', 'required','', 'server'); $form->addRule('password', 'Parola trebuie sa aiba minim 6 caractere','minlength','6', 'server'); //Compararea celor doua field-uri password si password2 folosind regula "compare" $form->addRule(array('password','password2'), 'Parolele introduse nu se potrivesc !', 'compare','', 'server'); //Validam si email-ul ...cu regula "email"  $form->addRule('email','Nu ati introdus nici un email', 'required','', 'server'); $form->addRule('email','Emailul introdus este invalid', 'email','', 'server'); //aplicam un "filtru" asupra toturor elementelor din formular  //NOTA:se pot aplica filtre pe input-uri individuale in diferite circumstante, //in situatia de fata avem nevoie de toate,deci ii specificam metodei  //applyFilter() parametrul special '__ALL__' $form->applyFilter('__ALL__', 'trim' ); //validam formularul cu metoda validate()     if ($form->validate()){         //daca returneaza TRUE          echo "Formularul a fost validat cu succes";         //#TODO# -> prelucrarea datelor     } else {         //daca validarea a esuat (validate() a returnat FALSE          //afisam form-ul cu erorile aparute langa fiecare field (default cu culoarea rosie)          $form->display();     } ?>
Sus  
Emil



Data înscrierii: 16/Noi/2003
Mesaje: 301
Locație: echo $REMOTE_ADDR

Trimis: Dum Mai 09, 2004 4:34 am    Titlul subiectului: Continuare.....  

In exemplul de mai sus, codul functioneaza,dar daca folositi un template engine lucrurile se cam precipita ..
Singurul lucru care ati putea sa-l faceti ca sa includeti acest exemplu intr-un template e sa-l includeti simplu cu
{include_php file='exemplu_quickform.php'} in template-ul smarty, insa metoda nu e prea "ortodoxa" si pe langa asta nu mai aveti acces la customizarea/pozitionarea formularului intr-un mod mai usor (desi QuickForm este extensibil pana-n panzele albe totusi e de preferat un editor vizual pentru ergonomie in design) .
O solutie la aceasta problema vine cu acele "renderers" de care mai dispune in plus acest pachet pentru anumite tipuri de template engine-uri printre care din fericire si Smarty .
Stim foarte bine ca template-urile Smarty sunt construite din marcaje de genul {$numevariabila} care (teoretic) despart munca designerului de cea a programatorului. De ce nu ar fi asa si in cazul uneltei QuickForm ? Chiar asa,de ce nu ? :)

Sa revenim putin la codul de mai sus , sa-l modificam :
<?PHP //fisierele incluse  require_once 'HTML/QuickForm.php'; //clasa Smarty require_once ("smarty/libs/Smarty.class.php"); //renderer-ul de care va vorbeam  require_once 'HTML/QuickForm/Renderer/ArraySmarty.php'; $form = new HTML_QuickForm('numeform','post',"$PHP_SELF",'_parent','enctype="multipart/form-data"'); //adaugam primul field - username  $form->addElement('text', 'username', 'Username', array('size' => 20, 'maxlength' => 20 ,'class'=>'formElements')); //field-ul pentru email  $form->addElement('text', 'email', 'Adresa de mail', array('size' => 20, 'maxlength' => 20 ,'class'=>'formElements')); //field-ul pentru  parola  $form->addElement('password', 'password', 'Parola', array('size' => 20, 'maxlength' => 45 ,'class'=>'formElements')); //field-ul prntru verificarea parolei  $form->addElement('password', 'password2', 'Reintroduceti parola', array('size' => 20, 'maxlength' => 45 ,'class'=>'formElements')); //butonul de Submit $form->addElement('submit', "submit", 'Trimite informatiile','class=formButtons'); //butonul Reset $form->addElement('reset', "reset", 'Reseteaza formularul' ,'class=formButtons'); //Formularul este gata , sa adaugam regulile de validare  //Field-ul username este obligatoriu - folosim tipul de validare "required" $form->addRule('username', 'Ati introdus un username invalid', 'required','', 'server'); //Field-ul username trebuie sa aiba minim 6 caractere - folosim tipul de validare "minlength" $form->addRule('username', 'Username trebuie sa aiba minim 6 caractere','minlength','6', 'server'); //Verificarea parolelor  $form->addRule('password',    'Nu ati introdus nici o parola', 'required','', 'server'); $form->addRule('password', 'Parola trebuie sa aiba minim 6 caractere','minlength','6', 'server'); //Compararea celor doua field-uri password si password2 folosind regula "compare" $form->addRule(array('password','password2'), 'Parolele introduse nu se potrivesc !', 'compare','', 'server'); //Validam si email-ul ...cu regula "email"  $form->addRule('email','Nu ati introdus nici un email', 'required','', 'server'); $form->addRule('email','Emailul introdus este invalid', 'email','', 'server'); //aplicam un "filtru" asupra toturor elementelor din formular  //NOTA:se pot aplica filtre pe input-uri individuale in diferite circumstante, //in situatia de fata avem nevoie de toate,deci ii specificam metodei  //applyFilter() parametrul special '__ALL__' $form->applyFilter('__ALL__', 'trim' ); //validam formularul cu metoda validate()     if ($form->validate()){         //daca returneaza TRUE          $validat = true;         //#TODO# -> prelucrarea datelor     }     //se observa ca folosirea metodei display() nu mai este necesara //Instantiem un nou Obiect Smarty  $t = new Smarty; $t->compile_dir = './compiled';//directorul de "compilare" a template-urilor $t->template_dir = './'; //directorul template-ului  $t->compile_check = 'true'; //$t->debugging = 'true'; //decomentati pentru "debugging" :)  //Instantiem si "renderer-ul" caruia ii dam ca parametru obiectul smarty $t $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($t); //Se observa deja flexibilitatea aparuta ;)  //Ce se intampla mai jos : //in cazul in care avem o eroare : se afiseaza Label-ul field-ului cu rosu //in cazul in care un field este 'required' afisam langa el un * (asterisc) $renderer->setRequiredTemplate(    '{if $error}         <font color="red">{$label}</font>     {else}         {$label}         {if $required}             <font color="red" size="1">*</font>         {/if}     {/if}'     ); //ca si mai sus,customizam afisarea erorilor aparute dupa Submit  //tot cu marcaje Smarty  //NOTA: se pot folosi template-uri externe pentru asa ceva  //si de asemenea folosirea oricarui modifier Smarty este binevenita $renderer->setErrorTemplate(    '{if $error}         <font color="orange" size="1">{$error}</font><br />     {/if}{$html}'     ); //Folosim metoda accept() a clasei QuickForm spre folosire a unui output custom //in cazul nostru un array $form->accept($renderer); //la final atribuim lui smarty array-ul rezultat $t->assign('form', $renderer->toArray()); if(!$validat){     $t->display('quickform.html');     }else{     $t->display('succes.html'); } ?>
Sus  
Emil



Data înscrierii: 16/Noi/2003
Mesaje: 301
Locație: echo $REMOTE_ADDR

Trimis: Dum Mai 09, 2004 4:36 am    Titlul subiectului:  

Mai jos aveti listing-urile celor 2 template-uri folosite :)
quickform.html
an style="color: #000000"><?php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Test Quickform -PHPRomania.net</title> {literal} <style type="text/css"> <!-- body,td,th {     font-family: Verdana, Arial, Helvetica, sans-serif;     font-size: 12px; } --> </style> {/literal} </head> <body> <!---Atributele formularului--> <form {$form.attributes}> <table width="600"  border="0" cellspacing="0" cellpadding="0">   <tr bgcolor="#99FFCC">     <td colspan="2">PHPRomania</td>   </tr>   <tr>     <td width="179">{$form.username.label}</td>     <td width="179">{$form.username.html}</td>   </tr>   <tr>     <td>{$form.email.label}</td>     <td>{$form.email.html}</td>   </tr>   <tr>     <td>{$form.password.label}</td>     <td>{$form.password.html}</td>   </tr>   <tr>     <td>{$form.password2.label}</td>     <td>{$form.password2.html}</td>   </tr>   <tr>     <td>&nbsp;</td>     <td>{$form.submit.html}      {$form.reset.html}</td>   </tr> </table> </form> </body> </html> 


....si succes.html


an style="color: #000000"><?php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Test Quickform -PHPRomania.net</title> {literal} <style type="text/css"> <!-- body,td,th {     font-family: Verdana, Arial, Helvetica, sans-serif;     font-size: 12px; } --> </style> {/literal} </head> <body> <table width="600"  border="0" cellspacing="0" cellpadding="0">   <tr bgcolor="#99FFCC">     <td width="358">PHPRomania</td>   </tr>   <tr >     <td>Validarea a reusit , have a nice day :) </td>   </tr> </table> </body> </html> 
Sus  
Emil



Data înscrierii: 16/Noi/2003
Mesaje: 301
Locație: echo $REMOTE_ADDR

Trimis: Dum Mai 09, 2004 4:44 am    Titlul subiectului:  

Nota :
pentru tutorial am folosit pachetele Pear::Quickform si motorul de template-uri Smarty 2.62

Pentru a rula exemplele , PEAR trebuie instalat pe calculatorul gazda (fie el windows sau o masina Linux) iar pentru a instala pachetul Quicform rulati in linia de comanda :
Cod:
pear install HTML_QuickForm


Directorul de "compilare" trebuie sa aiba permisiuni de scriere in cazul in care rulati codul pe un sistem Linux .
Enjoy .
Sus  
bogdanvursu



Data înscrierii: 29/Aug/2005
Mesaje: 6
Locație: Iasi

Trimis: Lun Aug 29, 2005 3:28 pm    Titlul subiectului: Codul HTML trimis pe client e urat  

Exista vreun pachet pentru formulare tableless?
E greu de modificat Quickform-ul sa scoata HTML semantic?
<label> accesskey etc?
Codul javascript pt validare banuiesc ca la fel nu e chiar "state-of-the-art", adica nu foloseste DOM.
Se poate modifica, relativ usor.

Chiar as fi curios cat de simpla e customizarea lui Quickform
Sus  
eyecon



Data înscrierii: 05/Noi/2002
Mesaje: 180

Trimis: Dum Sep 04, 2005 12:32 pm    Titlul subiectului:  

M-am juca 2 zile cu quickform si am reusit sa fac sa genereze formulare tableless. Am folosit numai 'default render'. Mai mult ca sigur ca se poate si folosind oricare din sistemele de sablonare suportate.
Sus  
ExcalIbvr



Data înscrierii: 02/Mai/2004
Mesaje: 1107
Locație: Oradea

Trimis: Sâm Oct 08, 2005 3:47 pm    Titlul subiectului:  

Am inceput si eu sa ma joc cu QuickForm si Smarty si-s foarte incantat de cum functioneaza.

Intrebare:
As vrea sa aplic mysql_real_escape_string() pe toate campurile, la submit. E corect daca-i aplic filtrul urmator?
$form->applyFilter('__ALL__', 'mysql_real_escape_string' );
Sus  
vitea



Data înscrierii: 10/Ian/2006
Mesaje: 65
Locație: Bucuresti

Trimis: Dum Ian 15, 2006 3:26 pm    Titlul subiectului:  

Apreciez calitatea discutii pe acest subiect. As dori sa vad cat mai multe schimburi de pareri la acest nivel pe PHPRomania. La obiect, profesional.

As avea insa o intrebare:

Care este impactul folosirii template-lor asupra performantei?
Eu m-am ferit pana acum sa le folosesc din cauza temerilor legate de impactul negativ asupra vitezei de executie a scripturilor.
Sunt fondate temerile mele sau se bazeaza doar pe niste supozitii gresite?
Sus  
beeuser



Data înscrierii: 20/Mai/2004
Mesaje: 389

Trimis: Dum Ian 15, 2006 4:54 pm    Titlul subiectului:  

Parere:

Mai rapid decat codul PHP, n-au cum sa mearga templateurile. PHP este un template system, si nu cred ca e nevoie de un alt markup pentru a creea templateuri. Recomand www.phpsavant.com

Edit: http://www.phppatterns.com/docs/design/templates_and_template_engines
Sus  
vitea



Data înscrierii: 10/Ian/2006
Mesaje: 65
Locație: Bucuresti

Trimis: Dum Ian 15, 2006 5:14 pm    Titlul subiectului:  

beeuser, multumesc pentru raspunsul tau.

Am mers direct la a doua adresa. Am reusit sa citesc vreo 3 paragrafe pana acum. Foarte interesant!!!
Sus  
REGO



Data înscrierii: 09/Noi/2006
Mesaje: 9
Locație: Cluj - Napoca

Trimis: Joi Noi 09, 2006 10:58 pm    Titlul subiectului:  

cu putin din alt subiect dar ...
am vazut ca ai comentate tagurile pentru css
sunt aprox nou .... in lucrul cu smarty si nu inteleg de ce nu merg aceste taguri ... ce trebuie facut?
Sus  
idevelop



Data înscrierii: 10/Feb/2007
Mesaje: 1

Trimis: Sâm Feb 10, 2007 3:02 pm    Titlul subiectului:  

beeuser a scris: Edit: http://www.phppatterns.com/docs/design/templates_and_template_engines

imi cer scuze ca redeschid un topic mort deja de un an, dar am banuit ca, subiectul fiind sticky, mi se iarta.

vreau doar sa spun ca linkul de mai sus prezinta un mare nimic! l-am citit: 3 sferturi critica smarty, iar in ultimul sfert ne abureste cu phpHTMLLib., xslt si asp. pai scuza-ma, o avea smarty-ul problemele lui, dar nu poti sa te numesti web developer daca incerci sa scoti in fata cod ca asta:

an style="color: #000000"><?php $style = html_style(); $style->add( &quot;span.foo { font-size: 1em; font-weight: bolder;}&quot; ); $style->add( &quot;td { padding-left: 5px; text-align: center;}&quot; ); $style->add( &quot;table {border: 2px solid #999999;}&quot; ); $style->add( &quot;th {background-color: #eeeeee; &quot;.                   &quot;border-bottom: 2px solid #999999;}&quot; ); $style->add( &quot;caption { font-size: 14pt; font-weight: bold;}&quot; ); $page->add_head_content( $style ); $page->add( html_a($_SERVER[&quot;PHP_SELF&quot;].&quot;?debug=1&quot;, &quot;Show Debug Source&quot;),             html_br(2) ); $data_table = html_table(&quot;500&quot;, 0, 0); 

autorul ignora total proiectele la care e nevoie de mai mult de un om pentru dezvoltare. daca (in mod logic) designerul imi face layoutul, html-istul il html-izeaza, iar programatorul scrie codul, nu vreau sa ma gandesc cum se imbina munca celor doi din urma folosind codul de mai sus...
Sus  
shahzadmasih



Data înscrierii: 20/Mar/2007
Mesaje: 1
Locație: UK

Trimis: Mar Mar 20, 2007 4:34 pm    Titlul subiectului:  

Hi, This post is very informative, however I would like some specific information. If someone can help me then please send me a private message. Best Regards,
Sus  
dark_0n3



Data înscrierii: 19/Oct/2007
Mesaje: 2

Trimis: Vin Oct 19, 2007 2:50 pm    Titlul subiectului: client-side validation  

Intrebarea mea este se poate faca utilizand smarty si html_quickform validarea pe client?...pt ca eu am incercat si intai imi face submit la server si apoi imi spune ce nereguli sunt la campurile mele... desi am dat la addRule 'client' in loc de 'server'

Daca cineva are vreo solutie va rog sa-mi ziceti... am folosit si DHTML_quickform care face validarea pe client frumos fara acel popup dar tot nu merge cu smarty... face tot submit la server...

Mersi astept un raspuns
Sus  
johnutz



Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură

Trimis: Vin Oct 19, 2007 11:49 pm    Titlul subiectului:  

Vezi ca aici arata care e structura array-ului. Deci rezolvarea ar fi:
Cod: {$form.javascript}
<form {$form.attributes}>
....
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> PHP Avansat Du-te la pagina 1, 2  Următoare
Pagina 1 din 2


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community