Error ve formuláři – redirect na tu část formuláře
- nekark
- Člen | 16
Ahoj,
prozatímní průběh formuláře:
Odešle se formulář, zvaliduje se, pokud je v nějakém input chyba, znovu se
načte stránka s formulářěm a u inputu se vypíše chyba.
Rád bych ale vyřešil i to, aby stránka při novém načtení rovnou odscrollovala na formulář. Nevíte si s tím někdo rady?
Předem díky :)
- abc
- Člen | 92
V JS najdeš ve formuláři input, který má class error (nebo co se tomu přidává) a nascrolluješ na něj
Cca nějak takto (psáno z hlavy)
var $errorInputs = $("input.error");
if($errorInputs.length > 0){
$('html, body').animate({
scrollTop: $errorInputs[0].offset().top
});
}
Editoval abc (8. 4. 2016 14:44)
- duke
- Člen | 650
Přesměrování po chybě si můžeš zajistit sám v handleru formuláře, ale vezmi v úvahu, že při přesměrování přijdeš o data v $_POST, tedy i o vyplněné hodnoty inputů ve formuláři. Jejich zachování bys tedy musel řešit např. pomocí session, kdy bys po přesměrování provedl jejich znovunastavení hodnotami uloženými v session.
- David Matějka
- Moderator | 6445
muzes nastavit action u formulare na kotvu s formularem
edit: konkretne neco jako
$form->setAction($this->link("this#my-form"));
- sinner
- Člen | 20
Řeším úplně stejný problém. Také bych rád při chybě odscrolloval až úplně dospodu, ale stále mi to danný formulář odscrolluje ale zresetuje (nebo nescrolluje a nezresetuje když nedefinuji akci).
Můj kód vypadá takto:
protected function createComponentContactForm()
{
$form = $this->contactFormFactory->create();
$form->setAction("#footer");
$form->onSubmit[] = function(\Nette\Application\UI\Form $form) {
$values = $form->getValues();
.....
try {
$mailer->send($mail);
$this->flashMessage("Message was successfully sent.", "success");
$this->redirect("Homepage:");
} catch (SendException $ex) {
$form->addError("Message sending failed. Try again, please.");
}
};
return $form;
}
Nevíte čím by to mohlo být? Děkuji.
- sinner
- Člen | 20
kleinpetr napsal(a):
@sinner, myslím, že @DavidMatějka to napsal jasně ne ? A pokud neměníš formulářové prvky za běhu přes js, tak bych raději použil místo
onSubmit()
→onSuccess()
Změnil jsem to na onSuccess
, ale chová se mi to stále
stejně. Odskroluje se to správně ke kotvě, ale formulář nezobrazí chybu
ani vyplněná data.
Zkoušel jsem tyto varianty:
$form->setAction($this->link("this#footer"));
$form->setAction("#footer");
a u obou mi to správně skočí na formulář, ale je prázdný.
A když nedefinuji setAction
tak mi to neodskroluje, ale data a
chybu mi to zobrazí.
EDIT:
Tak se mi to podařilo vyřešit. Nevím jestli je to ‚best practice‘, ale
funguje to.
// HomepagePresenter.php
/** @var \App\Forms\IContactFormFactory @inject */
public $contactFormFactory;
protected function beforeRender() {
parent::beforeRender();
$this['contactForm']->setAction($this->link("this#footer"));
}
protected function createComponentContactForm()
{
$form = $this->contactFormFactory->create();
$form->onSuccess[] = function(\Nette\Application\UI\Form $form) {
$values = $form->getValues();
....
try {
$mailer->send($mail);
$this->flashMessage("Message was successfully sent.", "success");
$this->redirect("Homepage:");
} catch (SendException $ex) {
$form->addError("Message sending failed. Try again, please.");
}
};
return $form;
}
Asi je nějaký problém s nastavováním action při vytváření componenty. Actions se tedy musí nastavit až poté co je komponenta vytvořena.
Editoval sinner (22. 4. 2016 12:16)