Form kezelés sablonnal
Létrehoztam egy FormMLParser osztályt, ami a PEAR-es XML_Parser kiterjesztése. Ez olyat tud, hogy teszem azt: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:És ilyen lesz a kimenet: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
■
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<form name="new_page" method="POST">
<field name="name">
<label>Az oldal neve:</label>
<input type="text" maxlength="100" require="yes" />
<prefilter type="trim" />
<validate type="maxlength">
<error_msg>Túl hosszú az oldal neve!</error_msg>
</validate>
<validate type="require">
<error_msg>Nincs megadva az oldal neve.</error_msg>
</validate>
</field>
<br />
<field name="title">
<label>Az oldal címe:</label>
<input type="text" maxlength="255" size="50" />
<prefilter type="trim" />
<validate type="maxlength">
<error_msg>Túl hosszú az oldal címe, maximum 255 karakteres lehet!</error_msg>
</validate>
</field>
<br />
<field name="params">
<checkbox options="%params_options%" default="%params_default%">
<label><input /> %__name__%</label><br/>
</checkbox>
</field>
<br />
<input type="submit" value="Mehet" />
</form>
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:
/* index.php */
function smarty_include_form($params) {
$form = new FormMLParser();
// A formML fájlra gondol itt $tpl_file alatt!
$tpl_file = $params['file'];
// 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...
$vars = $params['vars'];
foreach($params as $name=>$value) {
if($name!='file' AND $name!='vars' AND !array_key_exists($name, $vars)) {
$vars[$name] = $value;
}
}
$form->set($tpl_file, $vars);
// Ha a paraméter értéke TRUE (ez az alapértelmezett), akkor print
// $final_text fog történni, FALSE esetén pedig return $final_text. Mivel
// Smarty-ból hívjuk, ezért FALSE kell.
return $form->display(FALSE);
}
$smarty->register_function('include_form', 'smarty_include_form');
[...]
{* 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}
<FORM NAME="new_page" METHOD="POST" ID="form_new_page" ACTION="http://vmi.hu/new_page">
<input type='hidden' name='processor' value='new_page' />
<input type='hidden' name='next_page' value='http://vmi.hu/pages' />
<LABEL FOR="name">Az oldal neve:</LABEL>
<INPUT TYPE="text" MAXLENGTH="100" NAME="name" />
<BR />
<LABEL FOR="title">Az oldal címe:</LABEL>
<INPUT TYPE="text" MAXLENGTH="255" SIZE="50" NAME="title" />
<BR />
<LABEL ><INPUT TYPE="checkbox" NAME="params[]" VALUE="show_in_menu" CHECKED /> Az oldal megjelenik a menüben.</LABEL><BR />
<LABEL ><INPUT TYPE="checkbox" NAME="params[]" VALUE="display" CHECKED /> Az oldal megjeleníthető.</LABEL><BR />
<BR />
<INPUT TYPE="submit" VALUE="Mehet" />
</FORM>
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