17. april 2013 - 21:49Der er
31 kommentarer og 1 løsning
Udfyldelse af formularer
Ved de snart mange formularer, jeg har skrevet er der et problem for brugerne: Hvis de har IE 7, 8 eller 9 irriteres de af de obligatoriske felter. Har de udfyldt alle - undtage én, så ryger det hele, og de skal til at indtaste navn, adresse, telefon og meget mere helt forfra. Er der en løsning på dette? jeg ved godt, at Opera, Firefox og Crome m fl ikke giver dette problem, men på mange administrative net kører man altså med obligatoriske programmer og i gamle udgaver.
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
if (empty($_POST['navn'])) { //besked hvis brugeren ikke har indtastet noget navn echo " Alle felter med * skal udfyldes. " ; } elseif (empty($_POST['ean'])) { //besked hvis brugeren ikke har indtastet noget EANummer echo" EAN skal udfyldes."; } elseif (empty($_POST['email'])) { //besked hvis brugeren ikke har indtastet nogen e-mail echo " Du skal indtaste din e-mail. Evt. Skolekom-adresse" ; } elseif (empty($_POST['adresse'])) { //besked hvis brugeren ikke har indtastet nogen adresse echo" Vi vil også gerne kende din adresse. " ; } elseif (empty($_POST['by'])) { //besked hvis brugeren ikke har indtastet nogen by echo" Husk også by. "; } osv.
1. Jeg ville nok lave det første check i javascript, så slipper du for at siden reloades 2. I det andet check (PHP), bliver du nød til at sende input-variablerne med, når du trykker på submit (kan være session-, post- eller getvariabler), og i dine textfields bliver du så nød til at checke om der er noget i dine variabler 3. Du bruger Ajax, så slipper du også for reload
Ajax er fint, hvis du er rigtig god til JavaScript, CSS og DOM. Er du ikke det, ville jeg afgjort råde til at lave en løsning i JavaScript og PHP - uden Ajax
Egentlig havde jeg håbet på, at problemet kunne løses med nogle få kodelinier tilføjet den oprindelige programmering. Da min profession ofte bliver kaldt "halvstuderede røvere" og jeg ikke er nogen undtagelse, må jeg jo så ty til JavaScript. Hvis nogen har et eksempel, er jeg hjulpet lidt på vej.
Så er du sikkert (ikke mindst i denne tid) enig i, at det, som kan ordnes i lokalet, bedst ordnes i lokalet *o)
Et bud kunne være denne klientkode:
<script type="text/javascript"> function validate(frm) { if (frm.navn.value==="") { alert("Alle felter med * skal udfyldes."); frm.navn.focus(); return false; } if (frm.ean.value==="") { alert("EAN skal udfyldes."); frm.ean.focus(); return false; } if (frm.email.value==="") { alert("Du skal indtaste din e-mail. Evt. Skolekom-adresse."); frm.email.focus(); return false; } if (frm.adresse.value==="") { alert("Vi vil også gerne kende din adresse."); frm.adresse.focus(); return false; } if (frm.by.value==="") { alert("Husk også by."); frm.by.focus(); return false; } return true; } </script>
<form action="" onsubmit="return validate(this)">
Da klientafviklet JavaScript ikke indebærer nogen sikkerhed, bør du kun se en JS-validering som en service til ære for brugeren. Du bør af hensyn til sikkerheden stadig validere data med PHP på serveren =)
Det kunne lyde, som om din struktur gør, at du også har andre problemer. Mon ikke du f.eks. oplever dobbeltindsætninger, hvis brugeren trykker F5 efter en indsætning?
En bedre struktur ville være opbygget over to dokumenter: Ét med formen og ét med dine funktioner (response.php). Formen submittes efter JS-validering mod response.php, som foretager validering, databasekald, osv. Derefter sendes brugeren tilbage til form-siden via en header.
Du kan bruge response.php til mange forskellige opgaver. Du retter blot value på det hidden field, der hedder 'context' - og indsætter en tilsvarende case i switch'en i response.php
Tak for eksemplerne. Nu skal jeg ikke bruge database, men ende med at sende en mail med indputtene, men den kode skal vel ind samme sted. En af dagene laver jeg en model, der sender til mig selv. Den vil jeg lege lidt med, inden jeg piller ved det eksisterende.
Det virker med adslillelse i to filer! Mailen bliver afsendt. Der er kun fejlmeddelelser som "invalid argument" ved et par "Foreach()" selvom det valgte tilsyneladende kommer med i mailen.
Næ, men nogen ved måske, om det er en god ide, at flytte hele PHP-kontrollen af indputfelterne i formularen over i response-filen eller om specielt "Foreach()" skal blive i formularen. Det er jo de samme koder, som i den oprindelige formular i én fil, hvor der ikke var fejlmeldinger. Iøvrigt får jeg også fejlmelding på sidste linie i response-filen "header($return_page);"Den skriver,at header er sendt og ikke kan sendes 2 gange.
foreach($asortering as $sortering){ $string_sortering.= $sortering." "; echo " "; } $alokal = (isset($_POST['lokal']) ? $_POST['lokal'] : ""); if(empty($alokal)){ die ("Husk venligst lokalforeningen. "); } $I = count($alokal); echo " "; $string_lokal = ""; foreach($alokal as $lokal){ $string_lokal.= $lokal." "; } if (empty($_POST['navn'])) { //besked hvis brugeren ikke har indtastet noget navn echo " Alle felter med * skal udfyldes. " ; } elseif (empty($_POST['ean'])) { //besked hvis brugeren ikke har indtastet noget EANummer echo" EAN skal udfyldes."; } elseif (empty($_POST['email'])) { //besked hvis brugeren ikke har indtastet nogen e-mail echo " Du skal indtaste din e-mail. Evt. Skolekom-adresse" ; } elseif (empty($_POST['adresse'])) { //besked hvis brugeren ikke har indtastet nogen adresse echo" Vi vil også gerne kende din adresse. " ; } elseif (empty($_POST['by'])) { //besked hvis brugeren ikke har indtastet nogen by echo" Husk også? by. Tryk tilbage og udfyld."; }
elseif (empty($_POST['cvr'])) { //besked hvis brugeren ikke har indtastet noget navn echo" Husk også? CVR."; } elseif (check_telefon ($_POST ['telefon']) == FALSE){ echo "Skriv venligst et korrekt telefonnummer."; }
elseif (check_postnummer($_POST['postnummer']) == FALSE){ echo "Postnummeret skal være et 4-cifret tal." ; }
elseif(check_email($_POST['email']) == FALSE) echo" Skriv venligst en gyldig E-mail adresse.";
echo "<p> Formularen er blevet sendt med disse oplysninger: <br/> Navn: ".$navn." ".$adresse." ".$postnummer." ".$by."<br/> E-mail: ".$email." Emne: ".$emne."<br/> om kort tid modtager du en e-mail med din bestilling"; } } }
if (some_error) { return 'Der skete en fejl - bla bla.'; }
// Kør din databasekode m.m. her if (some_error) { return 'Der skete en anden fejl - bla bla.'; }
return true; }
$error = ''; if (isset($_POST['context'])) { switch ($_POST['context']) { case 'opret': $res = createNewUser(); if (is_string($res)) $error = $res; break;
Ellers må jeg sige, at problemet med at komme væk fra siden for tidligt er løst, selvom man ikke kommer tilbage til formularsiden automatisk. Til gengæld kan man trykke "tilbage" og se sine indtastninger, hvis det har interesse.
Nu har jeg prøvet begge løsninger i flere forsøg. Jeg får ingen fejl, men ved lokalkreds skriver den kun Array (som før) Kan det skyldes, at den valuerer fra en anden fil? Oplysningen skal ende i en mail (ikke som echo)
Jo netop. Desværre tror jeg, at jeg kører lidt i ring i øjeblikket. Det er lykkedes mig at få svaret "Array" eller slet ingen ting. Nu tror jeg, at jeg laver noget andet og vender tilbage til problemet senere på dagen.
Det var godt at komme lidt væk fra problemet. Nu virker det nemlig! :-) på formularen sørger JavaScriptet for at alle obligatoriske felter bliver udfyldt, derefter tager response.php over og skriver beskeden (echo)til modtageren og sender en mail med bestillingerne. Man kommer dog ikke retur til formularen med mindre man trykker "tilbage". Det er sådan set også udmærket.
Ja, det forståjeg godt. Det er header($return_page); Der er dog også visse fordele ved at blive stående på responsen, idet brugeren roligt kan læse echo-beskeden om, at mailen er sendt og bestillingen er gået igennem. Somme tider er usikre kunder i tvivl, om de nu også har sendt bestillingen;-) Jeg takker mange gange for hjælpen. Med venlig hilsen Arne (fast kunde:-))
Idéen med sådan et responsdokument er at holde det fri for output og kun udføre handlinger på serveren. Evt. fejlmeddelelser lægger man så i en session, inden brugeren sendes tilbage til formsiden, hvor de skrives ud.
Opstår der ikke fejl, vil brugeren som regel blive sendt til en side, som informerer om, at mail er sendt, etc.
Det er noget skidt, at brugeren informeres om fejl i ét dokument - og så skal rette dem i et andet, hvor fejlbeskederne ikke længere kan ses =)
Nu er det jo sådan, at responsen ikke får lov at køre, før alle obligatoriske felter er udfyldt (JScript) men det kan jo desværre slåes fra. Det kunne måske være en ide, at sende echo-beskeden til et specielt svardokument-måske et skilt mindre end skærmen. Tilbage til siden kom beskeden jo, da det var et dokument og det var ikke ideelt at skrive oveni samme side. Noget andet er, at TDCwebmore kun accepterer mailen sendt som SMTP. Det giver i tilgift en masse skriveri øverst på skærmen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.