Autor Zpráva
Sylar
Profil
Zdravím,

mám formulář, do kterého vyplním údaje a potvrdím tl. "odeslat". Na tl. "odeslat" je funkce onclick, která na pozadí, přes jquery, uloží data z formuláře a formulář se dále odešle na potvrzující stránku. Někdy však uložení dat na pozadí trvá trochu déle a tím jak se formulář odešle na potvrzovací stránku se ta data nestačí uložit. potřeboval bych, aby se formulář "klasicky" odeslal až poté, co dostane zprávu od scriptu na pozadí, že je vše uloženo.

Zkoušel jsem něco podobného, ale formulář se i tak odesílá, bez ohledu na návrat. hodnotu z funkce

  function set_form(text, zbozi) {
    $.get('?search-log=' + text + '&zbozi-log=' + zbozi, function(data) {
       return data;
    });
    // return false; // když sem dám tohle, tak se formulář sice neodešle hned, ale neodešle se ani poté, co mu o dva řádky výše dám returnem "true" jako návratovou hodntu funkce
  }

tl. ve formuláři je pak takovéto:

<input type="submit" value="Hledat" onclick="return set_form($('#input_text').val(), 1);" />

Nenapadá někoho jak na chvíli "pozdržet" script, aby se odeslal až na základě vrácených dat funkce set_form ?
Keeehi
Profil
Sylar:
Nějak nechápu logiku věci. Proč něco odesíláš přes ajax, když vzápětí odesíláš formulář. To to nemůžeš odeslat všechno najednou tím formulářem?
Sylar
Profil
Keeehi:
formulář se odesílá přes GET a odesílání dat přes ajax slouží jako loggování odesílaných dat. kdybych data loggoval přes klasické odesílání GET proměnné bude v logu zmatek, protože data z formuláře se dále používají v URL adrese a byly by loggovány znova a znova a znova
Darker
Profil
Takže ty se snažíš logovat vyhledávání odeslaná jen z toho konkrétního formuláře?
Keeehi
Profil
Sylar:
To přece nemusí být vůbec pravda. Pokud následné odkazy search-log a zbozi-log obsahovat nebudou, nic se logovat nebude.
Sylar
Profil
Darker:
ze dvou konkrétních, ale data v nich jsou téměř stejná

Keeehi:
GET['search-log'] a GET['zbozi-log'] ale na stránkách musí být vyplněné např. pro potřeby stránkování, kdy formulář potřebuje stála data vyplněná uživatelem aby našel výsledky, ale pouze zobrazoval jiné položky
Keeehi
Profil
Sylar:
OK, ale při posílání společně s formulářem (třeba v hidden inputech) se přece ale mohou jmenovat jinak. Záleží na tom, jaké dáš name těm inputům. Takže pro potřeby logování ty data můžou přijít klidně třeba v $_GET["kvuli-logovani-search"] a $_GET["kvuli-logovani-zbozi"] a v odkazech nadále můžou zůstávat search-log a zbozi-log pro potřeby stránkování. Protože se jmenují jinak, míchat se o nebude.
Sylar
Profil
Keeehi:
ty teda myslíš to odeslat na místo dvou inputů 4, z toho dva skryté, které budou pro účely logu? to by šlo, ale poté co by se udělalo logování tak by se museli ty dvě hidden proměnné nějaké vyhodit z té URL adresy, to mě napadá jedině přesměrováním přes header, což mi ale nepřijde úplně košér. další nevýhoda je ta, že poku uživatel klikne v prohlížeči na tl. "zpět", tak se log provede znova. Nebo jsi to myslel ještě nějak jinak?
Keeehi
Profil
Sylar:
by se museli ty dvě hidden proměnné nějaké vyhodit z té URL adresy
Proč? něčemu tam snad vadí?

Mohl by jsi tedy popsat, co je na stránce s formulářem, co je ve formuláři a k čemu slouží, co za data se má logovat, co se zobrazuje na stránce, na kterou je formulář posílán, co ta stránka potřebuje za informace (parametry z getu) a jestli jsou potřeba tyto informace předat odkazem dalším stránkám? Případně ještě další souvislosti které tě napadnou.
Marek88
Profil
Sylar:
...vyhodit z té URL adresy, to mě napadá jedině přesměrováním přes header, což mi ale nepřijde úplně košér.
Je to rozhodně lepší než to řešení přes AJAX.

