Add working availability form with PHP email sending

- send.php handles form submission and sends email via mail()
- Honeypot field for bot protection
- IP-based rate limiting (60s cooldown)
- Query logging to data/kyselyt.log
- Frontend JS with loading state and success/error feedback
- data/ directory protected with .htaccess

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 00:41:08 +02:00
parent 83193565ce
commit f0d3b66756
3 changed files with 147 additions and 0 deletions

View File

@@ -198,6 +198,9 @@
<p>Täytä lomake ja selvitämme valokuidun saatavuuden osoitteessasi. Vastaamme yleensä 12 arkipäivän kuluessa. Kysely ei velvoita mihinkään.</p>
</div>
<form class="form" id="availability-form">
<div style="position:absolute;left:-9999px;top:-9999px;">
<input type="text" name="website" tabindex="-1" autocomplete="off">
</div>
<div class="form-group">
<label for="company">Yrityksen nimi</label>
<input type="text" id="company" name="company" required>
@@ -259,5 +262,48 @@
</div>
</footer>
<script>
// Mobiilinavigaatio
document.querySelector('.nav-toggle')?.addEventListener('click', function() {
document.querySelector('.nav')?.classList.toggle('open');
});
// Saatavuuskysely-lomake
document.getElementById('availability-form')?.addEventListener('submit', async function(e) {
e.preventDefault();
const btn = this.querySelector('button[type="submit"]');
const originalText = btn.textContent;
btn.disabled = true;
btn.textContent = 'Lähetetään...';
try {
const formData = new FormData(this);
const response = await fetch('send.php', {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.success) {
btn.textContent = 'Lähetetty!';
btn.style.background = '#27ae60';
this.reset();
setTimeout(() => {
btn.textContent = originalText;
btn.style.background = '';
btn.disabled = false;
}, 4000);
} else {
alert(data.error || 'Jokin meni pieleen. Yritä uudelleen.');
btn.textContent = originalText;
btn.disabled = false;
}
} catch (err) {
alert('Yhteysvirhe. Tarkista verkkoyhteytesi ja yritä uudelleen.');
btn.textContent = originalText;
btn.disabled = false;
}
});
</script>
</body>
</html>