Získání hodnot po redirectu

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

Zdravím, chtěl bych se zeptat, jestli je možné nějak dosadit zpět uživatelovy hodnoty do inputu jako defaultní hodnoty? Konkrétně mi jde o to, že pokud vyplní pole, dá odeslat a když bude mít něco špatně, vrátí se mu (redirectem) jako odpověď flash message s jeho údaji, které předtím vyplnil špatně. Hledal jsem zde na fóru, ale našel sem řešení pouze přes session. Lze to vyřešit i jinak? Přecházím z javy, kde to jde poměrně jednoduchým způsobem:

<%
String surname = request.getParameter("cust_surname");
                if (surname == null) {
                    surname = "";
                }
%>

Existuje něco podobného i v PHP? Omlouvám se, pokud je to banalita, nicméně jsem žádné řešení nenašel. Děkuji

jetpack
Člen | 71
+
0
-

No pokud chceš něco dosazovat do formu tak v té akci, se kterou pracuješ obstaráš objekt Formuláře:

<?php
$form = $this['mujForm'];
// V pripade, ze form vytvaris jako tovarnicku :
// public function createComponentMujForm()
$form->setDefaults(array(
	'login' => 'Zadejte login',
	'password' => 'Zadejte heslo'
));
?>

Jo jinač pokud chceš něco mu vyhodit pokud nastala chyba tak bych to udělal tak, že na form dáš :

<?php
$form->addInput('login')
	->setRequired('Musíte vyplnit login');
$form->addPassword('password')
	->setRequired('Musíte vyplnit heslo!!');
$form->onError[] = callback($this, 'formError');
.....
}

public function formError(Form $form)
{
	$errors = $form->getErrors();
	foreach($errors as $error) {
		$this->flashMessage($error, 'error');
	}
	$data = $form->getValues();
	// Zde zase můžeš do formu ty data zpátky nacpat, které chceš tou metodou $form->setDefaults();
}
?>

Pak ti vyskočí 2 flash message v případě obou chyb nevyplnění a budou to zprávy z metody setRequired().
Doufám, že jsem tě správně pochopil.

Editoval jetpack (24. 12. 2012 22:59)

Draffix
Člen | 146
+
0
-

Nevím proč, ale ten onError[] mi nefunguje – respektivě na něj vůbec nereaguje (nejsem si jist, jestli chyba při validaci je error aby mi to skočilo do té metody). Mám to takhle:

    protected function createComponentSignUpForm() {
        $form = new UI\Form;
        $form->addAntispam();
        $form->addText('user_name', 'Jméno:')
                ->addRule($form::FILLED);
        $form->addText('user_email', 'E-mail:')
                ->addRule($form::FILLED);
        $form->addSubmit('send', 'Registrovat');
        $form->onSuccess[] = callback($this, 'signUpFormSubmitted');
        return $form;
}

    public function signUpFormSubmitted(UI\Form $form) {
        $values = $form->getValues();
        unset($values['spam'], $values['form_created'], $values['user_confirmPassword']);

        if ($this->user->countFindByEmail($values->user_email) != 0) {
            $this->flashMessage('Litujeme, ale zadaný email již existuje.', 'wrong');
            $this->redirect('this');
        }
}

A v případě, že email už existuje, vyhodí se hláška a redirektuje se zpět na stejnou stránku s formuláře, ale chtěl bych, aby tam již byly vyplněny ty jeho údaje, které tam zadal před vyhozením hlášky (já tedy implicitně žádné defaultní hodnoty nevkládám). Ztroskotám vždy u toho redirektu, kdy se továrnička znovu vykreslí v původní podobě…

duke
Člen | 650
+
0
-

A nač tam potřebuješ tu redirekci? Je běžná praxe v případě chybně vyplněných polí formuláře nepřesměrovávat. Pokud trváš na redirekci, přicházíš o všechna POST data formuláře, takže si je budeš muset před přesměrováním někam uložit a po přesměrování opět naplnit objekt formuláře (nejspíš přes session a query string).

jetpack
Člen | 71
+
0
-

Souhlasím s Dukem.
Tam jak to redirektneš ztrácíš POST.
Není potřeba tam redirectovat. U formu je i metda addError což ti může dát chybové hlášky na chybně vyplněné inputy popř. kamkoliv si to nastavíš ty nebo využít tu metodu OnError.
Jinač u té validace jak máš: ->addRule($form::FILLED);
tam dej: ->addRule($form::FILLED, ‚Zpráva při chybě‘);

Je tedy důvod redirectovat?

Draffix
Člen | 146
+
0
-

Měl jsem za to, že to tak má být. V dokumentaci je, že se flash message používá s redirectem, ale asi jsem to bral až moc doslova. Měl bych ještě dotaz, když tedy odešlu nevalidní data a „vrátí“ mě to zpět, budu mít v url

?do=signUpForm-submit

Vím, že je to tak správně, ale je možné tuto routu změnit? Stav serveru nijak neměním a slouží to tak pouze k dočasnému zobrazení dat, než se odešlou validní data

jetpack
Člen | 71
+
0
-

No je to možné změnit v tom routování , že do routy zadáš:
<presenter>/<action> ? odeslat=<signUpForm-submit>

„odeslat“ jsem uvedl jako přiklad .
No takhle by to mělo fungovat, ale zkus otestovat.
Popř. já když jsem to tam takhle nechtěl tak jsem používal jQuery + ajaXsubmit tzn. jsem odesílal formulář ajaxově a on mi vracel data v JSON , která obsahovala status + informace.

Editoval jetpack (25. 12. 2012 15:36)