Získání hodnot po redirectu
- Draffix
- Člen | 146
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
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
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
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
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
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
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)