FROM adatmegőrzés, kettős action
Nos egy eléggé komplikált megoldást ötlöttem ki mezőellenőrzésre, még mielőtt a feldolgozó oldal megkapná a formom adatait. A lényege: actionnek önmagát adtam, s ekkor lefut egy php-s tartalomellenőrzés. Sajnos valami nem 100% -os, de nem jövök rá, mi. Ezt onnét vettem észre, hogy sajnos hiába írja ki, mi hiányzik, a beviteli mezőböl törlődik a már beírt adat. Lehet, nem jó úton járok, és mást kéne kiagyalni. A célom az, hogy a submit gombra bökéskor megnézi, a két szükséges mezőbe van-e adat, ha igen, akkor adódik tovább csak a feldolgozó lapnak, ellenkező esetben kiírja a megfelelő üzenetet, s a bevitt értékeket megőrízve, a hiányzó érték megadása utáni küldéskor már végre tényleg a feldolgozó oldalra lép.
Ez az ellenőrző kód az oldal elején:Ez pediglen maga a form:Látható egy beépített, karakterszámláló is. Próbáltam anélkül is, hátha... de sajnos úgy se működött. Előre is köszönöm a hozzászólásokat, ötleteket.
C.
■ Ez az ellenőrző kód az oldal elején:
<?php
if (array_key_exists('Submit',$_POST)){
$expected = array('name', 'email');
$required = array('name', 'email');
$errors = array();
foreach ($_POST as $field => $value){
$temp = is_array($value) ? $value : trim($value);
if (empty($temp) && in_array($field, $required)) {
array_push($errors, $field);
}
}
if (empty($errors)){?>
<div id="form_ok">ide jön a továbbirányítás, esetleg második action?</div>
<?php
unset($errors);
}
}
?>
<FORM id="gform" name="gform" method="post" action="index.php?include=gbook">
<div id="form_input">
<div>
<label for="name">Név</label>
<?php if (isset($errors) && in_array('name', $errors)){?>
<div id="hiba_name">Kérlek, add meg a neved<br /></div>
<?php } ?>
<input type="text" id="name" name="name" value="" size="35"
<?php if (isset($errors)) { echo 'value="'.htmlentities($_POST['name']).'"'; } ?>
/>
</div><br />
<div>
<label for="email">E-mail</label>
<?php if (isset($errors) && in_array('email', $errors)){?>
<div id="hiba_mail">Kérlek, add meg az e-mailed<br /></div>
<?php } ?>
<input type="text" id="email" name="email" value="" size="35"
<?php if (isset($errors)) { echo 'value="'.htmlentities($_POST['email']).'"'; } ?>
/>
</div><br />
<div>
<label for="comment">Üzenet</label>
<textarea type="text" id="comment" name="comment" value="" cols="40" rows="8"
onKeyDown="textCounter(document.gform.comment,document.gform.remLen,280)"
onKeyUp="textCounter(document.gform.comment,document.gform.remLen,280)"/></textarea>
</div>
<div id="form_ellenorzo">
<input id="ellenorzo" type="text">
</div>
<div id="rem">
<span style="font-size: 80%"><input readonly type="text" id="remLen" name="remLen" size="3" maxlength="3" value="280">karakter még</span>
</div><br />
<div id="form_button"><br />
<button type="Submit" value="Mehet" class="positive" name="Submit" /><img src="images/apply2.png" alt="" />Mehet</button>
<button type="Reset" value="Mégse" class="negative" name="Reset" /> <img src="images/cross.png" alt="" />Mégse</button>
</div>
</div>
</FORM>
C.
Majdnem hibátlan megoldás
A megoldásod egyáltalán nem komplikált, így szokás megoldani a form validálást szerver oldalon (mellesleg szoktak még kliens oldali validálást is beiktatni, de az elhagyható).
Az, hogy az input mezők nem töltődnek fel az elposztolt adatokkal valószínű azért van (nem próbáltam ki a kódod), mert a value attribútumot kétszer adod meg, egyszer üresen, egyszer meg feltöltve. Ha az if-et a value="<?php IDE ?>" írod, akkor elvileg jó lesz.
Üdv: Norbi
Jogos
Igazad van, az üresen hagyott value volt a probléma forrása :) Ez igazán jó példa arra, hogy fáradtan miket nem vesz már észre az ember :) Most már csak azt kell megoldanom, hogy ha nincs hiba, átirányítsa a feldolgozó lapra a usert, a postolt adatokkal együtt :) Eszembe jutott minap már az is, hogy inkább kliens-oldali ellenőrzést kéne írni egy onsubmit eseményhez kapcsolva, hisz az action így is végrehajtódik, tehát a feldolgozó-oldalra át kerül az adat, jól gondolom? De js-el meg nem lehet ennyire szépen megfogalmazni szerintem. De gondolkoztam már jQuery-integráláson is... jó kis agytörő :)
C.
Megvan
Kipróbáltam, s működik. Hogy hogy? Az eredeti kódban található volt az alábbi kódrészlet:
Megj.: Az Empty miért íródik ki minden esetben duplán?... :)
C.
//==================================
Na jó, elhamarkodtam az örömöm. A $_POST adatok nem kerülnek így már átküldésre, uh még sem oldódott meg :(
C.
Nem olyan nagy ügy innentől
Nem olyan rossz megoldás amit kitaláltál, de mindig gondolj azokra is, akiknek nincs JS engedélyezve a böngészőjükben! Ezért is írtam, hogy a kliens oldali ellenőrzés elhagyható, viszont (ezt nem írtam, de) a szerver oldali kötelező.
Szóval a tuti megoldás az, ha a POST-olt adatok alapján elágaztatod szerver oldalon a kódot:
- ha jöttek adatok, akkor validálod őket, és ha minden OK, akkor a feldolgozást is elvégzed (akár egy másik, include-olt modulban
- ha nem jöttek adatok, vagy hiba volt a validálás során, akkor megjeleníted az űrlapot
Ily módon elkerülheted a JS oldali átirányítást, szerver oldalon meg modulokra bonthatod a feldolgozást, és mindig a megfelelőt tudod include-dal behúzni.
Remélem ez segít!
Üdv: Norbi
Üdv Nos, igen, a
Nos, igen, a javascriptes megoldás emiatt se tetszik nekem. Viszont a szerveroldali elelnőrzés már kész rég. elsőkörben elelnőrzi ,van-e $_POST, ha nincs, hibaüzenet, ha van, tovább ellenőriz. Megnézi a spam-védelmet, majd pedig (a form elküldése óta most először) lecsekkolja, a tényleges hozzászólás nem-e üres mező. Ha mindenen átmegy pozitív bírálással, adatbázisba mentésre kerül és erről tájkoztatást ad az oldal, majd linket ad a már beérkezett s jóváhagyott hozzászólások megtekintéséhez. Csak magát az átirányítást kell megoldani :) Most meta-tages átirányítással próbálkozom, de sajnos úgy is törlődnek az input adatok, és a feldolgozó oldal már hibát jelez, hogy nincs $_POST érték, amit feldolgozhatna. Legalábbis, ezt a feldolgozási rendszert tartottam leglogikusabbnak, hogy megvalósítsam. Igaz furán álltam neki, mert a végére hagytam a mező-ellenőrzéseket :)
C.