Error ve formuláři – redirect na tu část formuláře

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
nekark
Člen | 16
+
0
-

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
+
+3
-

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)

nekark
Člen | 16
+
0
-

Právě bych radši, aby když obecně má formulář error, aby to třeba přesměrovalo na domena.cz#form…

duke
Člen | 650
+
+1
-

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
+
+2
-

muzes nastavit action u formulare na kotvu s formularem

edit: konkretne neco jako

$form->setAction($this->link("this#my-form"));
nekark
Člen | 16
+
0
-

Bohužel to mi resetovalo formulář, ale nakonec jsem vše vyřešil tou nejzákladnější věcí. Dal jsem formuláři atribut action=„#order“.

Každopádně všem děkuju za snahu. :-)

sinner
Člen | 20
+
0
-

Ř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.
kleinpetr
Člen | 480
+
0
-

@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()

Editoval kleinpetr (22. 4. 2016 9:51)

sinner
Člen | 20
+
+2
-

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)