Duplikált beküldések és a megelőzésük
Miért keletkezhet kétszer egy beküldés, milyen védelmi rétegek vannak a Gravity Formsban, és mit ellenőrizz, ha mégis duplikált bejegyzéseket látsz.
Néha úgy tűnik, hogy az űrlap többször lett beküldve, pedig a látogató csak egyszer kattintott a küldés gombra. A Gravity Forms több védelmi réteget használ, az ok szerint. Három eset fordul elő: az oldal újratöltése vagy egy böngészőlap visszaállítása a sikeres beküldés után, többszörös kattintás, amíg az űrlap még feldolgozás alatt van, és ugyanannak az egyedi értéknek az ismételt beküldése.
Miért keletkeznek duplikátumok
Szekció neve “Miért keletkeznek duplikátumok”Böngészős újraküldés az oldal újratöltésekor. Beküldéskor a böngésző POST-kéréssel küldi el az űrlapadatokat az oldalnak. Ha a látogató a visszaigazoló képernyőn marad, majd frissíti az oldalt, vagy később visszatér a lapra és újratölti a böngészőt, ugyanaz a kérés újra elmehet. Ez a böngészőtől függően figyelmeztetéssel vagy anélkül történhet.
Többszörös kattintás lassú beküldés közben. Ha a beküldés lassú a fizetés, fájlfeltöltés vagy CAPTCHA-ellenőrzés miatt, a látogató a várakozás közben többször is kattinthat a Küldés vagy a Tovább gombra. Minden kattintás újabb beküldést indíthat, ha az űrlap nem blokkolja vagy nem hagyja figyelmen kívül a további próbálkozásokat.
Ismételt beküldés ugyanazzal az értékkel. A látogató újra beküldi ugyanazt az e-mail-címet, felhasználónevet vagy azonosítót. Ez adatduplikáció, nem böngésző- vagy dupla kattintás okozta probléma, és külön, az Ismétlődések tiltása mezőbeállítással kezelhető.
A védelem rétegei
Szekció neve “A védelem rétegei”A Gravity Forms három, egymástól független mechanizmussal véd a duplikátumok ellen.
Újratöltés elleni védelem
Szekció neve “Újratöltés elleni védelem”Miután a kiszolgáló elmentette a beküldést és megjelenítette a visszaigazolást, a Gravity Forms egy kis szkriptet futtat a háttérben. A szkript úgy módosítja a böngésző címsorát, hogy az oldal egyszerű frissítése oldalbetöltésnek számítson, ne az űrlap újraküldésének. Ez a védelem automatikusan működik, és alapból be van kapcsolva.
A szkript csak sikeres beküldés után fut. Sikertelen ellenőrzés vagy megszakadt beküldés nem indítja el.
Safari, asztali gépen és iOS-en
Szekció neve “Safari, asztali gépen és iOS-en”A Safari (az iPhone-on és iPaden is) másként kezeli az előzményeket és az újratöltést, mint a Chrome és a Firefox, ezért a Gravity Forms kissé eltérően jár el. Sikeres beküldés után a Safari címsorába lekérdezési paraméter kerül:
?gf_protect_submission=1Ez a visszaigazoló webcímet már beküldöttnek jelöli. Ha a Safari úgy próbálja újratölteni az oldalt, hogy az az űrlapot újraküldené, a Gravity Forms a kiszolgálón elfogja a kérést, és a látogatót visszairányítja az űrlap oldalára a paraméter nélkül. Így normál oldalbetöltést kap, nem duplikált beküldést.
Előfordulhat, hogy a Safariban a beküldés után röviden megjelenik a ?gf_protect_submission=1 a címsorban. Ez a várt működés, nem hiba.
Többszörös kattintás feldolgozás közben
Szekció neve “Többszörös kattintás feldolgozás közben”Ez külön van kezelve az újratöltés elleni védelemtől. Amikor a látogató a Küldés vagy a Tovább gombra kattint, a Gravity Forms azonnal beküldöttnek tekinti az űrlapot, így a lassú kérés közbeni további kattintások nem indítanak újabb teljes beküldést.
Az AJAX-os űrlapoknál a beküldés végig ugyanazon az oldalon marad, és a kiszolgáló válaszakor a visszaigazolás váltja fel az űrlapot, ami tovább csökkenti a frissítés okozta duplikátumok esélyét.
Az Ismétlődések tiltása mezőbeállítás
Szekció neve “Az Ismétlődések tiltása mezőbeállítás”Ha egy mezőnek, például egy e-mail-címnek vagy regisztrációs azonosítónak az összes beküldés között csak egyszer szabad szerepelnie, kapcsold be az Ismétlődések tiltása beállítást az űrlapszerkesztőben, a mező Általános beállításai között, a Szabályok alatt.

