Moduli
Qualsiasi modulo HTML su un sito Lobsite può raccogliere messaggi: punta il suo action a /_lobsite/forms/<name> e pubblica. Nessun backend da scrivere, nessuno script da aggiungere e nessuna chiave da incollare. Gli invii arrivano nella pagina Invii della tua dashboard e nella tua email.
<form action="/_lobsite/forms/contact" method="POST">
<input name="email" type="email" required>
<textarea name="message" required></textarea>
<button>Send</button>
</form>
Come funzionano i moduli
- L'action dà il nome al modulo.
/_lobsite/forms/contactè il modulocontact. I nomi sono lettere minuscole, cifre,-e_. Usa un nome per scopo (contact,newsletter,quote); più pagine possono condividere un modulo. - I moduli vengono individuati al deploy. Il deploy legge i file HTML e registra ogni modulo che invia a
/_lobsite/forms/. Il modulo deve trovarsi in un file HTML della cartella pubblicata: un modulo che esiste solo dopo che JavaScript lo ha generato non viene trovato (vedi Framework). - I campi vengono salvati con il nome che dai loro. Ogni campo con un
nameviene conservato, come testo. Un campo chiamatoemailviene usato come Reply-To dell'email di notifica e come titolo nella pagina Invii. Il caricamento di file non è supportato. - La protezione antispam viene aggiunta per te. Quando la pagina viene servita, al modulo si aggiungono un campo trappola nascosto e un timestamp firmato. Gli invii che compilano la trappola o tornano entro 2 secondi vengono messi da parte come spam, e troppi di fila da uno stesso visitatore vengono respinti.
- Dopo l'invio, il visitatore vede una pagina di ringraziamento con un link per tornare indietro, o la pagina impostata con
redirect. - I moduli funzionano sugli URL di produzione. I deploy di anteprima non accettano invii, e un sito pubblicato senza account li accetta una volta rivendicato.
Tipi di modulo
Ogni modulo è un modulo di contatto o una lista d'attesa. Il tipo decide come vengono mostrati i suoi invii nella pagina Invii: le righe di un modulo di contatto mostrano il messaggio, quelle di una lista d'attesa mostrano chi si è iscritto e da quale pagina, e le liste d'attesa vengono contate sopra la tabella. Entrambi inviano la stessa email di notifica.
Lobsite sceglie il tipo al deploy:
- Un modulo in cui i visitatori inseriscono un'email e al massimo un nome è una lista d'attesa. I campi nascosti, i campi che iniziano con
_e le caselle di spunta (un consenso) non contano. - Lo è anche un modulo chiamato
waitlist,newsletter,signup,subscribe,early-access,betaonotify, qualunque siano i suoi campi. - Ogni altro modulo è un modulo di contatto.
Per scegliere tu, imposta type in lobsite.toml:
[forms.launch]
type = "waitlist" # or "contact"
Le iscrizioni alle liste d'attesa vengono conservate finché il modulo esiste; gli altri invii per il periodo di conservazione del piano (vedi Limiti).
Modulo di contatto
Una pagina completa con nome, email e messaggio. Le etichette e i valori autocomplete lo rendono facile da compilare; gli attributi required bloccano un invio vuoto prima che parta.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Contact</title>
</head>
<body>
<h1>Get in touch</h1>
<form action="/_lobsite/forms/contact" method="POST">
<label>Name
<input name="name" autocomplete="name" required>
</label>
<label>Email
<input name="email" type="email" autocomplete="email" required>
</label>
<label>Message
<textarea name="message" rows="5" required></textarea>
</label>
<button type="submit">Send</button>
</form>
</body>
</html>
Per controllare gli stessi campi sul server e mandare i visitatori alla tua pagina di ringraziamento, aggiungi il modulo a lobsite.toml e crea thanks.html:
[forms.contact]
required = ["name", "email", "message"]
types = { email = "email" }
redirect = "/thanks"
Lista d'attesa
Prima del lancio basta un campo email. Il nome del modulo lo rende una lista d'attesa; impostare type lo dichiara esplicitamente. Le iscrizioni vengono contate nella pagina Invii e conservate finché il modulo esiste.
<form action="/_lobsite/forms/waitlist" method="POST">
<label for="wl-email">Get early access</label>
<input id="wl-email" name="email" type="email" autocomplete="email" placeholder="you@example.com" required>
<button>Join the waitlist</button>
</form>
[forms.waitlist]
type = "waitlist"
required = ["email"]
types = { email = "email" }
Iscrizione alla newsletter
Basta un campo. Un secondo modulo sullo stesso sito ha un nome suo, così iscrizioni e messaggi restano separati nella pagina Invii e negli export. Un modulo con il solo campo email (e al massimo un nome) è una lista d'attesa: vedi Tipi di modulo.
<form action="/_lobsite/forms/newsletter" method="POST">
<label for="nl-email">Get updates by email</label>
<input id="nl-email" name="email" type="email" autocomplete="email" required>
<input type="hidden" name="_redirect" value="/subscribed">
<button>Subscribe</button>
</form>
_redirect è un campo nascosto che sceglie la pagina mostrata dopo l'invio. Deve essere un percorso o un URL dello stesso sito; redirect in lobsite.toml ha la precedenza.
Richiesta di preventivo
Menu a tendina, pulsanti di opzione e caselle di spunta funzionano come al solito. Le caselle con lo stesso nome vengono salvate come un unico valore separato da virgole.
<form action="/_lobsite/forms/quote" method="POST">
<input name="name" autocomplete="name" required>
<input name="email" type="email" autocomplete="email" required>
<input name="phone" type="tel" autocomplete="tel">
<select name="budget">
<option>Under $1,000</option>
<option>$1,000 to $5,000</option>
<option>Over $5,000</option>
</select>
<fieldset>
<legend>Services</legend>
<label><input type="checkbox" name="services" value="Design"> Design</label>
<label><input type="checkbox" name="services" value="Development"> Development</label>
<label><input type="checkbox" name="services" value="Hosting"> Hosting</label>
</fieldset>
<textarea name="details" required></textarea>
<button>Request a quote</button>
</form>
Inviare senza lasciare la pagina
Per mostrare un messaggio sul posto invece di caricare una nuova pagina, invia il modulo con fetch. Costruisci il corpo con new FormData(form) così i campi antispam nascosti vengono inclusi, e chiedi JSON con l'header Accept:
<form id="contact" action="/_lobsite/forms/contact" method="POST">
<input name="email" type="email" required>
<textarea name="message" required></textarea>
<button>Send</button>
<p id="contact-status" role="status"></p>
</form>
<script>
const form = document.getElementById("contact");
const status = document.getElementById("contact-status");
form.addEventListener("submit", async (event) => {
event.preventDefault();
status.textContent = "Sending…";
const res = await fetch(form.action, {
method: "POST",
body: new FormData(form),
headers: { Accept: "application/json" },
});
const answer = await res.json();
if (answer.ok) {
form.reset();
status.textContent = "Thanks! We'll be in touch.";
} else {
status.textContent = answer.errors ? Object.entries(answer.errors).map(([field, why]) => `${field}: ${why}`).join(", ") : "Something went wrong. Please try again.";
}
});
</script>
La risposta è {"ok": true}, oppure {"ok": false, "errors": {"email": "Required"}} per i campi che non hanno superato i controlli, oppure {"ok": false, "error": "rate_limited"} (anche too_large, not_found, forms_off). Senza lo script, lo stesso modulo funziona comunque come un modulo normale.
Framework
React, Vue, Svelte, Astro e gli altri funzionano quando il modulo è nell'HTML generato, che è ciò che producono il prerendering e l'export statico (Astro ed Eleventy di default, Next.js con output: "export", SvelteKit con prerender, Nuxt con nuxt generate). Tieni gli attributi action e method sull'elemento <form> stesso.
In un'app a pagina singola, il modulo deve essere nell'HTML generato e restare com'è stato servito: un modulo che esiste solo in JavaScript non viene registrato e i suoi invii vengono respinti, e un modulo che il browser rigenera perde i campi antispam, quindi i suoi messaggi finiscono nello spam.
// React: a plain form element, prerendered into the HTML.
export function Contact() {
return (
<form action="/_lobsite/forms/contact" method="POST">
<input name="email" type="email" required />
<textarea name="message" required />
<button>Send</button>
</form>
);
}
Impostazioni
Ogni modulo può avere una sezione in lobsite.toml. Tutte le chiavi sono facoltative; le impostazioni viaggiano con il deploy.
[forms.contact]
type = "contact" # contact or waitlist; inferred when left out
required = ["email", "message"] # fields that can't be empty
types = { email = "email", phone = "tel" } # text, email, number, url or tel
redirect = "/thanks" # the page shown after sending
notify = ["you@example.com"] # who gets an email for each message
webhook = "https://example.com/hooks/contact" # POSTs each submission as JSON
Un invio che non supera required o types non viene salvato; il visitatore vede cosa correggere e un link per tornare indietro. Nel piano gratuito, notify può essere solo l'email del tuo account e webhook non è disponibile.
Leggere gli invii
- La pagina Invii della dashboard mostra gli invii di tutti i moduli in un'unica tabella. Cercali, filtrali per sito e per tipo di modulo, e passa allo spam per vedere cosa hanno intercettato i controlli. Un invio è nuovo finché non lo apri.
- Ogni messaggio viene inviato per email all'indirizzo del tuo account, con Reply-To impostato sul mittente.
lobsite forms lselenca i tuoi moduli;lobsite forms export contact --csvscarica gli invii di un modulo. L'export CSV nella pagina Invii scarica ciò che mostra la tabella.
Nel piano gratuito i moduli funzionano in modalità limitata: una quota mensile per sito, notifiche solo all'email dell'account e niente webhook. Il piano Standard aggiunge i webhook, qualsiasi indirizzo di notifica verificato e nessun tetto mensile. Vedi Limiti.