Op de website die ik gemaakt heb wil ik graag een contactformulier plaatsen.
Het formulier maken is geen probleem, maar het laten verzenden lukt me niet goed.
Ik heb het nu zo <form action="mailto:eigen@email.adres" method="post"> maar op die manier wordt het verzonden via het lokale email programma, je weet wel... niet handig, werkt vaak niet goed, en ik krijg het raar binnen.
Wat moet ik er nu nog aan toevoegen om het zo te krijgen dat als de gebruiker op verzenden klikt, het ook direct verzonden wordt en ik het duidelijk binnen krijg?
Via google kom ik er niet uit, via starthosting (waar de site online staat) kom ik ook niet verder. En ze geven ook geen support daarop.
Ik ben pas een beginner, en gebruik html kit. Heb al wel iets gevonden met/over php maar dat zegt me niets... ik weet niet hoe ik dat kan toepassen of gebruiken.
Is er hier iemand die me op weg kan helpen?
14 antwoorden
Gesponsorde links
Thomas - 26/11/2013 16:06 (laatste wijziging 26/11/2013 16:14)
Moderator
Meestal verwijst de action-eigenschap van een formulier naar een URL waar zich een script bevindt die de formulier-invoer kan verwerken. Dit handelt je webserver vervolgens helemaal voor je af (zonder tussenkomst van de persoon die die webpagina bezoekt), en na afloop krijg je een boodschap terug of het verwerken van de informatie en het versturen van de e-mail is gelukt.
Afhankelijk van wat voor hosting- of software-pakket je gebruikt (denk bijvoorbeeld aan populaire Content Management Systemen (CMS) zoals Joomla of Drupal of blogsystemen zoals WordPress) wordt er allerlei out-of-the-box spul meegeleverd die het bouwen van formulieren + de afhandeling ervan eenvoudiger maakt.
Als de webruimte die je huurt verder "kaal" is kun je wellicht zelf een eenvoudig PHP-script (of wat voor taal je account anders ondersteunt) in elkaar klussen of dit samen met anderen doen / hier hulp bij vragen. Of je installeert een CMS of blogsysteem die het eenvoudiger (of complexer ) maakt.
Het verzenden van -zoals het klinkt- een contactformulier is op zich helemaal niet moeilijk, maar het hangt er een beetje vanaf wat je precies wilt. Wil je een nette opgemaakt HTML-mail, of een eenvoudige plaintext mail. Moet er ook nog een CC-tje terug naar jezelf bij wijze van succesvole verzending etc.. Daarnaast moet je webruimte dus beschikken over een soortement van programmeertaal en daarbij moet deze in staat zijn (viavia) mail te versturen vanaf je website.
Dit zijn denk ik zo'n beetje de benodigdheden en mogelijkheden in a nutshell.
EDIT: starthosting heeft blijkbaar iets genaamd Sitebuilder, waarmee je (waarschijnlijk) makkelijk een site (of onderdelen?, zoals een contactformulier) kunt maken. Ook lijkt het erop dat zij PHP en MySQL ondersteunen. Tevens worden op die pagina Joomla en WordPress aangestipt.
Het hostingpakket klein heeft geen "uitgaande e-mailserver" dus het is niet zeker of je daarmee mail kunt versturen, alles daarboven wel. Als je het "klein" pakket hebt, zou je kunnen vragen of je middels PHP e-mail kunt versturen.
Ik heb inderdaad een klein pakket.
Maar gebruik niet de sitebuilder. Heb alleen html geleerd, en dit al bijna klaar. Dus het leek me onhandig om alles weer overnieuw te doen mbv de sitebuilder.
Mijn site bestaat uit een index, paar pagina's en een css. Dit alles in html.
Hoe past PHP daarin?
Het gaat inderdaad om een contactformulier. Het maakt me niet zo heel veel uit hoe het binnen komt op mijn email, als het maar duidelijk leesbaar is.
Okay, een hele korte crash course PHP (er is een tutorial voor, maar de voorbeelden daarvan worden niet goed weergegeven).
Een aantal eigenschappen van een PHP-bestand:
- een PHP-bestand is een gewoon, leesbaar tekstbestand (ASCII), met de bestandsextensie .php
- een PHP-bestand hoeft niet per se PHP-code te bevatten, als je al de extensies van je HTML-bestanden aanpast in .php (en alle interne verwijzingen aanpast uiteraard) zal alles waarschijnlijk nog steeds werken
- een PHP-bestand is dus in zekere zin niets meer dan een HTML-bestand, uitgebreid met extra functionaliteit, het stelt je namelijk in staat -naast gewone HTML- PHP-code te schrijven in deze bestanden; deze code moet tussen speciale karakters / in speciale blokken staan, doorgaans ziet een PHP-blok er zo uit:
Regels die beginnen met // (of #, of tussen /* ... */ staan, zoals je wellicht van CSS kent) kunnen een toelichting bevatten, deze passages bevatten platte tekst die verder geen effect heeft (heeft geen betekenis in termen van PHP-code).
Als een bestand de extensie .php heeft, en PHP-codeblokken bevat, dan zal deze code aan de webserverzijde geïnterpreteerd en verwerkt worden. Als al je code op de goede manier geschreven is dan zie je, als je de broncode van de pagina in een webbrowser bekijkt, deze PHP-code niet terug. Deze is immers aan de serverkant verwerkt. De "output" (in je browser) van een PHP-bestand is dus nooit rauwe PHP-code, maar het resultaat van de verwerkte code.
PHP stelt je ook in staat HTML af te drukken (vergelijkbaar met JavaScript, denk aan document.write() als je dit iets zegt). Bijvoorbeeld het beroemde voorbeeld:
Als je dit stukje code opslaat in een tekstbestand, deze hernoemt naar hello.php en dit vervolgens op een server zet die PHP ondersteunt, en in je browser hello.php aanroept dan zal er "Hello world" op je scherm worden afgedrukt, in "Koptekst 1" formaat. Als je de broncode van deze pagina bekijkt, dan zul je enkel "<h1>Hello world</h1>" zien staan, en verder niets! De PHP-code is immers al op de server verwerkt, alles wat over is is de uitvoer van deze code (het afdrukken van de tekst).
Dan een FFWD naar wat jij wilt: een contactformulier. Dat is meteen een redelijk geavanceerd onderwerp (voor een PHP beginner). Als je dit niet via die Sitebuilder wilt doen kun je zelf wel iets in elkaar fietsen, wij kunnen hier bij helpen. Rijst de vraag, welk pakket heb je? Als je de "klein" variant hebt werkt mail mogelijk niet. Je zou een hele snelle test kunnen doen door de volgende snippet ergens op je site te zetten (noem deze mailtest.php ofzo, en verwijder deze nadat je deze eenmalig hebt aangeroepen via je browser):
Uiteraard jouw@email.adres even aanpassen naar... jouw e-mail adres. Als het goed is zou je nu na aanroep van mailtest.php de tekst "het e-mailbericht is verstuurd" moeten zien. En na enige tijd (spamfilter etc. daargelaten) zou je een e-mailbericht moeten ontvangen met respectievelijk onderwerp en tekst 'test onderwerp' en 'test bericht'.
Als dat allemaal werkt weet je dus dat je kunt mailen vanaf je website en kunnen we het contactformulier en bijbehorende afhandelingsscript gaan bouwen.
Wauw, super bedankt voor je uitleg.
Ik snap het en het werkt!!
Kreeg hello world tevoorschijn, en de mail test werkte ook. Ik kan dus met het 'klein' pakket mailen vanaf de website. Fijn om te weten. En wat fijn dat je de moeite neemt om te helpen!!
Als ik het goed begrijp heb ik nu dus een php bestand nodig die aansluit op het contactformulier wat ik gemaakt heb.
Thomas - 27/11/2013 14:32 (laatste wijziging 27/11/2013 14:35)
Moderator
Okay, volgende stap .
Vaak wanneer je een bepaald stuk functionaliteit maakt (contactformulier, nieuwsbrief, wat dan ook) denk je alles (of in ieder geval de grove lijnen) uit, bijvoorbeeld op papier of whiteboard:
- uit welke pagina's bestaat alles, en hoe zien deze eruit?
- wat voor acties kan een gebruiker allemaal (achtereenvolgens) uitvoeren, en wat gebeurt er vervolgens (dus hoe navigeert een gebruiker door je applicatie)?
Knutselen op papier of whiteboard -zodat je een grof of zelfs een compleet uitgewerkt idee hebt- en daarna aan het programmeren slaan is doorgaans een makkelijker proces dan maar beginnen met code kloppen en dan halverwege bedenken dat je het toch anders wilt aanpakken . Naarmate je meer ervaring opbouwt kun je hier natuurlijk mee schuiven. Eerst ontwerpen, dan bouwen blijft handig.
Ik heb het vaak genoeg het verzoek gekregen om "even een contactformuliertje te bouwen". De uitwerking hiervan kan alles behalve triviaal blijken als men allemaal toeters en bellen wil.
Denk bijvoorbeeld aan de volgende zaken:
- heeft het formulier verplichte velden?
- stel dat iemand een verplicht veld vergeet, dan moet het formulier aangevuld worden met deze verplichte informatie, maar een gewone HTML-pagina onthoudt de eerder ingevulde waarden niet uit zichzelf! waarschijnlijk wil je niet dat iemand alles weer opnieuw moet invullen? zou voor mij in ieder geval een reden zijn om het niet opnieuw te proberen, zo kun je potentiële klanten verliezen...
- mogelijk moeten bepaalde invulvelden (naast dat ze inhoud hebben indien ze verplicht zijn) ook op vorm gecontroleerd worden, denk aan e-mailadres of postcode
- je wilt op een of andere manier terugkoppeling nadat je het formulier (compleet en correct) hebt ingevuld, wil je een bedank-pagina? wil je een CC van je verstuurde informatie?
- dan de contact-mail zelf: moet deze in platte tekst opmaak, of HTML-opmaak, of allebei? gaat er alleen een mailtje naar de beheerder van de site zelf, of gaat er ook een CC terug? heeft de mail attachments of wat dan ook?
- mogelijk wil je ook een antispam-voorziening aanbrengen op je contactformulier (denk aan een CAPTCHA ofzo)
- daarnaast moet er bij dit soort formulieren (die mail versturen) ook enige aandacht besteed worden aan security; code die formulier-invoer niet (goed) controleert kan kwaadwillenden in staat stellen om via jouw site/contactformulier spam te versturen naar anderen
Okay, genoeg bangmakerij, maar hopelijk ook genoeg stof om na te denken: uit welke velden bestaat je formulier, welke velden zijn verplicht, wil je dat je nette foutmeldingen krijgt als de formulierinvoer niet volledig/correct is, met de velden die al ingevuld waren weer automagisch ingevuld? wat moet er verzonden worden (platte tekst, html) en naar wie (afzender, enkel contactpersoon website, beide)? wat moet er na afloop gebeuren (bedankpagina)?
EDIT: Yes, de action-eigenschap van je form-tag moet naar een PHP-script wijzen die de afhandeling op zich neemt. Je zou kunnen overwegen van je contactformulierpagina zelf ook een PHP-bestand te maken, dit kan het e.e.a. eenvoudiger maken.
Het gaat allereerst om een simpel contactformulier. Als me dat lukt is de volgende stap een heel bestelformulier online te zetten, wat ingevuld kan worden. Maar ik denk dat ik het mezelf dan wel heel moeilijk maak nu ik een beetje begin te begrijpen wat het inhoudt ;)
Maar goed eerst het contactformulier maar eens. Het formulier wat ik heb bestaat uit 5 velden. Naam, woonplaats, telefoon, email, en bericht. Daarvan zijn de eerste, en laatste 2 verplicht.
Het zou inderdaad prettig wezen als er na het verzenden een bedankpagina komt.
De informatie hoeft alleen maar naar mijn email adres te worden verzonden, en het liefst een beetje goed leesbaar
Hoe kan ik dat maken? Waar is het begin? ;)
Thomas - 28/11/2013 12:21 (laatste wijziging 28/11/2013 12:22)
Moderator
Het begin is een specificatie, en het bovenstaande verhaal is compleet genoeg.
De contactformulier-functionaliteit bestaat uit 3 onderdelen:
het formulier zelf --(submit)--> verwerking van het formulier --(succes:redirect)--> bedankpagina
^______________(fail:redirect)________|
het formulier zelf --(submit)-->verwerking van het formulier --(succes:redirect)-->bedankpagina
^______________(fail:redirect)________|
Dit is de "flow" door je "programma".
Ik ben altijd een groot voorstander van gebruiksvriendelijke formulieren en ik ben lui, dus ik wil alles maar 1x invullen . De velden die je al ingevuld hebt zou ik weer automatisch invullen. Als het formulier zelf en de verwerking ervan op twee verschillende plaatsen (URL's) staat, dan zal de formulierinformatie overgeheveld moeten worden van de ene naar de andere pagina, immers, HTTP is een "stateless" protocol, het onthoud niets van je eerder bezochte pagina. Het submitten (POSTen) van een formulier wordt door je browser verzorgd, maar het terugplaatsen van de informatie in je formulier, daarvoor zul je zelf iets moeten verzinnen.
Je zou twee dingen kunnen doen:
- je maakt voor het formulier en de afhandeling twee aparte "pagina's" en je gebruikt sessies om de informatie terug te krijgen in je formulier; dit is de super deluxe uitvoering van je contactformulier, heeft wel een voorwaarde: de gebruiker moet cookies accepteren (hierin staat het sessie-id opgeslagen zodat jouw informatie nog bereikbaar is), tenzij je sessie-id via je URL wordt doorgegeven; als je dit gebruikt, ben je eigenlijk al 80% van wat je normaal in PHP gebruikt aan het combineren, dus wellicht voert dit voor dit moment een beetje ver
- je stopt het formulier en de afhandeling in dezelfde pagina, dit heeft als voordeel dat je het formulier "naar jezelf" submit en de dus niet hoeft te sleuren met je formulierdata
Of je kiest voor nu voor een eenvoudige variant, waarbij de velden niet opnieuw worden ingevuld. Misschien is dat voor nu het makkelijkste (#2 zonder opnieuw invullen formuliergegevens). Maar dan wil je op zijn minst nog terugcommuniceren wat men verkeerd heeft ingevuld, keuzes keuzes .
Poeh, dit moest ik eerst een paar keer lezen voordat het duidelijk was. Ik ben hier echt niet zo in thuis
Het lijkt mij dan inderdaad het beste om te kiezen voor optie 2, is voor nu lastig genoeg.
Hoe kan ik dat het beste doen? Moet ik zelf een php script schrijven? Of bestaat er iets wat ik kan gebruiken en alleen een beetje hoef aan te passen?
Dat laatste lijkt me wel makkelijk, tot voor kort had ik nog nooit van php gehoord.
Ik heb me er inmiddels een beetje in verdiept, maar het blijft er ingewikkeld uit zien
Daarnaast kun je op PHP.net alles ook terugvinden.
Ook zou je deze reactie als inspiratie kunnen gebruiken voor de opzet van je contactformulier, daar zit eigenlijk alles in wat je nodig hebt, behalve het verzenden van de mail zelf (die je uit de mail-tutorial kunt halen).
Probeer het eens uit. Als je dit allemaal teveel werk is kan ik ook wel e.e.a. combineren, maar dat zou in principe m.b.v. knip- en plakwerk uit bovenstaande bronnen al moeten lukken .
EDIT: Het begin is er.
Kan het formulier laten verzenden naar mijn emailadres.
Maar ik heb nog een paar vragen
Maar het lukt me nog niet zo goed om bepaalde velden verplicht te maken. Hoe kan ik dat het beste doen?
En na het verzenden van het formulier komt er een pagina met 'bedankt etc' dit is nu nog gewoon een blanke pagina. Maar deze zou ik graag hetzelfde uiterlijk geven als de rest van de pagina. Kan dat? Zo ja, hoe doe ik dat?
Ik heb een html bestand waarin mijn formulier staat, en een php bestand waarin staat wat er met het formulier moet gebeuren.
Thomas - 02/12/2013 21:13 (laatste wijziging 02/12/2013 21:15)
Moderator
Naarmate je webpagina's en daarmee je site dynamischer worden, zul je meer PHP gaan gebruiken. Een van de mogelijkheden van PHP (maar dit hebben andere talen ook) is om een bestand in een ander bestand in te voegen. Op die manier kun je een pagina uit meerdere lappen PHP-code (maar ook HTML!) opbouwen. Een van de bijkomende delen daarvan is herbruikbaarheid.
Waarschijnlijk is jouw website opgebouwd uit meerdere HTML-pagina's? En elk van deze pagina's bevatten in principe de complete (algemene) layout van je website correct? Je bent er vast wel eens tegenaan gelopen dat je iets in je layout wilde veranderen... X het aantal pagina's waar je website uit bestaat?
Met PHP (of iets soortgelijks) hoeft dat dus niet, als je je pagina opknipt in slimme stukken en deze daarna weer hercombineert kun je het zo maken dat je in principe van elk onderdeel (statisch of dynamisch) maar één bronbestand hebt, in plaats van tig keer.
Ik weet niet hoe groot / dynamisch je website is, maar voor het contactformulier kun je het sjabloon nog wel een x kopiëren lijkt mij? Je hele site opknippen in stukken en hercombineren lijkt mij voor nu nogal veel werk. En je wilt dit waarschijnlijk op je gemak testen en daar gaat ook wel wat tijd in zitten.
Als je je layout wilt behouden is het waarschijnlijk het eenvoudigste om alles ineen te stoppen, dus contactformulier, verwerking en bedankpagina ineen. Dit misschien in tegenstelling tot wat ik eerder heb gezegd? Meh.
<?php
// verwerking van je formulier
$errors = array(); // een lijst van foutmeldingen
if (isset($_GET['action']) && $_GET['action'] == 'verwerk') {
// controleer $_POST, voor nu alleen een dump
echo '<pre>'.print_r(array_map('htmlentities', $_POST), true).'</pre>';
// indien er geen foutmeldingen zijn opgetreden
if (!count($errors)) {
// verstuur mail
// ...
// verwijs de gebruiker door naar de bedankpagina
header('Location: contactformulier.php?action=bedankt');
exit;
}
} // einde verwerk
// vervolgens knip en plak je hieronder je pagina-opmaak
?>
<html>
<head>
<title>test</title>
</head>
<body>
<?php
// willen we de bedankt-pagina afdrukken?
if (isset($_GET['action']) && $_GET['action'] == 'bedankt') {
?><h1>Bedankt</h1><?php
} else {
// we zaten niet op de bedanktpagina
// dit houdt in dat we het formulier moeten tonen
// mogelijk wordt het formulier opnieuw getoond omdat de invoer fout was
// waren er fouten?
if (count($errors)) {
?><blockquote>Er zijn fouten opgetreden, controleer uw invoer</blockqoute><?php
}
// toon het formulier, al dan niet met met de voorheen ingevulde waarden
?><form action="contactformulier.php?action=verwerk" method="post">
...
<button type="submit">Verzenden</button>
</form><?php
}
?>
</body>
</html>
Oke, wederom heel erg bedankt voor je antwoord!
Het ging allemaal heel mooi. Maar nu snap ik er echt niets meer van
Ik moet dus de pagina die ik heb (.htm), met de pagina die ik daarbij heb voor de afhandeling van het formulier (.php), combineren met de code hierboven en in de link.
Dus 1 pagina waarin alles staat??
Hoe sla ik dat geheel dan op? Als html of php?
Als het 1 pagina is wat vul ik hier dan in, bij regel 16
header('Location: contactformulier.php?action=bedankt');
en bij action (regel 45 ?><form action="contactformulier.php?action=verwerk" method="post">)
Of moet ik er dan toch nog iets bij hebben?
Ik verdwaal een beetje in alle code's nu
Thomas - 04/12/2013 20:49 (laatste wijziging 04/12/2013 20:50)
Moderator
Gub schreef:
Oke, wederom heel erg bedankt voor je antwoord!
Het ging allemaal heel mooi. Maar nu snap ik er echt niets meer van Â
Ik moet dus de pagina die ik heb (.htm), met de pagina die ik daarbij heb voor de afhandeling van het formulier (.php), combineren met de code hierboven en in de link.
Dus 1 pagina waarin alles staat??
Yes, alle in 1 pagina. Lijkt mij voor nu het handigste / eenvoudigste.
Gub schreef:
Hoe sla ik dat geheel dan op? Als html of php?
Er zit PHP in, dus de pagina moet als .php opgeslagen om (op de server) als PHP-pagina herkend (en dus verwerkt) te worden.
Gub schreef:
Als het 1 pagina is wat vul ik hier dan in, bij regel 16
header('Location: contactformulier.php?action=bedankt');
en bij action (regel 45 ?><form action="contactformulier.php?action=verwerk" method="post">)
Of moet ik er dan toch nog iets bij hebben?
Ik verdwaal een beetje in alle code's nu Â
Hernoem alle voorkomens (2 stuks) van "contactformulier.php" in de voorbeeldcode naar de naam die je het PHP-bestand hebt gegeven. Dus als je voor dit complete PHP-bestand de naam contact.php hebt gekozen, vervang je alle voorkomens van "contactformulier.php" door "contact.php".
Het PHP-bestand praat met zichzelf, zeg maar.
EDIT: Die header('Location: ...') functie aanroep doet hetzelfde als de HTML META-tag waarmee je de pagina kunt refreshen, je wordt op die manier doorgestuurd naar dezelfde pagina, die op grond van de waarde van $_GET['action'] een ander stukje van deze zelfde pagina laat zien.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.