NIWO - nl.internet.www.ontwerpFAQ

WDG Webontwerp FAQ deel 8: HTML-formulieren

  1. Hoe gebruik ik formulieren?
  2. Hoe krijg ik formuliergegevens naar mezelf toegemaild?
  3. Hoe gebruik ik tabellen om formulieren te structureren?
  4. Hoe maak ik een formulier zo dat het kan worden verstuurd met een druk op ENTER?
  5. Hoe krijg ik de focus op het eerste veld in een formulier?
  6. Hoe maak ik een formulier met aangepaste knoppen?
  7. Kan ik twee of meer verzendknoppen in hetzelfde formulier plaatsen?
  8. Kan ik twee of meer 'action's in hetzelfde formulier hebben?
  9. Kan ik afdwingen dat bepaalde velden worden ingevuld?
  10. Hoe sta ik bestand-uploads naar mijn website toe?
  11. Hoe gebruik ik formulieren voor uitklapnavigatie-menu's?

8.1. Hoe gebruik ik formulieren?

De basissyntax voor een formulier is: <FORM ACTION="[URL]">...</FORM>

Als een formulier wordt ingezonden ('submitted'), worden de formuliergegevens verzonden naar de URL die is opgegeven in het ACTION-attribuut. Deze URL moet verwijzen naar een programma op de server (bijv. een CGI-programma) die de formuliergegevens zal verwerken. Het formulier zelf moet bevatten

  • minstens een submit-knop (bijv. een <INPUT TYPE="submit" ...>-element),
  • formulier data-elementen (bijv. <INPUT>, <TEXTAREA>, en <SELECT>) voor zover nodig, en
  • toegevoegde markup (bijv. het identificeren van data-elementen, weergave-instructies) voor zover nodig.

Een uitgebreidere uitleg van het gebruik van formulieren is te vinden op http://www.cs.tut.fi/~jkorpela/forms/. Als je CGI-programma's op je server wilt installeren, zijn dit nuttige bronnen:

[Inhoudsopgave]

8.2. Hoe krijg ik formuliergegevens naar mezelf toegemaild?

De enige betrouwbare methode voor het verwerken van formulierinzendingen is een programma op de server (bijv. een CGI-programma). Om formuliergegevens naar jezelf toegemaild te krijgen, moet je een server-side programma gebruiken dat de formulierinzendingen verwerkt en de gegevens naar jouw email-adres toestuurt.