další nevýhoda je ta, že poku uživatel klikne v prohlížeči na tl. "zpět", tak se log provede znova.
To není pravda. Pokud se přesměruje na straně serveru, do historie prohlížení se to nijak nezaznamená a tudíž se na tu adresu nejde tlačítkem zpět vůbec dostat.
Sylar
Profil
Keeehi:
„by se museli ty dvě hidden proměnné nějaké vyhodit z té URL adresy“
Proč? něčemu tam snad vadí?

Nevadí, ale lze to jinak než přes ten header?

Jde o vyhledávání na stránce, tzn. jeden input je klasicky zadání hledaného výrazu a druhý je selectbox, který určuje oblast hledání. Obě dvě položky se logují, tzn. jak text, tak oblast hledání. Stránka, která zobrazuje výsledky potřebuje pouze "hledaný výraz", protože dle vybrané oblasti hledání na dvou různých stránkách. "hleadný výraz" je potřeba při stránkování, řazení aj. akcích s výsledky, "oblast hledání" nikoliv.

Ve zkratce to tedy funguje tak, že uživatel do inputu napíše výraz co chce vyhledat a ze selectu vybere kde. Jakmile formulář potvrdí, tak se script přesune na stránku1.php nebo stránku2.php, podle toho, co bylo vybráno v selectu (tento přesun mezi stránkami se děje javascriptově, v podstatě se pouze změní cesta v action) . Na stránce1/2.php se veme z getu hledaný výraz a zobrazí se výsledky. Na stránce je stránkování, řazení výsledků a různé filtery, které zpřesňují vyhledávání, ale u všech těchto akcí je potřeba ten hledaný výraz.
Keeehi
Profil
Nevidím důvod, proč to případně neodesílat postem. Něco takového by nešlo?
if ( formulář odeslán ) {
    loguj($_POST["search"])
    $search = $_POST["search"];
}

echo "<a href="?stranka=5&search=$search"></a>";
Sylar
Profil
Keeehi:
pak by se tam muselo přidat ještě zpracování přes POST, protože jednou (při odeslání formuláře) by se odchytával POST, podruhé (při stránkování, řazení atd.) by se odcyhtával GET, není to zbytečně duplicitní kód?
OPravdu neexistuje možnost jak by ta JS funkce počkala na provedení toho ajaxu a až poté se odeslala? mě to přijde jednoduché v tom, že ten log se provede ihned a pak už na něj nemusím myslet, ani se starat o další proměnné, ať už jsou get nebo post
Keeehi
Profil
No tak dobrá. Je to zkrácené, jen na jedno pole, ale jak to funguje je snad jasné.
<form onsubmit="return set_form();" id="formular" action="search.php">
    <input type="text" name="vyraz" value="">
    <input type="submit" value="Hledat">
</form>

function set_form() {
    $.get('?search-log=' + encodeURI(document.getElementById("formular").vyraz.value), function(data) {
        document.getElementById("formular").submit();
    });
    return false;
}

Bez javascriptu to nedokáže logovat, to doufám víte. Kdybyste to udělal čistě na straně servru, na podpoře javascriptu by nezáleželo.
Sylar
Profil
ok, díky, vyzkouším to v provozu a uvidíme zda-li to i s tím JS obstojí.
Chamurappi
Profil
Reaguji na Keeehiho:
Nebylo by univerzálnější zavolat v callbacku formulář.submit()?


Reaguji na Sylara:
Jestli jsem správně pochopil tvůj postup, tak mi připadá divný. Posílat dva požadavky na server, jen kvůli tomu, že se ti nechce řešit logování společně s hledáním na straně serveru…
Keeehi
Profil
Chamurappi:
Nebyl jsem si jistý, jak reaguje onsubmit na formulář.submit() a jak to vyřešit, aby to uživatele zachytilo a nenechalo ho to formulář odeslat, kdežto aby javascript prošel. Takhle jsem věděl, že mi to půjde.
Chamurappi
Profil
Reaguji na Keeehiho:
Skriptem vyvolaný submit už nevyvolává událost onsubmit.
Keeehi
Profil
Chamurappi:
Skriptem vyvolaný submit už nevyvolává událost onsubmit.
OK, tak jsem to upravil.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: