Přesměrování > odscrolování při chybě – nalezení loginu
- lopikol
- Začátečník | 75
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
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.
- redhead
- Člen | 1313
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
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.
- redhead
- Člen | 1313
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
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
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)
- Mikulas Dite
- Člen | 756
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íš.
- Patrik Votoček
- Člen | 2221
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
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