Přesměrování > odscrolování při chybě – nalezení loginu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lopikol
Začátečník | 75
+
0
-

Na webu mám komentáře, kde může přispět každý. Abych zamezil pokusům o podvod (psaní pod nickem admina) nebo jiných uživatelů, kteří se zaregistrovali, tak jsem přidal do odesílání vyjímku.

Pokud její výsledek není NULL, tak se vypíše chyba + scrollTo

<?php

//Zpracování formuláře
$this->template->scrollTo = TRUE;
$this->flashMessage('Přihlaš se!');

//Template
<script type='text/javascript' n:ifset='$scrollTo'>window.location.href = '#comments';</script> <!-- Odscrolovaní při chybě -->
?>

Ale vzniká zde jeden problém. Do URL se přidá #comments, ale neodscroluje se to na tento div.
redirect() nebo podobné použít nemohu > vymazala by se vyplněná data.

redhead
Člen | 1313
+
0
-

Můžeš ten hash přidat do action formuláře a nemusíš to prasit v JS (setAction()).

lopikol
Začátečník | 75
+
0
-

Musim. Jelikož je toto až ve zpracování formuláře, takže nemohu použít action, který patří formuláři!

redhead
Člen | 1313
+
0
-

Proč bys nemohl? Formuláři nastavíš v továrničce action s hashem. Pokud projde validace, ale ve zpracování onSubmit bude problém s modelem, tak nebudeš přesměrovávat a samo tě to hodí na ten hash. Pokud to modelem projde, redirectneš někam už bez hashe.. Nebo tě stále nechápu.

lopikol
Začátečník | 75
+
0
-

Mám formulář na odeslání komentáře (Nick, email, web, text) Pokud je vše vyplněno správně, tak to přejde na část kde se to ukládá do DB. Před samotným uložením zkontroluji zda nick není zaregistrovaný. Pokud ano vyskočí ta hláška, potřebuji do URL přidat #comments.

redhead
Člen | 1313
+
0
-

Nebudu se opakovat. Řešení, co jsem napsal (a které to opravdu řeší), určitě funguje i v tvém případě a běžně se to taky tak dělá.

lopikol
Začátečník | 75
+
0
-

Jak mohu využít toto:

<?php
$form->action .= '#comments';
?>

Když už dávno neřešim formulář, ale zda je login v db nebo ne. Formulář už je zpracovaný!

Aurielle
Člen | 1281
+
0
-

Je pravidlem, že se po odeslání formuláře přesměrovává. Nikdo tu o action nic nepsal.

redhead
Člen | 1313
+
0
-

Já myslel, že vypsáním chyby myslíš při chybě vyplnění, tudíž pro uživatele nutno opravit chyby a odeslat znova. Třeba „vybrané jméno nesmí být admin“. V tom případě bys dal hash do action formuláře.

Pokud chceš odskočit v případě po vložení příspěvku do DB a chceš zobrazit komentáře, tak je věc ještě jednodušší, stačí redirect s uvedeným hashem v submitu formuláře:

public function formSubmit() {
	// ..
	// vložení do db
	// ..
	$this->redirect('this' . ($needToScroll === NULL ? '#comments' : ''));
}

To bys ale věděl, pokud čteš dokumentaci nebo tutoriály. Běžná praxe je po správně vyplněném formuláři bez chyb provést redirect.

Editoval redhead (5. 2. 2011 16:50)

lopikol
Začátečník | 75
+
0
-

redhead napsal(a):

Já myslel, že vypsáním chyby myslíš při chybě vyplnění, tudíž pro uživatele nutno opravit chyby a odeslat znova. Třeba „vybrané jméno nesmí být admin“. V tom případě bys dal hash do action formuláře.

Však ano toto myslim! Nejdřív si ale musim ověřit zda zadané jméno do formuláře je/není v DB > provádim to přesně před uložením do DB.

Patrik Votoček
Člen | 2221
+
0
-

OT: navrhuji udělení dalšího „začátečníka“

redhead
Člen | 1313
+
0
-

V tom případě platí, co jsem psal. Při chybě nebudeš redirectovat a objevíš se na url dané v action formuláře včetně hashe. Pokud bude vše ok, tak redictneš. Už nevím, jak ti to popsat. Prostě to zkus.

lopikol
Začátečník | 75
+
0
-

Jasný, ale $this->redirect mi vymaže formulář > potřebuji aby tam data zůstaly!

redhead
Člen | 1313
+
0
-

Data tam musí zůstat v případě té chyby (čili v případě, kdy se má odscrollovat a uživatel chybu napravit), v tom případě se ale neredirectuje (jak jsem psal)! A to právě proto, že jsi formulář odeslal na url danou action (tedy i s hashem).

Že se vůbec tak snažím.

Editoval redhead (5. 2. 2011 18:00)

lopikol
Začátečník | 75
+
0
-

Patrik Votoček: Když sem něco napíšeš, tak to nemaž! Klidně já se za to nestydim.
redhead: Sorry, ale to mi není jasné.

Pokud vše proběhne správně, tak tam $this->redirect mám. Přeměruje to na daný komentář + smaže data z formuláře, takže nechápu proč by to v tomto případě formulář nevyprázdnilo.

redhead
Člen | 1313
+
0
-

Pokud vše proběhne správně, tak redirectuješ.

Pokud neproběhne vše správně, neredirectuješ. Tak se ponechají data a v url bude # hash, který si v továrničce přidal k action formuláře.

Ta podmínka se nevykoná nějak zázračně sama, tu musíš udělat sám:

protected function createComponentForm($name) {
	$form = new ...;
	$form->action .= '#comments';
	...
}

public function submitted($form) {
	$spravne = jsouDataZFormulareOk($form->values);
	if($spravne === TRUE)	// vše správně
		$this->redirect('this');
	/*
		pokud $spravne bude FALSE (něco je špatně)
		tak zůstane url, na kterou odkazuje action formuláře
		třeba bla/bla/?do=form-submit#comments
	*/
}

Pokud už tohle nepochopíš.. tak .. tak už sem psát asi nemá cenu.

Editoval redhead (5. 2. 2011 18:41)

lopikol
Začátečník | 75
+
0
-

ale já ten nick (zde je zaregitrován nebo ne) kontroluji až v části:

<?php
public function submitted($form) {
?>

Editoval lopikol (5. 2. 2011 19:04)

Mikulas Dite
Člen | 756
+
0
-

Ten hash se nastaví vždy, bez ohledu na to, jestli nick existuje nebo ne. Pokuď se ale registrace podaří , tak se ta adresa změní znovu (redirectem) a proto ten hash zmizí. Pokuď se nepovede, zůstane adresa s hashem.

Zkus si s tím pohrát, vyzkoušet to a uvidíš.

lopikol
Začátečník | 75
+
0
-

Mikulas Dite: Děkuji toto stačí a je to hned jasný :)

Patrik Votoček
Člen | 2221
+
0
-

lopikol napsal(a):

Patrik Votoček: Když sem něco napíšeš, tak to nemaž!

Cože jakože co? Já nic nesmazal! A i kdyby můžu si svoje posty mazat jak chci… :-)

bojovyletoun
Člen | 667
+
0
-

Možná by se do toho mohly zapojit vlastní validátory pomocí callbacku a nebo nechat action být a něco přidat do onInvalidSubmit