# 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

**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

A Gravity Forms három, egymástól független mechanizmussal véd a duplikátumok ellen.

### Ú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

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=1
```

Ez 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

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

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.

![Az E-mail-cím mező beállításai az űrlapszerkesztőben, az Általános szakaszban a Kötelező és az Ismétlődések tiltása jelölőnégyzettel](./kepek/hogyan-duplikaciok-tiltasa.webp)

*Az E-mail-cím mező beállításai az űrlapszerkesztőben, az Általános szakaszban a Kötelező és az Ismétlődések tiltása jelölőnégyzettel* (https://minta-bolt.hu/wp-admin/admin.php?page=gf_edit_forms&id=1)

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

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

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](https://hub.hellowp.io/hu/plugins/gravityforms/hogyan-ajax-bekuldes/) fejezet szól, a visszaigazolások típusairól a [Visszaigazolások beállításai](https://hub.hellowp.io/hu/plugins/gravityforms/visszaigazolasok-beallitasok/) fejezet.