Web-dienstverleners (ISP's) hebben vaak standaard form-to-email programma's beschikbaar voor hun klanten. Vraag je eigen ISP naar de details.

Als je CGI-programma op je eigen server kan installeren, kijk dan bij het antwoord op de vorige vraag voor een lijst met nuttige hulpmiddelen.

Als je geen CGI-programma's op je eigen server mag draaien, kun je een op afstand beheerde form-to-email dienst gebruiken. Een lijst met zulke dienstverleners is te vinden op http://www.cgi-resources.com/Programs_and_Scripts/Remotely_Hosted/Form_Processing/. Merk op dat de aanbieder van een op afstand beheerde dienst toegang zal hebben tot alle gegevens die met de dienst worden ingezonden.

Formulieren die gebruikmaken van ACTION="mailto:..." zijn onbetrouwbaar. Mogelijk werken ze voor sommige van je gebruikers, maar ze mislukken voor anderen die afwijkende software configuraties hebben.

[Inhoudsopgave]

8.3. Hoe gebruik ik tabellen om formulieren te structureren?

Kleine formulieren worden soms binnen een TD-element in een tabel gezet. Dit kan nuttig zijn voor het plaatsen van een formulier ten opzichte van andere inhoud, maar het helpt niet bij plaatsen van de formulier-items ten opzichte van elkaar.

Om formulieren-items ten opzichte van elkaar te plaatsen, moet de gehele tabel zich binnen het formulier bevinden. Je kunt niet een formulier beginnen in het ene TH- of TD-element en eindigen in een andere. Je kunt geen formulier in een tabel plaatsen zonder het binnen een TH- of TD-element te zetten. Je kunt wel de tabel binnen in het formulier zetten, en dan de tabel gebruiken om de INPUT-, TEXTAREA-, SELECT- en andere formulier-items te plaatsen, zoals in het volgende voorbeeld wordt getoond.

001  <form action="[URL]">
002     <table border="0">
003        <tr>
004           <th>Account:</th>
005           <td><input type="text" name="account"></td>
006        </tr>
007        <tr>
008           <th>Password:</th>
009           <td><input type="password" name="wachtwoord"></td>
010        </tr>
011        <tr>
012           <td> </td>
013           <td><input type="submit" name="Inloggen"></td>
014        </tr>
015     </table>
016  </form>

[Inhoudsopgave]

8.4. Hoe maak ik een formulier zo dat het kan worden verstuurd met een druk op ENTER?

Het korte antwoord is dat het formulier maar één <INPUT TYPE=TEXT> en geen TEXTAREA moet hebben, alhoewel het wel andere formulier-elementen zoals aankruisvakjes en keuzeknoppen kan hebben. Voor een gedetailleerder antwoord, zie /saved/~flavell/www/formquestion.html.

[Inhoudsopgave]

8.5. Hoe krijg ik de focus op het eerste veld in een formulier?

Dat kun je niet met HTML doen. Maar je kunt na het formulier een script plaatsen , dat de focus op het gewenste veld plaatst, zoals dit:

001  <form id="mijnform" name="mijnform" action=...>
002      <input type="text" id="mijninput" name="mijninput" ...>
003  </form>
004  
005  <script type="text/javascript">
006    document.mijnform.mijninput.focus();
007  </script>

Een soortgelijke aanpak om de focus te plaatsen is mogelijk met behulp van <BODY ONLOAD=...>, maar sommige browsers lijken de ONLOAD-gebeurtenis uit te voeren nog voordat het gehele document (met bijv. het deel dat het formulier bevat) is geladen.

[Inhoudsopgave]

8.6. Hoe maak ik een formulier met aangepaste knoppen?

In plaats van de normale submit-knop (<INPUT TYPE=submit ...>), kun je een afbeelding gebruiken voor een aangepaste submit knop. Gebruik <INPUT NAME=Send TYPE=image SRC="http://url.to/image.gif" ALT="Zend" VALUE="Zend">. De meeste browsers sturen daarnaast ook de x en y coördinaten van de locatie waar de gebruiker klikte op de afbeelding naar de server. Deze zijn beschikbaar als "Zend.x=000&Zend.y=000" in de CGI input. Zie voor meer informatie /saved/~flavell/www/trysub.html.

Voor de 'reset'-knop zou je <BUTTON TYPE=reset ...>, JavaScript, en/of stylesheets kunnen gebruiken, alhoewel geen van deze methodes altijd n overal werkt. Zie voor meer informatie http://www.cs.tut.fi/~jkorpela/forms/imagereset.html.

[Inhoudsopgave]

8.7. Kan ik twee of meer verzendknoppen in hetzelfde formulier plaatsen?

Zeker. Dit maakt deel uit van HTML 2.0 Formulier-ondersteuning (sommige vroege browsers ondersteunden het niet, maar het browserbereik is nu uitstekend).

Je zult je 'Submit'-knoppen een 'Name'-attribuut moeten geven, en, optioneel, een 'value'-attribuut. Om erachter te komen komen welke knop wordt gebruikt, zul je onderscheidende 'Name's of 'Value's willen gebruiken, of allebei. Naast dat het wordt verzonden naar de server, geven browsers het 'Value'-attribuut ook weer in het formulier, dus kies iets dat zinvol is voor de gebruiker, zoals in dit voorbeeld:

001  <input type=submit name=deelnemen value="Ik wil nu deelnemen"> of
002  <input type=submit name=info value="Stuur meer informatie aub">

Merk op dat als je afbeeldings-verzendknoppen gebruikt, dat deze ook van verschillende 'Value'-attributen moeten worden voorzien.

Als je niet zeker weet welke resultaten je krijgt als je het formulier verzend, heeft Tipjar een standaard script dat je kunt gebruiken. Codeer dit, bijvoorbeeld (uitgaande van de methode "post"):

001  <form method="post" action="http://www.tipjar.com/cgi-bin/test">

en voer dan de handelingen uit om je formulier te verzenden. De Tipjar-server decodeert de formulier-gegevens, en geeft het resultaat voor je weer.

[Inhoudsopgave]

8.8. Kan ik twee of meer 'action's in hetzelfde formulier hebben?

Nee. Een formulier moet precies één 'action' hebben. Maar het server-side programma (bijv. CGI), dat de formulierinzendingen verwerkt, kan meerdere taken uitvoeren (bijv. een database bijwerken, e-mail versturen, een transactie opslaan) naar aanleiding van één enkele formulierinzending.

[Inhoudsopgave]

8.9. Kan ik afdwingen dat bepaalde velden worden ingevuld?

Ja. Zorg ervoor, dat het server-side programma (bijv. CGI) dat de formulierinzendingen verwerkt, een foutbericht stuurt als het veld niet goed is ingevuld. Het is het mooiste als dit foutbericht een exemplaar van het originele formulier bevat met de oorspronkelijk (incompleet) opgegeven gegevens al van te voren ingevuld.

Daar bovenop kun je JavaScript gebruiken in het ONSUBMIT-attribuut van het formulier om te formulier te controleren voor degenen die JavaScript hebben ingeschakeld. Laat de ONSUBMIT-gebeurtenisafhandeling de gebruiker op de hoogte stellen van het probleem als het formulier niet compleet is, en dan 'false' teruggeven. Merk op dat het server-side programma niet afhankelijk moet zijn van het controlewerk van het client-side script.

[Inhoudsopgave]

8.10. Hoe sta ik bestand-uploads naar mijn website toe?

Ten eerste: de RFC hiervoor is te vinden op http://ftp.ics.uci.edu/pub/ietf/html/rfc1867.txt.

Bestand-upload wordt verzorgd door de CGI.pm Perl5 library beschikbaar op http://stein.cshl.org/WWW/software/CGI/cgi_docs.html. The most recent versions of the cgi-lib.pl library also support file upload.

Deze zaken zijn noodzakelijk voor uploads vanaf een website:

  • Een HTTP server die uploads accepteert.
  • Toegang tot de /cgi-bin/ om het ontvangende script te plaatsen.
  • Een formulier, ongeveer zo opgebouwd:
    001  <form method="POST"
    002   enctype="multipart/form-data" action="fup.cgi">
    003  Bestand te uploaden: <input type=file name=upfile><br>
    004  Aantekeningen m.b.t. het bestand: <input type=text name=note><br>
    005  <input type=submit value=Druk> om het bestand te uploaden!
    006  </form>
    

Niet alle browsers ondersteunen bestand-upload op basis van formulieren, dus probeer waar mogelijk alternatieven te geven. Als je bestands-upload nodig hebt in combinatie met formulier-naar-email, kan het Perl pakket MIME::Lite e-mail-bijlagen verwerken.

[Inhoudsopgave]

8.11. Hoe gebruik ik formulieren voor uitklapnavigatie-menu's?

Dit kan niet met alleen HTML; iets anders moet het formulier verwerken. Verwerking met JavaScript werkt alleen maar met lezers die een JavaScript-geschikte browser hebben. CGI en andere server-side verwerking is betrouwbaar voor menselijke lezers, maar zoekmachines hebben problemen met het volgen van elke navigatie die op formulieren is gebaseerd.

Kijk op <http://www.cs.tut.fi/~jkorpela/navmenu.html, waar wordt uitgelegd hoe uitklapmenu's kunnen worden gemaakt, naast enkele betere navigatie-alternatieven.

[Inhoudsopgave]