ugrás a tartalomhoz

Form kezelés sablonnal

fchris82 · 2007. Jan. 4. (Cs), 16.29
Létrehoztam egy FormMLParser osztályt, ami a PEAR-es XML_Parser kiterjesztése. Ez olyat tud, hogy teszem azt:
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2. <form name="new_page" method="POST">  
  3.   <field name="name">  
  4.     <label>Az oldal neve:</label>  
  5.     <input type="text" maxlength="100" require="yes" />  
  6.     <prefilter type="trim" />  
  7.     <validate type="maxlength">  
  8.       <error_msg>Túl hosszú az oldal neve!</error_msg>  
  9.     </validate>  
  10.     <validate type="require">  
  11.       <error_msg>Nincs megadva az oldal neve.</error_msg>  
  12.     </validate>  
  13.   </field>  
  14. <br />  
  15.   <field name="title">  
  16.     <label>Az oldal címe:</label>  
  17.     <input type="text" maxlength="255" size="50" />  
  18.     <prefilter type="trim" />  
  19.     <validate type="maxlength">  
  20.       <error_msg>Túl hosszú az oldal címe, maximum 255 karakteres lehet!</error_msg>  
  21.     </validate>  
  22.   </field>  
  23. <br />  
  24.   <field name="params">  
  25.     <checkbox options="%params_options%" default="%params_default%">  
  26.       <label><input /> %__name__%</label><br/>  
  27.     </checkbox>  
  28.   </field>  
  29. <br />  
  30.   <input type="submit" value="Mehet" />  
  31. </form>  
Hogy ez miért is jó? Az értlemező kétszer használja ezt a sablonfájlt:
1. Amikor létre kell hozni a FORM-ot, amiben az adatokat megadja a felhasználó.
2. Amikor beérkeznek az adatok, és fel kell dolgozni az adatokat, továbbá hibaüzeneteket kell létrehozni, stb, stb.

Jelenleg így kell mondjuk Smarty-ban meghívni:
  1. /* index.php */  
  2. function smarty_include_form($params) {  
  3.   $form     = new FormMLParser();  
  4.   // A formML fájlra gondol itt $tpl_file alatt!  
  5.   $tpl_file = $params['file'];  
  6.   // Ez általában a $_POST, ami beérkezik, hogy hiba esetén feltöltse az "input mezők" érkétét, bejelölje a megfelelő "checkbox"-okat, stb, stb...  
  7.   $vars     = $params['vars'];  
  8.   foreach($params as $name=>$value) {  
  9.     if($name!='file' AND $name!='vars' AND !array_key_exists($name$vars)) {  
  10.       $vars[$name] = $value;  
  11.     }  
  12.   }  
  13.   $form->set($tpl_file$vars);  
  14.   // Ha a paraméter értéke TRUE (ez az alapértelmezett), akkor print  
  15.   // $final_text fog történni, FALSE esetén pedig return $final_text. Mivel  
  16.   // Smarty-ból hívjuk, ezért FALSE kell.  
  17.   return $form->display(FALSE);  
  18. }  
  19.   
  20. $smarty->register_function('include_form''smarty_include_form');  
  21. [...]  

{* new_page.tpl *}
{include_form
  {* A FormML fájl neve *}
  file        = "admin_new_page.tpl"
  vars        = $smarty.post
  {* Alapértelmezésben ugyan oda "küldi" az adatot, és ha minden rendben,
     akkor "header('Location:'.$new_url);"-el átugrik a "következő"
     oldalra. *}
  form_action = $PHP_SELF
  {* A következő oldal *}
  next_page   = $next_page
  {* Az adatok feldolgozását végző "fájlnév", ami a form_processors
     könyvtárban van. *}
  processor   = "new_page.php"
  
  {* És ami miatt írok :( :( :( *}
  params_options= $params
  params_default= $default}
És ilyen lesz a kimenet:
  1. <FORM NAME="new_page" METHOD="POST" ID="form_new_page" ACTION="http://vmi.hu/new_page">  
  2.     <input type='hidden' name='processor' value='new_page' />  
  3.     <input type='hidden' name='next_page' value='http://vmi.hu/pages' />  
  4.     <LABEL FOR="name">Az oldal neve:</LABEL>  
  5.     <INPUT TYPE="text" MAXLENGTH="100" NAME="name" />  
  6. <BR  />  
  7.     <LABEL FOR="title">Az oldal címe:</LABEL>  
  8.     <INPUT TYPE="text" MAXLENGTH="255" SIZE="50" NAME="title" />  
  9. <BR  />  
  10.       <LABEL ><INPUT TYPE="checkbox" NAME="params[]" VALUE="show_in_menu" CHECKED /> Az oldal megjelenik a menüben.</LABEL><BR  />  
  11.       <LABEL ><INPUT TYPE="checkbox" NAME="params[]" VALUE="display" CHECKED />  Az oldal megjeleníthető.</LABEL><BR  />  
  12. <BR  />  
  13.   <INPUT TYPE="submit" VALUE="Mehet" />  
  14.   
  15. </FORM>  
Nos, ez így nem jó. Mert olyan adatokat, hogy egy checkbox halmazból milyen értékek jöhetnek, azt ellenőrizni kéne, így itt is, amikor megjelenik a form, és a feldolgozásnál is külön be kell gépelni, hogy mi lehet mondjuk a %params_options% (array egyébként!). Tehát ezt jó lenne mondjuk beletenni a FormML sablonba. Igen ám, de hogyan :? Írjak egy külön részt, ami mondjuk a {% vmi %} közötti részeket eval()-al értelmezi? Ez nem tetszik :-/ Ekkor mondjuk gond lehet a hatáskörökkel és értelmezésekkel... :-/

Tehát vmi olyasmit szeretnék, hogy a %vmi% helyére az adatot most "kívülről" kell neki átadnom, és jobban szeretném, ha ez benne lehetne, mondjuk így:
%$DAOS->pages->get($id)% . És akkor így nem kell két külön helyen is megadnom, hogy az options=%vmi%-ből a %vmi%-t vegye array('show_in_menu'=>'Megjelenjen a menüben?', 'display'=>'Megjelenhez az oldal?')-nak.

Remélem érthető voltam :-X