A képen az Általános szakasz Szabályok csoportjában az Ismétlődések tiltása jelölőnégyzet látszik, a Kötelező alatt.
Beküldéskor a Gravity Forms megnézi a meglévő beküldéseket erre az értékre. Ha talál egyezést, az ellenőrzés sikertelen, és hibaüzenet jelenik meg a látogatónak. Ez az ellenőrzés a kiszolgálón fut, független az újratöltés elleni védelemtől és a többszörös kattintás kezelésétől.
Hibaelhárítás
Szekció neve “Hibaelhárítás”Ahol az átirányítás megoldható, használj átirányítás típusú visszaigazolást: ha a látogatót beküldés után új webcímre küldöd, a legtöbb újratöltés okozta duplikátum eleve elkerülhető. Kerüld az agresszív gyorsítótárazást az űrlapot vagy visszaigazolást tartalmazó oldalakon. Kapcsold be az Ismétlődések tiltása beállítást minden olyan mezőnél, amelynek egyedinek kell lennie (például e-mail-cím, felhasználóazonosító vagy hivatkozási szám): a rendszer a meglévő beküldésekkel veti össze az értéket, és ugyanazzal az értékkel nem engedi újra beküldeni az űrlapot. Időnként nézd át a beküldéseket duplikátumok után, és szűrd őket a beküldések listáján. Ha lehet, kérd meg a látogatókat, hogy a pörgő jelző vagy a visszaigazolás megjelenéséig ne kattintsanak újra.
| Tünet | Mit ellenőrizz |
|---|---|
| Duplikált beküldés a visszaigazoló oldal frissítése után | Üzenet típusú visszaigazolás gyorsítótárazott oldalon: válts átirányítás típusú visszaigazolásra, vagy kapcsold ki a gyorsítótárat arra az oldalra. |
A Safariban megjelenik a ?gf_protect_submission=1 a webcímben |
Ez a Safari duplikáció elleni védelme: az újratöltés normál oldalt ad, újabb beküldés nélkül. |
| Duplikált beküldés gyors kattintgatástól | Keress JavaScript-hibát az oldalon, ellenőrizd, hogy az AJAX-os beküldés be van-e kapcsolva, és hogy nincs-e egyedi küldés gomb vagy olyan bővítmény, amely lecseréli az alapértelmezett gombot. |
| Ugyanaz az e-mail-cím vagy azonosító többször is bekerül | Kapcsold be az Ismétlődések tiltása beállítást az érintett mezőnél, vagy gondold át, hogy az ismételt beküldések engedélyezettek-e. |
Fejlesztőknek
Szekció neve “Fejlesztőknek”A duplikált beküldések elleni védelmet a GF_Duplicate_Submissions_Handler osztály kezeli (includes/duplicate-submissions.php).
A védelem csak azokra a kérésekre vonatkozik, amelyek tartalmazzák a gform_submit POST-mezőt. Sikeres beküldésnél, vagyis ha van beküldésazonosító, a PHP betölti a js/duplicate-submissions.js szkriptet, és átad neki egy jelzőt, hogy a beküldés érvényes volt. Ha az ellenőrzés sikertelen volt, vagy a beküldés megszakadt, a szkript nem csinál semmit.
A szkript a history.replaceState hívással módosítja a böngésző címsorát, hogy a következő frissítés normál oldalbetöltésnek számítson, ne POST-újraküldésnek. A Safariban tiszta webcím helyett a ?gf_protect_submission=1 paramétert állítja be. Ha a Safari ezután úgy lép erre a webcímre, hogy az újraküldené az űrlapot, a maybe_handle_safari_redirect az oldalbetöltés elején elfogja, és 303-as átirányítással visszaküldi az űrlap oldalára a paraméter nélkül.
A védelmet globálisan vagy űrlaponként a gform_is_disabled_duplicate_submissions_protection szűrővel kapcsolhatod ki.
Az AJAX-os beküldésről az AJAX-os beküldés fejezet szól, a visszaigazolások típusairól a Visszaigazolások beállításai fejezet.
Készült: