Jak se zbavit url na novou objednavku v historii

Honza.Mottl
Člen | 104
+
0
-

Mam url objednavka/zobrazit/<obj_id> pro zobrazeni objednavky. Pokud je <obj_id> prazdne, vytvori se stranka pro novou objednavku. obj_id se prideli pri ulozeni autoincrementem.

Problem je, ze url objednavka/zobrazit/ pro novou objednavku zustane v historii prohlizece. Pokud da uzivatel Back, tak se mu nova objednavka zobrazi vcetne vyplnenych hodnot. To vede nekdy ke zmatecnemu vytvoreni nove objednavky, protoze si uzivatel nevsimne, ze nema pridelene cislo a tak se domniva, ze provadi zmenu zatimco vytvori novou objednavku.

Jak z toho ven? Napada mne pouze upravit historii v prohlizeci a provest replace za nejake neskodne url, treba za home.

Napada vas nejake jine reseni?

ZahorskyJan
Člen | 55
+
+1
-

Ahoj, ja to resim tak, ze odeslani/vytvoreni objednavky vygeneruje nahodny hash (u me konretne je to md5 pole dat objednavky) a tady s tim hashem provadim presmerovani na tu stranku co to vytvari (u me thank you page). Pokud ten hash uz mam v db u nejake objednavky, tak znovu nezapisuju a presmerovavam s hlaskou na homepage.

Kamil Valenta
Člen | 762
+
+3
-

A proč povoluješ vytvoření nové, prázdné objednávky?

  1. hodím si něco do „košíku“
  2. vytvořím objednávku
  3. odešlu objednávku a vyprázdním „košík“
  4. dám zpět
  5. ale znovu objednávku neodešlu, protože je košík prázdný
  6. musel bych do něj znovu něco vhodit a pak by odeslání objednávky bylo legitimní
havrank102
Člen | 4
+
+3
-

Tento stav by vůbec neměl nastat.
Objednávku jsi již odeslal, z toho plyne:

Dáme zpět a musím být v prázdné košíku, jak píše kamil_v.

Honza.Mottl
Člen | 104
+
0
-

ZahorskyJan napsal(a):

Ahoj, ja to resim tak, ze odeslani/vytvoreni objednavky vygeneruje nahodny hash (u me konretne je to md5 pole dat objednavky) a tady s tim hashem provadim presmerovani na tu stranku co to vytvari (u me thank you page). Pokud ten hash uz mam v db u nejake objednavky, tak znovu nezapisuju a presmerovavam s hlaskou na homepage.

Diky. To je dobry napad. Je to vlastne alternativni klic prideleny v okamziku vytvoreni stranky, ktery se da pouzit k overeni zda byl zaznam jiz vytvoren.

Ja mam v okamziku vytvoreni stranky temer vsechna pole prazdna (az na defaulty) a tak md5 hash poli by mi nepomohl. Lepsi by bylo uniqid(), ale tam neni uplne zarucena unikatnost.

Honza.Mottl
Člen | 104
+
0
-

kamil_v napsal(a):

A proč povoluješ vytvoření nové, prázdné objednávky?

  1. hodím si něco do „košíku“
  2. vytvořím objednávku
  3. odešlu objednávku a vyprázdním „košík“
  4. dám zpět
  5. ale znovu objednávku neodešlu, protože je košík prázdný
  6. musel bych do něj znovu něco vhodit a pak by odeslání objednávky bylo legitimní

Tvuj navrh se hodi do e-shopu. Ja nedelam e-shop, ale oborove specifickou aplikaci. Ukolem aplikace je nabizet zbozi/sluzby tak, aby odpovidalo zakladnim vlastnostem uvedenym v hlavicce a na nic se nezapomnelo. Jsou tam povinne a nepovinne polozky, vztahy mezi polozkami atd.

Objednavky se delaji jinym postupem:

  1. uzivatel nejdrive vyplni hlavicku objednavky, kde specifikuje zakladni vlastnosti objednavky. Tim urci z ceho se objednavka sklada, co je povinne a co nepovinne
  2. aplikace vezme zakladni vlastnosti objednavky z hlavicky a s pouzitim sablon vytvori polozky
  3. Kazda polozka ma svuj typ. Zbozi/sluzby se pak uzivateli nabizeji podle typu polozky

Editoval Honza.Mottl (22. 5. 2019 7:21)

Honza.Mottl
Člen | 104
+
+1
-

Podarilo se mi najit reseni, aby url pro novou objednavku zmizelo z historie. Prepisi ho url na home. Hloubaveho uzivatele by mohlo udivit, ze pri vytvareni objednavky vidi url na home. Ale takovych moc neni…

Nova funkce:

function replaceHistoryIfIdIsEmpty() {
    var lastToken = window.location.pathname.split('/').pop(); // zjistit posledni cast url
    if (!lastToken || (lastToken === '') || isNaN(lastToken)) {
        // je prazdne nebo neni cislo
        if((window.history != undefined) && (window.history.pushState != undefined)) {
            // nahradit v historii za neskodnou home page
            window.history.replaceState({}, document.title, linkHome);
        }
    }
}

V sablone:

// Počáteční inicializace.
replaceHistoryIfIdIsEmpty();
$.nette.init();

Ale jeste premyslim o tipu od ZahorskyJan, protoze to je trottelfest