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:

<?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>
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:

/* 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}
És ilyen lesz a kimenet:

<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>
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