Selectbox – validace getValue vs getRawValue

- stefi023
- Člen | 71
Ahoj,
resim takovy orisek (mozna na to jen spatne jdu).
Mam formular se selectboxem (ktery ma celkem dost hodnot), ktery je naplnen hodnotami v tovarnicce. Tzn po odeslani formulare se nejprve zase cely naplni, pak probehnou validace, atd.. a az pak onSubmit callback, ve kterem redirectuju – coz me neprijde jako moc rozumne, kdyz vlastne hodnota je predana v POSTU, proc znova nacitat vsechny hodnoty?
Tak me napadlo tyto hodnoty lejt do selectu az nekde jinde v render fazi,
coz sice zafungovalo, ale na druhou stranu po submitu zase metodou
getValue() tuto hodnotu neziskam. I to jsem poresil v mistech kde
getValue() vraci null tak jeste zkusim metodu
getRawValue().
Coz ale neresi stejny problem pri validaci, kde jsou opet volany
getValue().
Je nejaka moznost jak to jednoduse upravit, nebo si mam vytvorit svuj vlastni selectbox, kde tyto metody prepisu? Nebo je to cele blbe (napr z bezpecnostnich duvodu)? A mam ty hodnuty nacitat i po odeslani formulare pred redirectem?
Diky

- Martin
- Člen | 171
Předpokládám, že víš, proč se celý formulář znovu vytváří (kontrola povolených hodnot). Jen tak namátkou – v továrničce jsou již odeslané hodnoty známy při kontrolním vytváření. Co tedy přidat podmínku na odeslání (isSubmitted – bez validace) a povolené hodnoty v takovém případě načítat z databáze pomocí where(…rawValues). Jsem ale opět jen u mobilu, takže to teď nevyzkouším, ani se nepodívám, v jakém pořadí se co kde volá. Třeba se Ti ještě ozve někdo zkušenější.

- stefi023
- Člen | 71
Kontrolu samo chapu.
To je clekem dobry napad…cili jestli jsem to pochopil spravne, bude
nejjednodussi si udelat svuj selectbox, kde prepisu pouze metodu
getValue() – podminku „allowed“ nahradim nejakym
selectem, ktery zjisti, zda ta raw hodnota je real (zjednodusene receno –
takhle by to totiz asi nebyl moc univerzalni selectbox :) )
Editoval stefi023 (17. 5. 2011 14:13)

- Filip Procházka
- Moderator | 4668
Pozor: na takové podmínky musí být formulář připojený pomocí konstruktoru, jinak to nebude fungovat
protected function createComponentMyForm($name)
{
$form = new Nette\Application\UI\Form($this, $name);
$form->addText('neco', 'Něco');
if ($form['neco']->value == 'hodnota') {
// ...
}
// ...
}

- stefi023
- Člen | 71
HosipLan napsal(a):
Pozor: na takové podmínky musí být formulář připojený pomocí konstruktoru, jinak to nebude fungovat
Tak ted jsem nejak nepochopil jak to s tim souvisi :) Kazdopadne formulare obecne vsechny pripojuju v konstruktorech.
Ale to co jsem popisoval by se dalo vjadrit asi takto:
Presenter:
<?php
public function renderDefault() {
//nacte velke mnozstvi hodnot - pomale
$this['testForm']['seznam']->setItems(Test::getSeznam());
}
protected function createComponentTestForm($name) {
$form = new \Nette\Application\AppForm($this, $name);
$form->addMySelect('seznam','Seznam')
->addRule(\Nette\Forms\Form::FILLED);
$form->addSubmit('save');
$form->onSubmit[] = callback($this,'saveForm');
}
public function saveForm($form) {
$form['seznam']->getValue();
}
?>
a MySelectbox prepsana metoda:
<?php
public function getValue()
{
//zjednudusene, jeste musim promyslet skipFirst()
//a asi nejake callbacky na ty checkovaci fce
//kontrola pouze na jednu hodnotu - rychle
$isAllowed = Test::isValueAllowed($this->value);
return is_scalar($this->value) && $isAllowed ? $this->value : NULL;
}
?>

- Martin
- Člen | 171
Já jsem ani tak nemyslel přepisovat getValue, ale mít podmínku přímo v továrně. Tedy vytvářet poprvé se všemi hodnotami z databáze, při kontrolní výrobě jen s některými (sestavit where tak, abys dostal průnik toho, co je v databázi, a toho, co je v getRawValues). Nevím ale, jak jsou escapované rawValues, tak pozor při vytváření toho dotazu. Předpokládám, že Ti jde o výkonnostní optimalizaci, jinak není důvod nenačíst vždy vše. Pokud ale budeš načítat z neindexovaných sloupců, where Ti to může zdržet ještě víc než vytváření pole a plnění selectBoxu. Chce to zkusit, já teď nejsem u počítače.
Editoval Martin (17. 5. 2011 19:29)