Autor | Zpráva | ||
---|---|---|---|
Sylar Profil |
#1 · Zasláno: 14. 7. 2012, 00:00:06
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 |
#2 · Zasláno: 14. 7. 2012, 00:04:49
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 |
#3 · Zasláno: 14. 7. 2012, 00:18:03
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 |
#4 · Zasláno: 14. 7. 2012, 00:23:07
Takže ty se snažíš logovat vyhledávání odeslaná jen z toho konkrétního formuláře?
|
||
Keeehi Profil |
#5 · Zasláno: 14. 7. 2012, 00:30:35
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 |
#6 · Zasláno: 14. 7. 2012, 12:46:19
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 |
#7 · Zasláno: 14. 7. 2012, 13:09:27
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 |
#8 · Zasláno: 14. 7. 2012, 13:28:08
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 |
#9 · Zasláno: 14. 7. 2012, 13:35:32
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 |
#11 · Zasláno: 14. 7. 2012, 14:07:00
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 |
#12 · Zasláno: 14. 7. 2012, 14:20:25
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 |
#13 · Zasláno: 14. 7. 2012, 14:35:53
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 |
#15 · Zasláno: 14. 7. 2012, 15:07:54
ok, díky, vyzkouším to v provozu a uvidíme zda-li to i s tím JS obstojí.
|
||
Chamurappi Profil |
#16 · Zasláno: 14. 7. 2012, 16:53:52
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 |
#17 · Zasláno: 14. 7. 2012, 17:01:27
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 |
#18 · Zasláno: 14. 7. 2012, 17:09:56
Reaguji na Keeehiho:
Skriptem vyvolaný submit už nevyvolává událost onsubmit .
|
||
Keeehi Profil |
#19 · Zasláno: 14. 7. 2012, 17:19:13
Chamurappi:
„Skriptem vyvolaný submit už nevyvolává událost onsubmit.“ OK, tak jsem to upravil. |
||
Časová prodleva: 12 let
|
0